nginx相关知识

Posted 不忘初心--学

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nginx相关知识相关的知识,希望对你有一定的参考价值。

 

1.常用来提供静态web服务的软件有以下的几种

APACHE 不是一个软件 是项目基金会

nginx nginx.org

常用来提供静态Web服务的软件有如下三种:

 Apache:这是中小型Web服务的主流,Web服务器中的老大哥。

 Nginx:大型网站Web服务的主流,曾经Web服务器中的初生牛犊,现已长大。

Nginx的分支Tengine(http://tengine.taobao.org/)目前也在飞速发展。

 Lighttpd:这是一个不温不火的优秀Web软件,社区不活跃,静态解析效率很高。在Nginx流行前,它是大并发静态业务的首选,国内百度贴吧、豆瓣等众多网站都有Lighttpd奋斗的身影。

2.常用来提供动态服务的软件

常用来提供动态服务的软件

php(FastCGI):官网:php.net大中小型网站都会使用,动态网页语言PHP程序的解析容器。它可配合Apache解析动态程序,不过,这里的PHP不是FastCGI守护进程模式,而是mod_php5.so(module)。也可配合Nginx解析动态程序,此时的PHP常用FastCGI守护进程模式提供服务。(.php)

 Tomcat:中小企业动态Web服务主流,互联网Java容器主流(如jsp、do)。

 Resin:大型动态Web服务主流,互联网Java容器主流(如jsp、do)。

 IIS(Internet information services):微软windows下的Web服务软件(如asp、aspx)

2.1.nginx网站服务软件介绍

一个开源的,支持高性能、高并发的WWW服务器和代理服务软件(消耗的资源小)

Nginx HTTP服务器的特色及优点

 支持高并发:能支持几万并发连接(特别是静态小文件业务环境)

 资源消耗少:在3万并发连接下,开启10个Nginx线程消耗的内存不到200MB(ab webbench)

 可以做HTTP反向代理及加速缓存、即负载均衡功能,内置对RS节点服务器健康检查功能,这相当于专业的Haproxy软件或LVS的功能。

 具备Squid等专业缓存软件等的缓存功能。

 支持异步网络I/O事件模型epoll(Linux 2.6+)(apache select)

Nginx三大主要功能

三大功能

01提供web服务功能

02提供负载均衡功能

03提供缓存加速功能

3.部署nginx软件(编译安装)

在Linux系统中软件安装方式总结:

01:通过yum 安装一个软件(容易)

02:通过下载rpm包,利用rpm -ivh 软件包

03:解压后直接可以使用的软件,压缩后的软件包也成为二进制包软件

04:编译安装软件(难)

编译安装三部曲

01:配置软件 ./configure xxx

02:编译软件 make

03:编译安装 make install

新的环境安装编译器

已经解决,得执行这个命令yum -y install gcc gcc-c++ autoconf automake make

https://w3techs.com/technologies/overview/web_server/all

3.1部署nginx软件(编译安装)

第一个里程碑:进行nginx软件下载,并对下载后软件压缩包解压

cd /server/tool

wget http://nginx.org/download/nginx-1.12.2.tar.gz

[root@web01 tools]# tar xf nginx-1.12.2.tar.gz

[root@web01 tools]# ll

total 964

drwxr-xr-x 8 1001 1001 4096 Oct 17 21:16 nginx-1.12.2

-rw-r--r-- 1 root root 981687 Oct 17 21:20 nginx-1.12.2.tar.gz

[root@web01 tools]#

第二个里程碑:安装依赖软件

yum install -y pcre-devel openssl-devel

pcre-devel---------兼容perl语言正则表达式依赖包

openssl-devel------可以让web服务器可以部署实现HTTPS访问

说明:如果以上两个软件不进行安装,nginx软件编译安装过程会报错

第三个里程碑:创建虚拟用户

[root@web01 tools]# useradd -s /sbin/nologin -M www

[root@web01 tools]# cd /server/tools/nginx-1.12.2

[root@web01 nginx-1.12.2]#

 

编译第一步曲:进行配置

./configure --prefix=/application/nginx-1.12.2 --user=www --group=www --with-http_ssl_module --with-http_stub_status_module

配置参数说明:

--prefix=PATH set installation prefix

指定软件程序安装的路径信息(如果不进行指定,默认程序安装在/usr/local)

--user=USER set non-privileged user for

worker processes

创建一个虚拟用户,用于管理nginx服务的worker进程

--group=GROUP set non-privileged group for

worker processes

创建一个虚拟用户组,用于管理nginx服务的worker进程

说明:nginx服务在启动时候,会产生两个进程

①. master进程,管理nginx服务运行状态

②. worker进程,真正处理用户访问页面请求的进程

--with-http_ssl_module enable ngx_http_ssl_module

让nginx服务可以支持https访问

--with-http_stub_status_module enable ngx_http_stub_status_module

便于监控软件监视nginx服务运行状态

在/etc/profile下面修改环境变量

export PATH=$PATH:/application/nginx/sbin/

 

https://blog.51cto.com/zpf666/2334770 

全局:

/etc/profile

/etc/bashrc

用户:

~/.bashrc

~/.bash_profile

生效顺序:

/etc/profile-->~/.bash_profile-->~/.bashrc-->/etc/bashrc

 

编译第二步曲:编译(翻译)

说明:编译过程实质是将各种程序语言转换为系统可以识别的二进制信息

make

编译第三步曲:编译安装

make install

第四个里程碑:创建程序目录软链接文件

ln -s /application/nginx-1.12.2/ /application/nginx

 

第五个里程碑:网站服务启动成功

/application/nginx/sbin/nginx

第六个里程碑:检查测试

[root@web01 application]# ps -ef|grep nginx

root 12684 1 0 10:54 ? 00:00:00 nginx: master process /application/nginx/sbin/nginx

www 12685 12684 0 10:54 ? 00:00:00 nginx: worker process

root 12687 9896 0 10:54 pts/0 00:00:00 grep --color=auto nginx

说明:master进程表示nginx主进程,负责nginx服务的启动 停止等操作

worker进程表示真正处理用户请求的进程

 

[root@web01 application]# netstat -lntup|grep nginx

tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 12684/nginx

3.2部署nginx软件可能会遇到的问题

01. 依赖包软件没有安装

pcre-devel openssl-devel

02. 启动Nginx时如下报错“nginx:[emerg]getpwnam(“www”)failed”

解答:这是因为没有对应的Nginx服务用户,执行useradd www -s /sbin/nologin -M创建

Nginx用户即可。

03. 问题3:如何查看Nginx编译时的参数?

解答:可采用如下命令查看:

/application/nginx/sbin/nginx -V

[root@web01 ~]# cd /application/

[root@web01 application]# cd nginx

3.3nginx软件程序目录结构

[root@web01 nginx]# ll

drwxr-xr-x 2 root root 4096 Feb 2 10:41 conf ---配置文件目录

drwxr-xr-x 2 root root 4096 Feb 2 10:41 html ---站点目录

drwxr-xr-x 2 root root 4096 Feb 2 10:54 logs ---日志目录

drwxr-xr-x 2 root root 4096 Feb 2 10:41 sbin ---保存服务命令目录

配置文件目录说明:

mime.types --- 媒体资源类型文件

nginx.conf --- nginx服务主配置文件

精简nginx配置文件信息

grep -Ev "#|^$" nginx.conf.default >nginx.conf

扩展命令说明:

vimdiff  nginx.conf nginx.conf.default --- 比较两个文件之间配置区别

diff

3.4 nginx服务命令参数说明

nginx –s  reload --- -s参数表示一个信号参数,后面可以指定一些信号信息

信号信息:reload stop

nginx -t --- 检查配置文件语法信息

3.5介绍服务配置文件参数信息(默认)

规范一:大括号要成对出现

规范二:每行信息结尾要注意有分号 ;

规范三:相应参数指令只能放置在指定区块

3.6 nginx反向代理

https://www.cnblogs.com/kevingrace/p/6094007.html

 

nginx配置文件区域分类

a main区块

b event区块

c http区块

server区块(可以有多个)

location区块(可以有多个)

proxy_pass反向代理配置

1)替换uri
  常用于页面很固定的时候。比如双十一的大促主页面。
  语法如下:

location /uri {
        proxy_pass http://ip:port/newuri/;        //location的/uri将被替换为/newuri
}

  举例如下:

location /mobi {
        proxy_pass http://172.17.251.66/mobile/;        //将/mobi 的请求跳转到新服务器上/mobile目录下
} 

  在这里,我们需要注意的是,http://ip:port/newuri;,这个地方最后面加不加/意义是不同的。
  如上文,我们就加上了/,则意味着全部替换。
  如果我们不加/,则是将新路径当做其上级目录,访问的是新路径下的原路径。举例如下:

location /mobi {
        proxy_pass http://172.17.251.66/mobile;        //将/mobi 的请求跳转到新服务器上/mobile/mobi目录下
} 

2)转换url
  相当于分流,基于url来分流,把一类的请求发送到一个机器(一个集群)中,具体操作看机器的设置。
  如果location的URI是通过模式匹配定义的,其URI将直接被传递,而不能为其指定转换的另一个URI。
  举例如下:

location ~ ^/mobile {
        proxy_pass http://172.17.251.66;
}

  这段代码的意思是,只要有/mobile的网址,会直接转到http://172.17.251.66/mobile下。
  
3URL重定向
  也就是整个url的重定向。比如两个网站合并或者更换域名时,原先的域名已经不用了,但是有些页面还在访问,就可以通过这种方法来整个重定向,重定向到新的域名中。
  如果在location中使用的URL重定向,那么nginx将使用重定向后的URI处理请求,而不再考虑之前定义的URI。

location /youxi{
        rewrite ^(.*)$ /mobile/$1 break;
        proxy_pass http://172.17.251.66;
}

  这段代码的意思就是,只要你访问的是带/youxi的页面,就会自动重定向到http://172.16.100.1/mobile/$1上。$1指的是^(.*)$中括号内的部分。这样就实现了整个url的重定向。
  在这里,我们也来详细说说ngx_http_rewrite_module模块,这是一个非常好用的模块。

 

3.7 rewrite指令作用

1rewrite 用法
  将用户请求的URI基于regex所描述的模式进行检查,匹配到时将其替换为replacement指定的新的URI。
  其语法是:

  rewrite regex replacement [flag]

  注意:如果在同一级配置块中存在多个rewrite规则,那么会自下而下逐个检查;被某条件规则替换完成后,会重新一轮的替换检查。
  隐含有循环机制,但不超过10次;如果超过,提示500响应码, [flag]所表示的标志位用于控制此循环机制。
  如果replacement是以http://或https://开头,则替换结果会直接以重向返回给客户端。
  下面我们来说一说flag的具体选项:
[flag]

last:重写完成后停止对当前URI在当前location中后续的其它重写操作,而后对新的URI启动新一轮(从第一个开始)重写检查;提前重启新一轮循环。
break:重写完成后停止对当前URI在当前location中后续的其它重写操作,而后直接跳转至重写规则配置块之后的其它配置;结束循环,建议在location中使用。
redirect临时重定向,重写完成后以临时重定向方式直接返回重写后生成的新URI给客户端,由客户端重新发起请求;不能以http://https://开头,使用相对路径,状态码: 302。
permanent:重写完成后以永久重定向方式直接返回重写后生成的新URI给客户端,由客户端重新发起请求,状态码:301。

  由下图我们可以更清楚的看出跳转到的位置:

 

强调说明(*****):当nginx配置文件中,涉及到IP地址信息改动,都需要重启nginx服务,

不能采用平滑重启,否则配置不生效 

 

nginx服务站点目录中内容发生变化,不需要重启nginx服务

测试页面时,多用ctrl+F5强制刷新,可以有效避免缓存问题,缓存出现时,返回的状态码304

3.8 nginx实现负载均衡

nginx负载均衡是ngx_http_upstream_module模块的功能, 需要在配置文件http块上下文中定义upstream块, 指定一组负载均衡的后端服务器, 然后在上面讲到的proxy_pass中引用, 就可以反向代理时实现负载均衡了。
  需要注意的是:ngx_http_upstream段要在server段前面,要定义在http段中。

 

1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。 
upstream backserver { 
server 192.168.0.14; 
server 192.168.0.15; 


2、指定权重
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。 
upstream backserver { 
server 192.168.0.14 weight=8; 
server 192.168.0.15 weight=10; 


3IP绑定 ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。 
upstream backserver { 
ip_hash; 
server 192.168.0.14:88; 
server 192.168.0.15:80; 


4fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。 
upstream backserver { 
server server1; 
server server2; 
fair; 


5url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。 
upstream backserver { 
server squid1:3128; 
server squid2:3128; 
hash $request_uri; 
hash_method crc32; 


在需要使用负载均衡的server中增加 

proxy_pass http://backserver/; 
upstream backserver{ 
ip_hash; 
server 127.0.0.1:9090 down; (down 表示当前的server暂时不参与负载) 
server 127.0.0.1:8080 weight=2; (weight 默认为1.weight越大,负载的权重就越大) 
server 127.0.0.1:6060; 
server 127.0.0.1:7070 backup; (其它所有的非backup机器down或者忙的时候,请求backup机器) 


max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误 
fail_timeout:max_fails次失败后,暂停的时间

3.9 location匹配方法(if匹配)

-eq 等于

-ne 不等于

-le 小于等于

-lt 小于

-ge 大于等于

-gt 大于

Syntax: location [ = | ~ | ~* | ^~ ] uri { ... }

= --- 精确匹配 ①

~ --- 区分大小写匹配 ③

~* --- 不区分大小写匹配(grep -i) ③

^~ --- 优先匹配 ②

/AV/ --- 指定要匹配的目录资源 ③

/ --- 指定匹配站点目录 默认匹配

! --- 表示取反匹配

 

3.63优化nginx

优化涉及部分

1)安全优化

2)性能优化

3)优化用户感受

4)日志进行优化

5)架构层面优化

详细优化实践说明:

server_tokens off;

01). 隐藏nginx版本号信息---安全优化

配置方法:

http

{

......

server_tokens off;

......

}

02). 修改nginx服务名称信息---安全优化

需要修改源码文件

cd /server/tools/nginx-1.12.2

需要修改三个文件:

1)nginx-xx.xx/src/core/nginx.h <-- 定义变量信息(简单函数)

vim src/core/nginx.h

源码文件修改完毕,需要进行nginx软件重新编译安装

通过修改源码,实现修改服务名称和版本号信息时,不要关闭显示版本信息功能

server_tokens on ;

进程数修改,应该参考CPU核数

修改worker进程数量,提供高并发访问---性能优化

03. 修改worker进程数量,提供高并发访问---性能优化

vim nginx.conf

worker_processes 4; --- 修改调整后,会显示多个worker进程信息

ps -ef|grep nginx

root 39818 1 0 09:34 ? 00:00:00 nginx: master process nginx

www 40342 39818 0 10:02 ? 00:00:00 nginx: worker process

www 40343 39818 0 10:02 ? 00:00:00 nginx: worker process

www 40344 39818 0 10:02 ? 00:00:00 nginx: worker process

www 40345 39818 0 10:02 ? 00:00:00 nginx: worker process

root 40347 36726 0 10:02 pts/1 00:00:00 grep --color=auto nginx

进程数修改,应该参考CPU核数

进程数=CPU核数 进程数=CPU核数*2

如何了解服务器CPU核数:

1)通过内核文件获得(/proc/cpuinfo)

grep processor /proc/cpuinfo|wc -l

grep -c processor /proc/cpuinfo

获取CPU颗数

grep "physical id" /proc/cpuinfo|sort|uniq|wc -l

2)通过命令获得(top)

执行top命令-按1获得

3)通过命令获得(lscpu)

lscpu

CPU(s): 4

实现worker进程用普通用户管理

04. 实现worker进程用普通用户管理

第一种方式:设定worker进程管理用户

采用编译安装过程指定

nginx -V

--user=www --group=www

第二种方式:编写配置文件设定worker进程管理用户

useradd nginx -M -s /sbin/nologin --- 临时创建一个worker进程管理用户

vim /application/nginx/conf/nginx.conf

1: user nginx nginx;

Nginx事件处理模型优化

05. Nginx事件处理模型优化

epoll:网络异步IO模型

在Linux下,Nginx使用epoll的I/O多路复用模型,

在Freebsd中使用kqueue的I/O多路复用模型,

在Solaris中使用/dev/poll方式的I/O多路复用模型,

在Windows中使用的是icop

编辑配置方法:

events {

worker_connections 1024;

use epoll;

}

调整nginx单个进行允许的客户端最大连接数

nginx程序允许的并发连接数=worker进程数*单个worker进程并发连接数<系统最大打开文件

events {

worker_connections 4096;

}

[root@web02 conf]# cat nginx.conf

user nginx nginx;

worker_processes 2;

error_log logs/error_oldboy.log error;

events {

worker_connections 2048;

use epoll;

最大连接数查询

[root@web02 conf]# ulimit -a

core file size (blocks, -c) 0

data seg size (kbytes, -d) unlimited

scheduling priority (-e) 0

file size (blocks, -f) unlimited

pending signals (-i) 1784

max locked memory (kbytes, -l) 64

max memory size (kbytes, -m) unlimited

open files (-n) 65535

pipe size (512 bytes, -p) 8

POSIX message queues (bytes, -q) 819200

real-time priority (-r) 0

stack size (kbytes, -s) 10240

cpu time (seconds, -t) unlimited

max user processes (-u) 1784

virtual memory (kbytes, -v) unlimited

file locks (-x) unlimited

[root@web02 conf]#

设定nginx程序最大只能使用多个文件数

worker_rlimit_nofile 2048;

#<==最大打开文件数,可设置为系统优化后的ulimit -HSn的结果,在第3章中,调整系统文件描述符

和这个问题有相同之处

优化服务器域名的散列表大小

server_names_hash_max_size 512;

server_names_hash_bucket_size 1;

开启高效文件传输模式

开启高效传输数据模式

sendfile on;

实现高效传输方式:

tcp_nopush on;

说明:尽可能填满一个数据包,再进行发送给客户端,有效节省IO损耗

tcp_nodelay on;

说明:尽可能快的传输数据包信息传给客户端,特别是在数据字节占用少的情况用到。

强调:两个指令参数不要同时使用。

[root@web02 conf]# cat nginx.conf

user nginx nginx;

worker_processes 2;

error_log logs/error_oldboy.log error;

events {

worker_connections 2048;

use epoll;

}

http {

include mime.types;

default_type application/octet-stream;

sendfile on;

tcp_nopush off;

tcp_nodelay on;

优化nginx服务超时信息

优化nginx服务超时信息

keepalive_timeout 30;

当客户端与服务端,指定时间内双方都没有数据传输了,就释放断开连接

client_header_timeout 15s

设定读取请求头时间

 

client_body_timeout 15s

设定服务端读取请求报文主体内容间隔时间

send_timeout 15s;

设定服务端响应数据包的间隔时间

keepalive_timeout 65;

client_header_timeout 15;

client_body_timeout 15;

send_timeout 15;

上传文件大小的限制

syntax:client_max_body_size size; #<==参数语法

default:client_max_body_size 1m; #<==默认值是1m

context:http,server,location #<==可以放置的标签段

 

server {

client_max_body_size 1m;

}

fastcgi优化配置

12. fastcgi优化配置

http {

fastcgi_connect_timeout 240;

fastcgi_send_timeout 240;

fastcgi_read_timeout 240;

fastcgi_buffer_size 64k;

fastcgi_buffers 4 64k;

fastcgi_busy_buffers_size 128k;

fastcgi_temp_file_write_size 128k;

fastcgi_cache_path /data/ngx_fcgi_cache levels=2:2 keys_zone=ngx_fcgi_cache:512m inactive=1d max_size=40g;

server {

fastcgi_cache ngx_fcgi_cache;

fastcgi_cache_valid 200 302 1h;

fastcgi_cache_valid 301 1d;

fastcgi_cache_valid any 1m;

fastcgi_cache_min_uses 1;

fastcgi_cache_use_stale error timeout invalid_header http_500;

fastcgi_cache_key http://$host$request_uri;

}

}

配置Nginx gzip压缩实现性能优化

http {

gzip on;

gzip_min_length 1k;

gzip_buffers 4 16k;

gzip_http_version 1.1;

gzip_comp_level 2;

gzip_types text/css text/xml application/javascripts;

gzip_vary on;

}

 

需要和不需要压缩的对象

? 纯文本内容压缩比很高,因此,纯文本的内容最好进行压缩,例如:html、js、css、xml、shtml等格式的文件。

? 被压缩的纯文本文件必须要大于1KB,由于压缩算法的特殊原因,极小的文件压缩后可能反而变大。

? 图片、视频(流媒体)等文件尽量不要压缩,因为这些文件大多都是经过压缩的,如果再压缩很可能不会减小或减小很少,或者有可能增大,同时压缩时还会消耗大量的CPU、内存资源。

配置Nginx expires缓存实现性能优化

配置Nginx expires缓存实现性能优化

Nginx expires功能介绍

简单地说,Nginx expires的功能就是为用户访问的网站内容设定一个过期时间,

当用户第一次访问这些内容时,会把这些内容存储在用户浏览器本地,

这样用户第二次及以后继续访问该网站时,

浏览器会检查加载已经缓存在用户浏览器本地的内容,

就不会去服务器下载了,直到缓存的内容过期或被清除为止。

 

location ~ .*\\.(js|css)$

{

expires 30d;

}

控制访问权限

deny 10.0.0.0/24;

allow 10.0.0.1;

deny all;

配置Nginx,禁止非法域名解析访问企业网站

主配置文件里面

说明:以下两种方法放置在所有server区块的最上面

17. 配置Nginx,禁止非法域名解析访问企业网站

方法1:

server {

listen 80;

server_name -;

return 501;

}

 

方法2:通过301跳转到主页,命令如下:

server {

listen 80 default_server;

server_name _;

rewrite ^(.*) http://blog.etiantian.org/$1 permanent;

}

说明:将以上两种方法server区块放置在所有server区块最上面

Nginx图片及目录防盗链解决方案

模拟实现盗链过程:

01. 配置盗链网站信息

第一个里程:编写盗链网站配置文件

server {

listen 80;

server_name www.daolian.org;

root html/daolian;

index index.html index.htm;

}

 

 

location ~ .*\\.(jpg|gif|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ {

valid_referers none blocked *.etiantian.org etiantian.org;

if ($invalid_referer) {

rewrite ^/ http://www.etiantian.org/nolink.png;

}

}

 

第一行:定义了当访问资源为gif/jpg/png/bmp文件

第二行:valid_referers这个关键字定义了白名单

第三行:invalid_referer是内置变量,通过判断上一行中的valid_referers值会返回0或者1,

            none代表请求头中没有referer信息,这一般是直接在浏览器输入图片网址

            blocked代表被防火墙过滤标记过的请求

第四行:如果访问来源不在白名单内,则返回403错误

第五行:可以通过设定指定的图片来代替目标图片

 

Nginx错误页面的优雅显示

19 Nginx错误页面的优雅显示

范例1:对错误代码403实行本地页面跳转,命令如下:

##www

server {

listen 80;

server_name www.etiantian.org;

location / {

root html/www;

index index.html index.htm;

}

error_page 404 /error.jpg; #<==当出现404错误时,会跳转到出现error.jpg页面

}

范例2:50x页面放到本地单独目录下,进行优雅显示。

# redirect server error pages to the static page /50x.html

error_page 500 502 503 504 /50x.html;

location = /50x.html {

root /data0/www/html;

}

范例3:改变状态码为新的状态码,并显示指定的文件内容,命令如下:

error_page 404 =200 /empty.gif;

server {

listen 80;

server_name www.linuxpeixun.com;

location / {

root /data0/www/bbs;

index index.html index.htm;

fastcgi_intercept_errors on;

error_page 404 =200 /ta.jpg;

access_log /app/logs/bbs_access.log commonlog;

}

}

 

范例4:错误状态码URL重定向,命令如下:

server {

listen 80;

server_name www.oldboyedu.com;

location / {

root html/www;

index index.html index.htm;

error_page 404 http://oldboy.blog.51cto.com;

#<==当出现404错误时,会跳转到指定的URL http://oldboy.blog.51cto.com页面显示给用户,

这个URL一般是企业另外的可用地址

access_log /app/logs/bbs_access.log commonlog;

}

}

阿里门户网站天猫的Nginx优雅显示配置案例如下:

error_page 500 501 502 503 504 http://err.tmall.com/error2.html;

error_page 400 403 404 405 408 410 411 412 413 414 415 http://err.tmall.com/error1.html;

 

配置被盗链网站信息

在站点目录下,生成要被盗链的图片信息

[root@web01 www]# ll oldboy.jpg

-rw-r--r-- 1 root root 71806 3月 9 16:27 oldboy.jpg

防盗链方法说明:

1) 根据HTTP referer实现防盗链

location ~ .*\\.(png|jpg|gif|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ {

valid_referers none blocked *.etiantian.org etiantian.org;

if ($invalid_referer){

rewrite ^/ http://www.etiantian.org/nolink.png;

}

}

location ~* ^.+\\.(gif|jpg|png|swf|flv|rar|zip)$ {

valid_referers none blocked server_names *.etiantian.org etiantian.org;

if ($invalid_referer){

rewrite ^/ http://bbs.etiantian.com/img/nolink.jpg;

}

access_log off;

root html/www;

expires 1d;

break;

}

}

说明:将盗链提示图片缓存到用户本地

 

 

2) 根据cookie防盗链

3) 通过加密变换访问路径实现防盗链

nginx模块 ngx_http_accesskey_module

 

Nginx防爬虫优化

https://www.baidu.com/robots.txt

1. robots.txt机器人协议介绍(君子协议)

2. 利用user_agent参数信息进行防爬虫

范例1:阻止下载协议代理,命令如下:

if ($http_user_agent ~* LWP::Simple|BBBike|wget)

{

return 403;

}

 

if ($http_user_agent ~* "qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Yahoo!Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|MSNBot")

{

return 403;

}

 

4.日志信息详解

nginx支持7层4层ios模型

4.1错误日志

Syntax: error_log file [level];

Default:

error_log logs/error.log error;

Context: main(少), http, mail, stream, server, location 错误日志级别

#error_log logs/error.log;

#error_log logs/error.log notice;

#error_log logs/error.log info;

vim nginx.conf

error_log /tmp/error.log error;

补充说明:

错误日志的,默认情况下不指定也没有关系,因为nginx很少有错误日志记录的。

但有时出现问题时,是有必要记录一下错误日志的,方便我们排查问题。

error_log 级别分为 debug, info, notice, warn, error, crit 默认为crit

该级别在日志名后边定义格式如下:

error_log /your/path/error.log crit;

crit 记录的日志最少,而debug记录的日志最多。

如果nginx遇到一些问题,比如502比较频繁出现,但是看默认的error_log并没有看到有意义的信息,

那么就可以调一下错误日志的级别,当你调成error级别时,错误日志记录的内容会更加丰富

4.2访问日志

  log_format  www  \'$remote_addr - $remote_user [$time_local] \'

 

                    \' $upstream_response_time $http_host $request\'

 

                    \'"$status" $body_bytes_sent "$http_accept_language" \'

 

                    \' "$http_user_agent" \';

 

 

 

 

$remote_addr:远程客户端的IP地址
-:空白,用一个“-”占位符替代.

 $remote_user:远程客户端用户名称,用于记录浏览者进行身份验证时提供的名字,如登录百度的用户名scq2099yt,如果没有登录就是空白。

[$time_local]:访问的时间与时区,比如18/Jul/2012:17:00:01 +0800,时间信息最后的"+0800"表示服务器所处时区位于UTC之后的8小时

$upstream_response_time 请求过程中,upstream的响应时间

$http_host  请求地址,即浏览器中你输入的地址(IP或域名)

$request:请求的URI和HTTP协议,这是整个PV日志记录中最有用的信息,记录服务器收到一个什么样的请求

$status:记录请求返回的http状态码,比如成功是200。

$body_bytes_sent "  发送给客户端的文件主体内容的大小,比如899,可以将日志每条记录中的这个值累加起来以粗略估计服务器吞吐量

$http_user_agent" \' 客户端浏览器信息

$http_referer:记录从哪个页面链接访问过来的。

100.116.208.96 - - [09/Apr/2020:15:29:01 +0800]  0.085 www.lezhibo.com POST /mobile/activity/doCaptchaAuth HTTP/1.1"200" 58 "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7"  "Mozilla/5.0 (Linux; android 10; WLZ-AN00 Build/HUAWEIWLZ-AN00; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/78.0.3904.62 XWEB/2259 MMWEBSDK/200301 Mobile Safari/537.36 MMWEBID/4280 MicroMessenger/7.0.13.1640(0x27000D37) Process/tools NetType/4G Language/zh_CN ABI/arm64 WeChat/arm64"

4.3日志要进行切割

1)错误日志(错误日志级别 最严重级别记录日志内容少 调试级别记录日志最多)

2)访问日志(需要每一个日志信息都要了解)

3)如何进行日志的切割

第一种方式:通过编写脚本实现日志切割

 

第二种方式:通过系统服务进行日志切割

logrotate配置文件说明

# rotate log files weekly

weekly --- 切割周期

# keep 4 weeks worth of backlogs

rotate 4 --- 切割后的文件保存多少份

# use date as a suffix of the rotated file

dateext --- 切割后文件按照日期备份显示

 

curl 命令参数总结:

curl 命令参数总结:

1. -I 只显示响应报文起始行和响应头部信息,不会显示响应主体内容

2. -v 显示请求报文和响应报文详细内容

3. -L 追踪http访问跳转过程

4. -s 将错误信息追加到空

5. -w 指定显示响应报文中的哪些

-w "%{http_code}" 只显示响应报文中的状态码信息

6. -o 表示将没有指定的响应报文信息追加到空

7. -u 表示指定认证用户名称或者用户密码信息

8: -H host: --- 修改请求报文host字段信息

5.生产场景常见的状态码及其对应的作用

状态代码 详细描述说明。

200- OK4 服务器成功返回网页,这是成功的HTTP请求返回的标准状态码。

301- 永久性跳转

302-临时跳转,所请求的网页将永久跳转到被设定的新位置, 例如: 从www.lezhibo.com跳转到http://tv.lezhibo.com/

403- Forbiddeno 禁止访问,虽然这个请求是合法的,但是服务器端因为匹配了预先设置的规则而拒绝响应客户端的请求,此类问题一般为服务器或服务权限配置不当所致。 客户端访问被禁止了;网站访问的首页不存在了

Nginx 403 forbidden 多种原因及故障模拟重现4http://0ldboy.blog.51cto.com/2561410/1633952apache 服务Forbidden 403 问题精彩总结+

http://0ldboy.bloq.51cto.com/2561410/581383

404- Not Foundo. 服务器找不到客户端请求的指定页面,可能是客户端请求了服务器上不存

在的资源所致。+

500- Internal Server Errore 内部服务器错误,服务器遇到了意料不到的情况,不能完成客户的请求。 这是一个较为笼统的报错,一般为服务器的设置或内部程序问题导致。+例如:SELinux 开启,而又没有为HTTP 设置规则许可,客户端访问就是5002

502- Bad Gateway (重点) 坏的网关,一般是代理服务器请求后端服务时,后端服务不可用或没有完成响应网关服务器。这通常为反向代理服务器下面的节点出问题所致。4反向代理服务器无法与后面的web服务节点服务器建立联系。

503- Service Unavailablee 服务当前不可用,可能是服务器超载或停机维护导致的,或者是反向代理 服务器后面没有可以提供服务的节点

504- Gateway Timeoute 网关超时,一般是网关代理服务器请求后端服务时,后端服务没有在特定 的时间内完成处理请求。多数是服务器过载导致没有在指定的时间内返回数据给前端代理服务器。

 

以上是关于nginx相关知识的主要内容,如果未能解决你的问题,请参考以下文章

nginx相关知识

Nginx——Nginx启动报错Job for nginx.service failed because the control process exited with error code(代码片段

使用Nginx+uwsgi在亚马逊云服务器上部署python+django项目完整版——部署配置及相关知识

android小知识点代码片段

网络相关知识点:nginx相关概念

Nginx基本知识