Nginx 和 Tomcat 静态页面访问速度

nginx 是所有 web 服务中处理静态资源速度最快的
配置 Nginx 页面
#配置nginx
[root@web01 ~]# vim /etc/nginx/conf.d/ab.linux.com.conf
server {
    listen 80;
    server_name ab.linux.com;

    location / {
        root /code/ab;
        try_files $uri $uri/ @tomcat;
        index index.html;
    }

    location @tomcat {
        proxy_pass http://172.16.1.31:8080;
    }       
}

#给nginx配置一个静态页面
mkdir -p /code/ab
echo nginx_linux > /code/ab/index.html
chown -R www.www /code

#重启 Nginx
[root@web01 ~]# systemctl restart nginx

#添加解析
C:\Windows\System32\drivers\etc\hosts
10.0.0.31 ab.linux.com

#访问
ab.linux.com = ab.linux.com/index.html
	#显示结果
nginx_linux
配置 Tomcat 页面
#给 Tomcat 配置一个静态页面
echo tomcat_linux > /usr/local/tomcat/webapps/ROOT/tomcat.html
#重启 Tomcat
[root@web01 ~]# systemctl restart tomcat
#访问
ab.linux.com/tomcat.html
	#显示结果
nginx_linux
使用 ab 压测
	#安装 ab 压测工具
yum -y install httpd-tools

	#使用ab命令
ab 选项

-n	在测试会话中所执行的请求个数。默认时,仅执行一个请求。请求的总数量
-c	一次产生的请求个数。默认是一次一个。请求的用户量
-t	测试所进行的最大秒数。其内部隐含值是-n 50000,它可以使对服务器的测试限制在一个固定的总时间以内。默认时,没有时间限制。

	#注意:压测域名一定要加 / 或 URI 结尾【测试的网址一定要做好解析】
	#压测结果含义
Server Software:		#服务的软件版本
Server Hostname:		#域名或IP
Server Port:			#服务端口
Document Path:			#被请求的静态资源文件路径
Document Length:		#被请求的静态资源文件大小
Concurrency Level:      #并发数
Time taken for tests:   #完成时间
Complete requests:      #请求数
Failed requests:        #失败的请求
Write errors:           #写入错误的请求
Total transferred:      #1W次请求的总字节数
HTML transferred:       #去掉请求头剩下下的字节数
Requests per second:    #每秒能请求的次数
Time per request:       #浏览器等待每次请求的时间
Time per request:       #服务器处理每次请求平均耗时【单位:毫秒】
Transfer rate:          #每秒能处理的请求数据大小

	#压测工具测试 Nginx 处理静态资源
[root@web01 ~]# ab -n 10000 -c 200 http://ab.linux.com/
Server Software:        nginx/1.18.0
Server Hostname:        ab.linux.com
Server Port:            80

Document Path:          /
Document Length:        12 bytes

Concurrency Level:      200
Time taken for tests:   0.836 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      2420000 bytes
HTML transferred:       120000 bytes
Requests per second:    11961.61 [#/sec] (mean)
Time per request:       16.720 [ms] (mean)
Time per request:       0.084 [ms] (mean, across all concurrent requests)
Transfer rate:          2826.86 [Kbytes/sec] received

	#停止 Nginx 后再测 Tomcat 减少跳转,对比结果更真实【其实停不停差别不大】
systemctl stop nginx
	#压测工具测试 Tomcat 处理静态资源
[root@web01 ~]# ab -n 10000 -c 200 http://ab.linux.com:8080/tomcat.html
Server Software:        
Server Hostname:        ab.linux.com
Server Port:            8080

Document Path:          /tomcat.html
Document Length:        13 bytes

Concurrency Level:      200
Time taken for tests:   2.131 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      2270000 bytes
HTML transferred:       130000 bytes
Requests per second:    4693.11 [#/sec] (mean)
Time per request:       42.616 [ms] (mean)
Time per request:       0.213 [ms] (mean, across all concurrent requests)
Transfer rate:          1040.37 [Kbytes/sec] received

Concurrency Level:   并发级别:
Time taken for tests:测试所需时间:
Complete requests:   完成请求:
Failed requests:     失败的请求:
Write errors:        写入错误:
Total transferred:   传输数据总量:
HTML transferred:    HTML已传输的数据量:
Requests per second: 每秒请求数: 
Time per request:    每次请求的时间: 
Time per request:    每次请求的时间: 
Transfer rate:       传输速率:

Http、server、location

包含文件Include

一台服务器配置多个网站,如果配置都写在nginx.conf主配置文件中,会导致nginx.conf主配置文件变得非常庞大而且可读性非常的差。那么后期的维护就变得麻烦。 

假设现在希望快速的关闭一个站点,该怎么办? 
1.如果是写在nginx.conf中,则需要手动注释,比较麻烦 
2.如果是include的方式,那么仅需修改配置文件的扩展名,即可完成注释 Include包含的作用是为了简化主配置文件,便于可读。

inlcude /etc/nginx/online/*.conf #线上使用的配置

/etc/nginx/offline #保留配置,不启用(下次使用在移动到online中)

模块语法

# 可以在下面网站中找到 nginx 每种模块的写法
http://nginx.org/en/docs 页面向下找到 Modules reference 下面就是

使用方法	Syntax: 
默认状态	Default:
写在哪里	Context:
1、目录索引模块
语法
ngx_http_autoindex_module

Syntax:	autoindex on | off;
Default:autoindex off;
Context:http, server, location
范例
#设置站点目录
mkdir -p /code/web01
cp /etc/services /code/web01/a
echo '地球是个美丽的世界' > /code/web01/地球很美丽.txt
chown -R www.www /code

#设置站点配置文件
vim /etc/nginx/conf.d/web01.conf
server {
    listen 80;
    server_name www.web01.com;

	#单独设置日志文件,方面查看
    access_log /var/log/nginx/www.web01.com.log main;
    #如果不设置中文字符集,网页上的中文就会出现乱码
    charset 'utf-8,gbk';
    
    location / {
        root /code/web01;
        #开启目录模块【还要去除/code/web01/index.html文件】
        autoindex on;
        #显示具体大小   off 单位是 K\M\G   on 单位是比特 bytes
        autoindex_exact_size off;
        #显示文件最后修改的准确时间  如果是 off 需要加 8小时,是西区时间
        autoindex_localtime on;
        }
}

# Windows 解析
C:\Windows\System32\drivers\etc\hosts
10.0.0.31 www.web01.com
# 访问web页面查看
www.web01.com
# 网页显示结果如下:
Index of /
-------------------------------
../
a                                                  08-Jul-2020 17:36    655K
地球很美丽.txt                                08-Jul-2020 17:00      28
-------------------------------
2、访问控制模块
语法
ngx_http_access_module

#允许访问语法
Syntax:	allow address | CIDR | unix: | all;
Default:	—
Context:	http, server, location, limit_except

#拒绝访问语法
Syntax:	deny address | CIDR | unix: | all;
Default:	—
Context:	http, server, location, limit_except
范例
#适用场景:公司内部网段访问后台,或在家连接公司VPN后再访问后台。其他所有网络地址请求都会被拒绝访问

#设置站点目录
mkdir -p /code/web02
echo 'web02' > /code/web02/index.html
chown -R www.www /code

#设置站点配置文件
vim /etc/nginx/conf.d/web02.conf
server {
    listen 80;
    server_name www.web02.com;

    access_log /var/log/nginx/www.web01.com.log main;
    charset 'utf-8,gbk';

    location / {
        root /code/web02;
        index index.html;
        #允许来自10.0.0网段的主机访问我的/web目录
        allow 10.0.0.0/24;
        #拒绝所有来自10.0.0以外的网段的主机访问我的/web目录
        deny all;

#上面是先允许后拒绝,下面是先拒绝后允许,可以设置只允许,也可以设置只拒绝
#允许与拒绝的目标可以是 10.0.0.0/24 或者 10.0.0.1
        
        #拒绝来自10.0.0网段的主机访问我的/web目录
        #deny 10.0.0.0/24;
        #允许所有来自10.0.0以外的网段的主机访问我的/web目录
        #allow all;
        }
}

# Windows 解析
C:\Windows\System32\drivers\etc\hosts
10.0.0.31 www.web02.com
# 访问web页面查看
www.web02.com
3、访问认证模块
语法
ngx_http_auth_basic_module

#开启认证,注释必须写(内容随意,谷歌浏览器不可以看见,360浏览器兼容模式才看的见)
Syntax:	auth_basic string | off;
Default:	auth_basic off; 或者 auth_basic 123;
Context:	http, server, location, limit_except

#指定认证的文件(包含)
Syntax:	auth_basic_user_file file;
Default:	—
Context:	http, server, location, limit_except
范例
#适用场景:访问的时候需要输入账号密码

#先创建用户名和密码
[root@web01 ~]# htpasswd -c /etc/nginx/conf.d/auth_basic mcy
New password: 
Re-type new password: 
Adding password for user mcy
#也可以这样设置abc账户的密码为321【这种方式容易被别人看到】
[root@web01 ~]# htpasswd -cb /etc/nginx/conf.d/auth_basic abc 321
Adding password for user abc
#可以设置多个用户,但一个页面只能使用一个用户
htpasswd -cb /etc/nginx/conf.d/m1 test01 1
htpasswd -cb /etc/nginx/conf.d/m2 test02 2


#设置站点目录
mkdir -p /code/web03
echo 'web03' > /code/web03/index.html
chown -R www.www /code

#设置站点配置文件
vim /etc/nginx/conf.d/web03.conf 
server {
    listen 80;
    server_name www.web03.com;

    access_log /var/log/nginx/www.web03.com.log main;
    charset 'utf-8,gbk';
    
    location / {
        root /code/web03;
        index index.html;
        #开启认证,注释告知来访者'不允许非法用户访问'【注释必须写,但是可以随便写】
        auth_basic "Do not allow illegal user access!";
        #指定认证的文件是 auth_basic 这个文件,只能用最后一次设置的用户密码
        auth_basic_user_file /etc/nginx/conf.d/auth_basic;
        }
}

# Windows 解析
C:\Windows\System32\drivers\etc\hosts
10.0.0.31 www.web03.com
# 访问web页面查看
www.web03.com
4、状态模块
语法
ngx_http_stub_status_module

Syntax:	stub_status;
Default:	—
Context:	server, location
范例
#设置站点配置文件
vim /etc/nginx/conf.d/web04.conf
server {
    listen 80;
    server_name www.web04.com;

    access_log /var/log/nginx/www.web04.com.log main;
    charset 'utf-8';

    #增加一个 location 访问的 uri【/mcy 这个目录在系统中可以不存在】
    location /mcy {
    	#设置可以看连接数量统计的页面
    	stub_status;
    }
}

# Windows 解析
C:\Windows\System32\drivers\etc\hosts
10.0.0.31 www.web04.com
# 访问web页面查看
www.web03.com/mcy
Nginx 7种状态
#访问 http://www.web01.com/mcy 页面如下
------------------------------------------------------------
Active connections: 2 
server accepts handled requests
         4 			4 		   8 
Reading: 0 Writing: 1 Waiting: 1 
------------------------------------------------------------
Active connections		# 活跃的连接数
accepts					# 当前的总连接数TCP
handled					# 成功的TCP连接数
requests				# 总的http请求数

Reading					# 读取请求头部
Writing					# 返回给客户端的头部
Waiting					# 等待的请求数,开启了 keepalive 【主配置文件中配置了 keepalive_timeout  65;】

# 注意, 一次TCP的连接,可以发起多次http的请求, 如下参数可配置进行验证
keepalive_timeout  0;   # 类似于关闭长连接
keepalive_timeout  65;  # 65秒没有活动则断开连接
------------------------------------------------------------
收集请求数
#建议用方法3,安全且不用编辑新配置文件

# 方法1:上面的设置,再访问 http://www.web01.com/mcy 页面获取,大家都可以看到

# 方法2:在上面设置的基础上修改
vim /etc/nginx/conf.d/web04.conf
server {
    listen 80;
    server_name 127.0.0.1;

    access_log /var/log/nginx/www.web04.com.log main;
    charset 'utf-8';

    #增加一个location访问url【/mcy 这个目录在系统中可以不存在】
    location /mcy {
        #设置可以看连接数量统计的页面
        stub_status;
    }
}

# 命令行获取每天的总请求数:
curl -s 127.0.0.1/mcy | awk 'NR==3{print $3}'

# 方法3:任意找一个 Nginx 配置文件,限制只允许本机查看
vim /etc/nginx/conf.d/web01.conf
server {
    listen 80;
    server_name www.web01.com;
    
    location / {
        root /code/web01;
        autoindex on;
    }
    
    location /mcy {
    	stub_status;
    	allow 127.0.0.1;
    	deny all;
    }
}

# 命令行获取每天的总请求数:
curl -s 127.0.0.1/mcy | awk 'NR==3{print $3}'
# 可以将收集的数据存入文件,发送给一台收集信息的主机
5、连接限制模块
语法
ngx_http_limit_conn_module

#限制同一时间连接的IP数量和IP占用内存空间大小

#设置限制的内存空间/条件
	     #  调用模块      空间里面存的内容   空间=空间名字:空间大小
Syntax:     limit_conn_zone    key          zone=name:size;
Default: —
Context: http

#调用上面的内存空间
Syntax:	limit_conn zone number;
Default:	—
Context:	http, server, location
范例
#配置在负载均衡,感觉生产中不会限制,因为希望来访用户越多越好

#设置主配置文件
vim /etc/nginx/nginx.conf 

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;
    
    #调用限制内存空间模块 来访IP	  空间=空间名字:空间大小【只能用m做单位】
    limit_conn_zone $remote_addr zone=accessip:10m;
    #调用上面空间名字【可以随意起名,但是上下要统一】,限制每次只允许1个IP访问
    limit_conn accessip 1;

    include /etc/nginx/conf.d/*.conf;
}

#测试方法
web01 配置好连接限制
web02 web03 同一时间进行访问
6、限制请求模块
语法
ngx_http_stub_status_module

#设置限制的内存空间/条件
		#使用模块		  空间保存内容  空间=空间名字:大小 速率=1r/s
Syntax:  limit_req_zone 	key 	zone=name:size rate=rate;
Default: —
Context: http

#调用上面的模块
Syntax:    limit_req zone number [burst=number] [nodelay];
Default: —
Context: http, server, location
范例
#在做限制的时候,要先查看自己的网页正常情况下请求的数量,不然网页显示不全

#设置站点目录
mkdir -p /code/web06
echo 'web06' > /code/web06/index.html
chown -R www.www /code

#配置请求限制模块
vim /etc/nginx/nginx.conf
...略...
http {
...略...
	#配置限制请求模块 来访ip		 空间=空间名称:空间大小10M 每秒只接受1个请求
	limit_req_zone $remote_addr zone=req_zone:10m rate=1r/s;
...略...
}

#设置站点配置文件
vim /etc/nginx/conf.d/web06.conf
server {
    listen 80;
    server_name www.web06.com;

    access_log /var/log/nginx/www.web06.com.log main;
    charset 'utf-8,gbk';

    
    location / {
        root /code/web06;
        index index.html;
        
        #方法1:每秒只接受每个连接的1个请求
        #调用限制请求模块,空间名称
    	limit_req zone=req_zone;
    	
    	#方法2:【延时请求】每秒接受每个连接的1个请求之后再接受5个请求
		#调用限制请求模块,空间名称  每秒接受6个请求,nodelay表示5个延时请求之后全部拒绝,如果不加 nodelay 就不限制了
		#limit_req zone=req_zone burst=5 nodelay;
        }
}

# Windows 解析
C:\Windows\System32\drivers\etc\hosts
10.0.0.31 www.web06.com
# 访问web页面查看,按住F5不放,快速刷新页面就会发现,有时会弹出 503
www.web06.com
验证请求限制
#在 /etc/hosts 里面做好域名解析
echo '172.16.1.31 www.web06.com' >> /etc/hosts

#安装 ab 压测工具
yum -y install httpd-tools

	#使用ab命令
ab 选项

-n	在测试会话中所执行的请求个数。默认时,仅执行一个请求。请求的总数量
-c	一次产生的请求个数。默认是一次一个。请求的用户量
-t	测试所进行的最大秒数。其内部隐含值是-n 50000,它可以使对服务器的测试限制在一个固定的总时间以内。默认时,没有时间限制。

	#注意:压测域名一定要加 / 或 URI 结尾【测试的网址一定要做好解析】
	#压测结果含义
Server Software:		#服务的软件版本
Server Hostname:		#域名或IP
Server Port:			#服务端口
Document Path:			#被请求的静态资源文件路径
Document Length:		#被请求的静态资源文件大小
Concurrency Level:      #并发数
Time taken for tests:   #完成时间
Complete requests:      #请求数
Failed requests:        #失败的请求
Write errors:           #写入错误的请求
Total transferred:      #1W次请求的总字节数
HTML transferred:       #去掉请求头剩下下的字节数
Requests per second:    #每秒能请求的次数
Time per request:       #浏览器等待每次请求的时间
Time per request:       #服务器处理每次请求平均耗时【单位:毫秒】
Transfer rate:          #每秒能处理的请求数据大小

#每秒只接受1个请求
[root@web01 conf.d]# ab -n 20 -c 2 http://www.web06.com/
Server Software:        nginx/1.16.1
Server Hostname:        www.mario.com
Server Port:            80
Document Path:          /download/
Document Length:        179 bytes
Concurrency Level:      2
Time taken for tests:   0.002 seconds
Complete requests:      20
Failed requests:        19
   (Connect: 0, Receive: 0, Length: 19, Exceptions: 0)
   
#配置5个延时请求之后
[root@web01 code]# ab -n 20 -c 2 http://www.web06.com/
Server Software:        nginx/1.16.1
Server Hostname:        www.mario.com
Server Port:            80
Document Path:          /download/
Document Length:        179 bytes
Concurrency Level:      2
Time taken for tests:   0.002 seconds
Complete requests:      20
Failed requests:        14
   (Connect: 0, Receive: 0, Length: 14, Exceptions: 0)
7、上传文件大小
语法
Syntax:  client_max_body_size size;
Default: client_max_body_size 1m;
Context: http, server, location
范例
#也可以放入http层,全局生效,根据需要放入server或location层也可以限制不同页面的上传大小
server {
    listen 80;
    server_name _;
    client_max_body_size 200m;
}

Server 层

隐藏规则 default_server

# 前面我们在 nginx 的主配置文件中的 http 层有配置
include /etc/nginx/conf.d/*.conf
# 上面这条配置包含了所有 server 层的配置文件

# 先配2个 server 层配置文件
/etc/nginx/conf.d/a.conf
server {
	listen 80;
	server_name _;
    root /data/code;
    index 1.html;	
}

/etc/nginx/conf.d/b.conf
server {
	listen 80;
	server_name _;
    root /data/code;
    index 2.html;
}

# 写2个对应的页面文件
echo 1 > /data/code/1.html
echo 2 > /data/code/2.html

# 检查没有错误后重启 nginx 服务
nginx -t
systemctl restart nginx

# 浏览器访问 web 服务器的IP 会看到页面显示 1

这是因为在 nginx 配置规则中有一个隐藏规则 default_server

listen 80 default_server;

在所有配置文件中都没有定义 default_server 时,nginx 会按 ascii 排序将配置的第一个 server 层配置文件作为 default_server,即当请求没有匹配到任何 server_name 时,此 a.conf 会处理此请求

server_name _; 
这里的 '_' 只是作为一个和业务域名无关的请求回收服务而已,如果我们线上的业务都是明确的业务域名访问,那泛解析造成的一些非业务域名或ip访问都会被这个 sever 回收处理。

优先级

1.首先选择所有的字符串完全匹配的server_name 如 www.mumusir.com (完全匹配)
2.选择通配符在前面的server_name,如 *.mumusir.com,
3.再匹配通配符在后面的如 www.mumusir.*
4.最后选择使用正则表达式匹配的server_name,如 ~^www\.(.*)\.com$
5.如果全部都没有匹配到,那么将选择在listen配置项后加入[default_server]的server块
	如 listen 80 default_server;
6.如果没写,那么就找到匹配listen端口的第一个Server块的配置文件

当出现多个相同的server_name情况下,配置文件排序优先使用则会被调用,所以建议配置相同端口,不同域名,这样不会出现域名访问冲突。

#如果出现单台机器多配置文件,页面访问错误的问题
1.如过直接报错,查看hosts是否解析
2.如果访问页面没有对应上
	查看配置文件是否写错域名
	检查nginx是否重启

访问网页的多种方式【多虚拟主机】

1、根据IP访问
根据IP访问【前提是主机有多个IP】【应用场景:适合公司内部人员访问后台页面,外网通过VPN访问】
vim /etc/nginx/conf.d/ip1.conf
server {
    listen 10.0.0.8:80;
    server_name _;
    
    location / {
        root /code;
        index index.html;
    }
}

vim /etc/nginx/conf.d/ip2.conf
server {
    listen 172.16.1.8:80;
    server_name _;
    
    location / {
        root /code1;
        index index.html;
    }
}
2、根据端口访问
根据端口访问【前提是端口不能被占用】
vim /etc/nginx/conf.d/port1.conf
server {
    listen 80;
    server_name localhost;
    
    location / {
        root /code/a;
        index index.html;
    }
}

vim /etc/nginx/conf.d/port2.conf
server {
    listen 81;
    server_name localhost;
    
    location / {
        root /code/b;
        index index.html;
    }
}
3、根据域名访问
根据域名访问【用的最多,一个IP可以匹配多个域名】
vim /etc/nginx/conf.d/server1.conf
server {
    listen 80;
    server_name www.web01.com;
    
    location / {
        root /web;
        index index.html;
    }
}

vim /etc/nginx/conf.d/server2.conf
server {
    listen 80;
    server_name www.web02.com;
    
    location /mcy {
        root /web;
        index index.html;
    }
}

#windows配置域名解析
C:\windows\System32\drivers\etc\hosts
10.0.0.8  www.web01.com www.web02.com
实际访问页面:
www.web01.com /web/index.html
www.web02.com /web/mcy/index.html

禁止IP直接访问

server {
    listen 80 default_server;
    server_name _;
    return 500;
}

使用ip访问时跳转到指定页面

server {
	listen 80 default_server;
	server_name _;
	return 302 http://www.baidu.com;
}

Location 层

1、语法
Syntax:	location [ = | ~ | ~* | ^~ | / ] uri { ... }
		location @name { ... }
Default:	—
Context:	server, location

#整体叫URL
https://timgsa.baidu.com/mhqcw16j30u01401kx.jpg
# / 后面的叫 URI
mhqcw16j30u01401kx.jpg

范例:
server {
    listen 80;
    server_name www.web01.com;
	location /web01 {
		root /code;
		index index.html;
	}
}
释义:
当我们在浏览器输入: www.web01.com
访问顺序是:拿着 location 匹配的内容 /web01 去站点目录 /code 下面的 /web01 里面去找 index.html
实际我们访问的资源是:/code/web01/index.html
2、匹配规则
[root@Nginx conf.d]# cat testserver.conf 
server {
    listen 80;
    server_name www.server.com;
    location / {
        default_type text/html;
        return 200 "location /";
    }
 
    location =/ {
        default_type text/html;
        return 200 "location =/";
    }
 
    location ~ / {
        default_type text/html;
        return 200 "location ~/";
    }
 
 	# location / 与 location ^~ / 效果一样,同时存在会冲突
    # location ^~ / {
    #   default_type text/html;
    #   return 200 "location ^~";
    # }
}
3、优先级
匹配符匹配规则优先级
=精确匹配1
^~以某个字符串开头2
~区分大小写的正则匹配3
~*不区分大小写的正则匹配4
/通用匹配,任何请求都会匹配到5
4、验证优先级
[root@web01 conf.d]# cat testserver.conf 
server {
    listen 80;
    server_name www.server.com;

	location / {
    	root /code;
	}
	#这里的 \ 是转义紧跟着的字符的含义,如下
	location ~ \.php$ {
	    root /php;
	}
	 
	location ~ \.jsp$ {
	    root /jsp;
	}
	 
	location ~* .*\.(jpg|gif|png|js|css)$ {
	    root /pic;
	}
	 
	location ~* "\.(sql|bak|tgz|tar.gz|.git)$" {
	    root /package;
	}      
 
}

#通过日志查看 localtion 的匹配规则
tailf /var/log/nginx/error.log
#访问
www.server.com/test.php
www.server.com/test.jsp
www.server.com/test.jpg
5、自定义报错跳转页面
#设置站点目录
mkdir -p /code/request
echo 'request' > /code/request/index.html
echo '出错了,你刷新太快' > /code/request/503.html
chown -R www.www /code

#设置站点配置文件
vim /etc/nginx/conf.d/request.conf
limit_req_zone $remote_addr zone=req_zone:10m rate=1r/s;

server {
    listen 80;
    server_name www.request.com;
    access_log /var/log/nginx/www.request.com.log main;
    charset 'utf-8';
	
    location / {
	root /code/request;
	index index.html;
	limit_req zone=req_zone;
	#访问错误页面,报错跳转指定页面
	error_page 503 /503.html;
    }
}

# Windows 解析
C:\Windows\System32\drivers\etc\hosts
10.0.0.31 www.request.com
# 访问web页面查看,按住F5不放,快速刷新页面就会发现,有时会弹出 503
www.request.com

# 示例 
	#跳转本地页面,错误页面是由web服务器返回的
vim server1.conf
server {
        listen 80;
        server_name test1.linux.com;
        root /code/test1;
        index index.html;

        error_page 404 /404.html;
        error_page 403 /403.html;
        error_page 502 /502.html;
        error_page 503 /503.html;
        
        location = /404.html {
            root /code/error;
        }
}

	#跳转域名
vim server1.conf
server {
        listen 80;
        server_name test1.linux.com;
        root /code/test1;
        index index.html;

        error_page  404  http://www.baidu.com;
}
6、root与alias
root与alias路径匹配主要区别在于nginx如何解释location后面的uri,这会使两者分别以不同的方式将请求映射到服务器文件上,alias是一个目录别名的定义,root则是最上层目录的定义。

root的处理结果是:root路径+location路径
alias的处理结果是:使用alias定义的路径

# 使用root时
用户访问 http://web.com/picture/1.jpg
此时的 uri 是 /picture/1.jpg
Nginx 拿着 uri 去匹配 location 的值,匹配到,在前面加上 root 的值,后面加上uri 未匹配到的字符
root值+location值+uri未匹配的字符
/code/picture/1.jpg

server {
    listen 80;
    server_name web.com;
    
    location /picture {
        root /code
    }
}

# 使用alias时
用户访问http://web.com/picture/1.jpg
此时的 uri 是 /picture/1.jpg
Nginx 拿着 uri 去匹配 location 的值,匹配到,就将location值替换为 alias值
alias值+uri未匹配的字符
/code/1.jpg

server {
    listen 80;
    server_name web.com;
    
    location /picture {
        alias /code;
    }
    #alias注意 配置的时候 lication 有 ‘/’ alias也要有‘/’,要是没有就都没有
    #location /picture/ {
    #    alias /code/;
    #}
}

#3.root 与 alias 同时使用
[root@web01 ~]# cat /etc/nginx/conf.d/web.conf
server {
    listen 80;
    server_name web.com;

    location / {
        root /data/code/web;
    }

    location ~* ^/tupian/(.+\.(?:gif|jpe?g|png))$ {
        alias /data/code/images/$1;
}
}

用户访问 http://web.com/tupian/1.jpg
[root@web01 ~]# tail -1 /var/log/nginx/error.log
2021/12/20 00:48:48 [error] 115571#115571: *1 open() "/data/code/images/1.jpg" failed (2: No such file or directory), client: 10.0.0.1, server: web.com, request: "GET /tupian/1.jpg HTTP/1.1", host: "web.com"

用户访问 http://web.com/1.jpg
[root@web01 ~]# tail -1 /var/log/nginx/error.log
2021/12/20 00:50:27 [error] 115571#115571: *2 open() "/data/code/web/1.jpg" failed (2: No such file or directory), client: 10.0.0.1, server: web.com, request: "GET /1.jpg HTTP/1.1", host: "web.com"


[root@web01 ~]# cat /etc/nginx/conf.d/web.conf
server {
    listen 80;
    server_name web.com;

    location / {
        root /data/code/web;
    }

    location ~* ^/(.+\.(?:gif|jpe?g|png))$ {
        alias /data/code/images/$1;
}
}

用户访问 http://web.com/tupian/1.jpg
[root@web01 ~]# tail -1 /var/log/nginx/error.log
2021/12/20 00:53:57 [error] 115846#115846: *1 open() "/data/code/images/tupian/1.jpg" failed (2: No such file or directory), client: 10.0.0.1, server: web.com, request: "GET /tupian/1.jpg HTTP/1.1", host: "web.com"

用户访问 http://web.com/1.jpg
[root@web01 ~]# tail -1 /var/log/nginx/error.log
2021/12/20 00:37:48 [error] 113758#113758: *4 open() "/data/code/images/1.jpg" failed (2: No such file or directory), client: 10.0.0.1, server: web.com, request: "GET /1.jpg HTTP/1.1", host: "web.com"

说一下上面正则的使用说明
(.+\.(?:gif|jpe?g|png))
第一层 () 会被下面的 $1 引用
.+		任意字符1到N个
\.		标点 .
(?:)	匹配组,?: 用于标记该匹配组不应被捕获
gif|jpe?g|png	gif 或者 jpg 或者 jpeg 或者 png
$		末位符


# 实测6种写法访问的实际路径,浏览器访问 web.com/1.jpg
	1-4 ok 目录不存在时 location 与 alias 分别加 / 的4种情况
1[root@web01 ~]# cat /etc/nginx/conf.d/web.conf
server {
    listen 80;
    server_name web.com;

    location /ok {
        alias /data/code/images;
    }
}
[root@web01 ~]# tail -1 /var/log/nginx/error.log
2021/12/19 14:50:38 [error] 85344#85344: *2 open() "/usr/share/nginx/html/1.jpg" failed (2: No such file or directory), client: 10.0.0.1, server: web.com, request: "GET /1.jpg HTTP/1.1", host: "web.com"

2[root@web01 ~]# cat /etc/nginx/conf.d/web.conf
server {
    listen 80;
    server_name web.com;

    location /ok/ {
        alias /data/code/images/;
    }
}
[root@web01 ~]# tail -1 /var/log/nginx/error.log
2021/12/19 15:01:13 [error] 85668#85668: *3 open() "/usr/share/nginx/html/1.jpg" failed (2: No such file or directory), client: 10.0.0.1, server: web.com, request: "GET /1.jpg HTTP/1.1", host: "web.com"

3[root@web01 ~]# cat /etc/nginx/conf.d/web.conf
server {
    listen 80;
    server_name web.com;

    location /ok {
        alias /data/code/images/;
    }
}
[root@web01 ~]# tail -1 /var/log/nginx/error.log
2021/12/19 15:04:56 [error] 86096#86096: *1 open() "/usr/share/nginx/html/1.jpg" failed (2: No such file or directory), client: 10.0.0.1, server: web.com, request: "GET /1.jpg HTTP/1.1", host: "web.com"

4[root@web01 ~]# cat /etc/nginx/conf.d/web.conf
server {
    listen 80;
    server_name web.com;

    location /ok/ {
        alias /data/code/images;
    }
}
[root@web01 ~]# tail -1 /var/log/nginx/error.log
2021/12/19 15:06:36 [error] 86201#86201: *1 open() "/usr/share/nginx/html/1.jpg" failed (2: No such file or directory), client: 10.0.0.1, server: web.com, request: "GET /1.jpg HTTP/1.1", host: "web.com"

5、location / 与 alias /data/code/images;
[root@web01 ~]# cat /etc/nginx/conf.d/web.conf
server {
    listen 80;
    server_name web.com;

    location / {
        alias /data/code/images;
    }
}
[root@web01 ~]# tail -1 /var/log/nginx/error.log
2021/12/19 15:08:26 [error] 86308#86308: *1 open() "/data/code/images1.jpg" failed (2: No such file or directory), client: 10.0.0.1, server: web.com, request: "GET /1.jpg HTTP/1.1", host: "web.com"

6、location / 与 alias /data/code/images/;
[root@web01 ~]# cat /etc/nginx/conf.d/web.conf
server {
    listen 80;
    server_name web.com;

    location / {
        alias /data/code/images/;
    }
}
[root@web01 ~]# tail -1 /var/log/nginx/error.log
2021/12/19 15:11:24 [error] 86443#86443: *1 open() "/data/code/images/1.jpg" failed (2: No such file or directory), client: 10.0.0.1, server: web.com, request: "GET /1.jpg HTTP/1.1", host: "web.com"
7、try_file 路径匹配
Nginx 的try_file路径匹配,会按顺序检查文件及目录是否存在(根据 root 和 alias 指令设置的参数构造完整的文件路径)
并用找到的第一个文件提供服务。
在 uri 元素名后面添加斜杠 / 表示这个是目录。
如果文件和目录都不存在,Nginx会执行内部重定向,跳转到命令的最后一个 uri 参数定义的 URI 中。
#重点注意:如果用了 try_file 那访问时域名后面一定要加 uri,不然就会匹配后一个参数



1、实例1

	#1.try_file配置
[root@lb01 conf.d]# vim try.conf
server {
    listen 80;
    server_name try.linux.com;
    root /code;
    index index.html;

    location / {
        try_files $uri /404.html;
    }
}
用户访问 try.linux.com
try_files $uri /404.html;		# Nginx 先找URI,找不到就去找 404.html
try_files $uri/ /404.html;		# Nginx 先找URI/,URI是空的,就找到 / = /code/index.html
try_files $uri $uri/ /404.html;	# Nginx 先找URI,找不到就去找URI/,能找到就返回数据,找不到就去找 404.html

	#2.创建实例目录与文件linux
[root@lb01 conf.d]# echo try11111 > /code/index.html
[root@lb01 conf.d]# echo '404 404 404' > /code/404.html

	#3.尝试访问try.linux.com
[root@lb01 conf.d]# curl try.linux.com
404 404 404
#由于访问的是try.linux.com,而$uri取得是域名后面我们写的内容,它找不到,所以访问后面的内容,即404.html

	#4.尝试访问try.linux.com/index.html
[root@lb01 conf.d]# curl try.linux.com/index.html
try11111
#由于访问的是try.linux.com/index.html,而$uri取到了index.html所以返回/code/index.html的内容

	#5.修改配置为
location / {
    try_files $uri $uri/ /404.html;
}

	#6.再次尝试访问try.linux.com
[root@lb01 conf.d]# curl try.linux.com
try11111
#我们访问的是try.linux.com,而$uri我们没有写任何内容,于是他访问的便是“空/”,即匹配到/code/index.html


2、实例2

	#1. 配置nginx
[root@lb01 conf.d]# cat try.conf 
server {
    listen 80;
    server_name try.linux.com;
    root /code;
    index index.html;

    location / {
        try_files $uri $uri/ @java;             
        #当$uri和$uri/都匹配不到时,由后端的java来进行处理,名字可自定义,但一定要加@
        # @ 内部跳转的意思 @java = 调用 @java
    }

	# 配置 @java
    location @java {
    #配置后端tomcat
    proxy_pass http://172.16.1.8:8080;          
    }
}

	#2. 配置后端tomcat
[root@web02 ~]# cd /usr/share/tomcat/webapps/ROOT
[root@web02 ROOT]# echo 'i am tomcat' > index.html
[root@web02 ROOT]# systemctl start tomcat

	#3. 把文件都挪走
[root@lb01 code]# mv index.html index1.html /tmp/

	#4. 测试访问
[root@lb01 code]# curl http://try.linux.com/index.html
i am tomcat

rewrite

理论

# 什么是 rewrite

Rewrite 主要实现 url 地址重写,以及重定向,就是把传入`web`的请求重定向到其他`url`的过程。

Rewrite 使用场景

1、地址跳转,用户访问blog.linux.com/test 这个URL时,将其定向至http://www.baidu.com
server {
    listen 80;
    server_name blog.linux.com;
    location /test {
        rewrite ^(.*)$ http://www.baidu.com;
    }
}

2、协议跳转,用户通过http协议请求网站时,将其重新跳转至https协议方式
server {
        listen 80;
        server_name www.mumusir.com mumusir.com;
        rewrite ^(.*)$ https://www.mumusir.com;
        #rewrite ^(.*)$ https://$server_name$1;
        #return 302 https://$server_name$request_uri;
}

3、伪静态,将动态页面显示为静态页面方式的一种技术,便于搜索引擎的录入,同时建上动态URL地址对外暴露过多的参数,提升更高的安全性。

4、搜索引擎,SEO优化依赖于url路径,好记的url便于智齿搜索引擎录入

Rewrite 配置语法

Syntax:	rewrite regex replacement [flag];
Default:	—
Context:	server, location, if

#rewrite调用     访问的URL地址(支持正则)   跳转后的地址      标签
rewrite          regex                   replacement    [flag];

# 示例 if 层
server {
        listen 80;
        server_name   www.jd.com;
        if ($http_user_agent ~* "Android|Iphone") {
                rewrite ^(.*)$ https://m.jd.com/ redirect;
        }       
}
flag

rewrite指令根据表达式来重定向URL,或者修改字符串,可以应用于server,location,if环境下,每行rewrite指令最后跟一个flag标记,支持的flag标记有如下表格所示:

flag作用
last本条规则匹配完成后,停止匹配,不再匹配后面的规则
若没匹配成功,也不再匹配。
break本条规则匹配完成后,停止匹配,不再匹配后面的规则
若没匹配成功,会在本server层继续匹配其他location层的规则
redirect返回302临时重定向,地址栏会显示跳转后的地址
permanent返回301永久重定向,地址栏会显示跳转后的地址【不清理缓存就一直跳转】
1.last与break区别对比示例
[root@web01 ~]# vim /etc/nginx/conf.d/rw.linux.com.conf
server {
        listen 80;
        server_name rw.linux.com;
        root /code/rw;

        location ~ ^/break {
                rewrite ^/break /test/ break;
        }
        location ~ ^/last {
                rewrite ^/last /test/ last;
        }
        location /test/ {
        		#给请求加一个文件类型,不添加就会直接下载【也可以写 jpg|txt|json】
                default_type application/json;
                return 200 "ok";
        }
}

# 相同点
break	只要匹配到规则,则会去本地配置路径的目录中寻找请求的文件;
last	只要匹配到规则,会对其所在的server(...)标签重新发起请求。

# 不同点
break请求:
1、请求rewrite.drz.com/break
2、匹配到相应的location,被rewrite重写为 rewrite.drz.com/test
3、接着会去查找本地的 /code/rw/test/index.html;
4、如果找到了,则返回 /code/rw/test/index.html; 的内容
5、如果没找到该目录,则报错404,如果找到该目录没找到对应的文件,则报错403

last请求:
1、请求rewrite.drz.com/last
2、匹配到相应的location,被rewrite重写为  rewrite.drz.com/test
3、接着会去查找本地的 /code/rw/test/index.html;
4、如果找到了,则返回 /code/rw/test/index.html; 的内容
5、如果没找到,会对当前server重新的发起一次请求,请求的 URL 为 rewrite.drz.com/test/
6、如果有location匹配上,则直接返回该location里面的内容。
7、如果也没有location匹配,再返回404;

简单来说 
break 	匹配之后 拿着重写的 URL 去本层 location 匹配,匹配不到就结束了
last	匹配之后 拿着重写的 URL 去本层 location 匹配,匹配不到就拿着重写的 URL 去 server 层去匹配其他的 location
2.redirect和permanent的区别示例
[root@web01 conf.d]# cat rw.linux.com.conf 
server {
        listen 80;
        server_name rw.linux.com;
        root /code;

        location /test {
                rewrite ^(.*)$  http://www.baidu.com redirect;
                #return 302 http://www.baidu.com;
                
                #rewrite ^(.*)$  http://www.163.com permanent;
                #return 301 http://www.163.com;
        }
}

# redirect和permanent的区别
redirect: 每次请求都会询问服务器,如果当服务器不可用时,则会跳转失败。
permanent: 第一次请求会询问,浏览器会记录跳转的地址 http://www.163.com,
第二次访问前先关闭web主机的nginx服务,再次访问 rw.linux.com 通过浏览器缓存的地址跳转至http://www.163.com
只要不清除缓存就一直会自动跳转
break 配置实例
0.为了方便排错,开启日志
[root@web01 ~]# vim /etc/nginx/nginx.conf
error_log  /var/log/nginx/error.log notice;

http {
	... ...
    rewrite_log on;
 	... ...
}
1.实例一:
用户访问`/abc/1.html`实际上真实访问的是`/ccc/bbb/2.html`

#1.配置跳转后的文件
[root@web01 ~]# mkdir /code/rw/ccc/bbb -p
[root@web01 ~]# echo "ccc_bbb_222" > /code/rw/ccc/bbb/2.html

#配置nginx跳转
[root@web01 ~]# vim /etc/nginx/conf.d/rw.linux.com.conf 
server {
    listen 80;
    server_name rw.linux.com;
    root /code/rw;

    location /abc {
        rewrite ^/abc /ccc/bbb/2.html break;
    }
}

#页面访问测试
http://rw.linux.com/abc/1.html
2.实例二:
用户访问`/2018/ccc/2.html`实际上真实访问的是`/2014/ccc/bbb/2.html`

#配置跳转后页面
[root@web01 ~]# mkdir /code/rw/2014/ccc/bbb/ -p
[root@web01 ~]# echo "/code/rw/2014/ccc/bbb/2.html" > /code/rw/2014/ccc/bbb/2.html

#配置nginx
[root@web01 ~]# vim /etc/nginx/conf.d/rw.linux.com.conf 
server {
    listen 80;
    server_name rw.linux.com;
    root /code/rw;

    location /2018 {
        rewrite ^/2018/(.*).html /2014/ccc/bbb/$1.html break;
    }
}

#访问测试
http://rw.linux.com/2018/2.html
3.实例三:
用户访问/test实际上真实访问的是http://www.baidu.com

#配置nginx
[root@web01 ~]# vim /etc/nginx/conf.d/rw.linux.com.conf 
server {
    listen 80;
    server_name rw.linux.com;
    root /code/rw;

    location /test {
        rewrite (.*) http://www.baidu.com break;
    }
}
4.实例四:
用户访问`course-11-22-33.html`实际上真实访问的是`/course/11/22/33/course_33.html`

#配置跳转后页面
[root@web01 ~]# mkdir /code/rw/course/11/22/33 -p
[root@web01 ~]# echo "/course/11/22/33/course_33.html" > /code/rw/course/11/22/33/course_33.html

#僵硬匹配
[root@web01 ~]# vim /etc/nginx/conf.d/rw.linux.com.conf 
server {
    listen 80;
    server_name rw.linux.com;
    root /code/rw;

    location /course {
        rewrite ^/course-11-22-33.html /course/11/22/33/course_33.html break;
    }
}

#灵活匹配
[root@web01 ~]# vim /etc/nginx/conf.d/rw.linux.com.conf 
server {
    listen 80;
    server_name rw.linux.com;
    root /code/rw;

    location / {
        rewrite ^/(.*)-(.*)-(.*)-(.*).html /$1/$2/$3/$4/$1_$4.html break;
        rewrite ^/course-11-22-33.html /course/11/22/33/course_33.html break;
    }
}

rewrite 伪静态

# 原文链接:https://blog.csdn.net/qq_41718455/article/details/80593029

# html静态页(真静态):

优点:一是减少服务器对数据响应的负荷,二是加载不用调动数据库,响应速度快。

缺点:一是维护不方便,每次都要手动生成。三是空间占用比较大。三是生成的文件多了,服务器对html文件的响应负担也较重。

# 伪静态:

url 重写(伪静态)的好处:
一,可以方便的实现对化化引擎的优化,并且比生成静态更加方便。
二、占空间比较小。
三、首页每天都自动变化,不用维护。网站首页一般都有热点排行之类的,你可以设为,24小时排行,一周排行,再加上最新文章,最新点评等。这样首页天天是有变化的。
四,便于广告的轮显。比如:你可以把 art1234.aspx,这个虚成n个页,如art_1234.aspx,news_1234.aspx,top_1234.aspx,在不同的页面放 不同的广告.
总之是动态的,你就可以随意动。

url重写的缺点:那就是效率不如生成html的,因为它不是真正意义上的静态页,每次请求是要读取数据库的。但你可以用缓存技术来补偿一下。
1.搭建discuz
#上传代码
[root@web01 ~]# cd /code/
[root@web01 code]# rz Discuz_X3.3_SC_GBK.zip

#解压代码
[root@web01 code]# unzip Discuz_X3.3_SC_GBK.zip

#授权目录
[root@web01 ~]# chown -R www.www /code/

#配置站点配置nginx
[root@web01 ~]# vim /etc/nginx/conf.d/discuz.linux.com.conf
server {
    listen 80;
    server_name discuz.linux.com;

    location / {
        root /code/upload;
        index index.php;
    }

    location ~ \.php$ {
        root /code/upload;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}
[root@web01 ~]# systemctl restart nginx

#创建数据库
[root@db01 ~]# mysql -uroot -p
Enter password: 

MariaDB [(none)]> create database ultrax;
Query OK, 1 row affected (0.02 sec)

MariaDB [(none)]> grant all on 库名字.* to 用户@'主机地址' identified by '密码';
MariaDB [(none)]> grant all on *.* to root@'%' identified by '123456';

#配置host,访问页面配置
2.rewrite 配置伪静态
[root@web01 ~]# cat /etc/nginx/conf.d/discuz.linux.com.conf
server {
    listen 80;
    server_name discuz.linux.com;

    location / {
	root /code/upload;
	index index.php;
	#下面的 rewrite 来自 discuz 网站的 管理中心 页面,具体步骤看 48-2_rewrite伪静态.ev4 视屏
	rewrite ^([^\.]*)/topic-(.+)\.html$ $1/portal.php?mod=topic&topic=$2 last;
	rewrite ^([^\.]*)/article-([0-9]+)-([0-9]+)\.html$ $1/portal.php?mod=view&aid=$2&page=$3 last;
	rewrite ^([^\.]*)/forum-(\w+)-([0-9]+)\.html$ $1/forum.php?mod=forumdisplay&fid=$2&page=$3 last;
	rewrite ^([^\.]*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ $1/forum.php?mod=viewthread&tid=$2&extra=page%3D$4&page=$3 last;
	rewrite ^([^\.]*)/group-([0-9]+)-([0-9]+)\.html$ $1/forum.php?mod=group&fid=$2&page=$3 last;
	rewrite ^([^\.]*)/space-(username|uid)-(.+)\.html$ $1/home.php?mod=space&$2=$3 last;
	rewrite ^([^\.]*)/blog-([0-9]+)-([0-9]+)\.html$ $1/home.php?mod=space&uid=$2&do=blog&id=$3 last;
	rewrite ^([^\.]*)/(fid|tid)-([0-9]+)\.html$ $1/archiver/index.php?action=$2&value=$3 last;
	rewrite ^([^\.]*)/([a-z]+[a-z0-9_]*)-([a-z0-9_\-]+)\.html$ $1/plugin.php?id=$2:$3 last;
	if (!-e $request_filename) {
       		return 404;
	}
    }

    location ~ \.php$ {
	root /code/upload;
	fastcgi_pass 127.0.0.1:9000;
	fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
	include fastcgi_params;
    }
}

#具体步骤
管理中心》全局》SEO设置》URL静态化》把需要静态化的页面都勾上,rewrite 兼容性选 是》提交
》查看当前的 rewrite 规则》选择对应的 Nginx Web Server

rewrite 扩展

1.rewrite匹配优先级
1.先执行server块的rewrite指令
2.其次执行location匹配规则
3.最后执行location中if语句的rewrite

server {
    listen 80;
    server_name rew.linux.com;
    rewrite (.*) http://www.baidu.com;
    
    location / {
        rewrite (.*) http://www.jd.com;
        if ($http_user_agent ~* Windows) {
            rewrite (.*) http://www.taobao.com;
        }
    }
}
2.Rewrite与Nginx全局变量
Rewrite在匹配过程中,会用到一些Nginx全局变量

$server_name    #当前用户请求的域名

server {
        listen 80;
        server_name test.drz.com;
        rewrite ^(.*)$ https://$server_name$1;
}

$request_filename 请求的文件路径名(带网站的主目录/code/images/test.jpg)
$request_uri 当前请求的文件路径(不带网站的主目录/inages/test.jpg)

#大多数用于http协议转https协议
server {
        listen 80;
        server_name php.drz.com;
        return 302 https://$server_name$request_uri;
}
$scheme 用的协议,比如http或者https
3.rewrite 规范写法
server {
        listen 80;
        server_name www.drz.com drz.com;
        if ($http_host = drz.com){
            rewrite (.*) http://www.drz.com$1;
        }
}

#推荐书写格式
server {
        listen 80;
        server_name drz.com;
        rewrite ^ http://www.drz.com$request_uri;
}
server {
        listen 80;
        server_name www.drz.com;
}

Nginx 优化

压测工具 ab

	#安装 ab 压测工具
yum -y install httpd-tools

	#使用ab命令
ab 选项

-n	在测试会话中所执行的请求个数。默认时,仅执行一个请求。请求的总数量
-c	一次产生的请求个数。默认是一次一个。请求的用户量
-t	测试所进行的最大秒数。其内部隐含值是-n 50000,它可以使对服务器的测试限制在一个固定的总时间以内。默认时,没有时间限制。

	#注意:压测域名一定要加 / 或 URI 结尾【测试的网址一定要做好解析】
	#压测结果含义
Server Software:		#服务的软件版本
Server Hostname:		#域名或IP
Server Port:			#服务端口
Document Path:			#被请求的静态资源文件路径
Document Length:		#被请求的静态资源文件大小
Concurrency Level:      #并发数
Time taken for tests:   #完成时间
Complete requests:      #请求数
Failed requests:        #失败的请求
Write errors:           #写入错误的请求
Total transferred:      #1W次请求的总字节数
HTML transferred:       #去掉请求头剩下下的字节数
Requests per second:    #每秒能请求的次数
Time per request:       #浏览器等待每次请求的时间
Time per request:       #服务器处理每次请求平均耗时【单位:毫秒】
Transfer rate:          #每秒能处理的请求数据大小

ab -n 10000 -c 200 http://ab.linux.com/

影响性能指标

1、首先需要了解我们当前系统的结构和瓶颈,了解当前使用的是什么,运行的是什么业务,都有哪些服务,了解每个服务最大能支撑多少并发。
比如nginx作为静态资源服务并发是多少,最高瓶颈在哪里,能支持多少qps(每秒查询率)的访问请求,那我们怎么得出这组系统结构瓶颈呢,比如top查看系统的CPU负载、内存使用率、总得运行进程等,也可以通过日志去分析请求的情况,当然也可以通过我们前面介绍到的stub_status模块查看当前的连接情况,也可以对线上的业务进行压力测试(低峰期),去了解当前这套系统能承担多少的请求和并发,已做好响应的评估。这个是我们做性能优化最先考虑的地方。

2、其次我们需要了解业务模式,虽然我们是做性能优化,但每一个性能的优化都是为业务所提供的服务的,我们需要了解每个业务接口的类型,比如:电商网站中的抢购模式,这种情况下面,平时没什么流量,但到了抢购时间流量会突增。
我们还需要了解系统层次化的结构,比如:我们使用nginx做的是代理、还是动静分离、还是后端直接服务用户,那么这个就需要我们对每一层做好相应的梳理。以便更好的服务业务。

3、最后我们需要考虑性能与安全,往往注重了性能,但是忽略了安全。往往过于注重安全,对性能又会产生影响。比如:我们在设计防火墙功能时,检测过于严密,这样就会给性能带来影响。那么如果对于性能完全追求,却不顾服务的安全,这个也会造成很大的隐患,所以需要评估好两者的关系,把握好两者的孰重孰轻。以及整体的相关性,权衡好对应的点。

从OSI模型考虑优化方向

硬件 代理(CPU) 静态(磁盘IO) 动态(cpu、内存)
网络 贷款、丢包、延迟
系统 文件描述符(文件句柄数)
应用 服务与服务保持长连接 http1.1
服务 静态资源服务优化

#优化前先归纳下哪些会影响到用户访问
#每个服务与服务之间都或多或少有一些关联,需要将整个架构进行分层,找到对应系统或服务的短板,然后进行优化

1、网络
    (1)网络的流量
    (2)网络是否丢包
    (3)这些会影响http的请求与调用
2、系统
    (1)硬件有没有磁盘损坏,磁盘速率
    (2)系统的负载、内存、系统稳定性
3、服务
    (1)连接优化。请求优化
    (2)根据业务形态做对应的服务设置
4、程序
    (1)接口性能
    (2)处理速度
    (3)程序执行效率
5、数据库

系统性能优化

介绍
文件句柄,Linux一切皆文件,文件句柄可以理解为就是一个索引,文件句柄会随着我们进程的调用频繁而增加,系统默认文件句柄是有限制的1024,不能让一个进程无限的调用,所以我们需要限制每个 进程和每个服务使用多大的文件句柄,文件句柄也是必须要调整的优化参数。

文件句柄的设置方式:
1、系统全局性修改
2、用户局部性修改
3、进程局部性修改【针对服务如:nginx】
设置
	#查看现在的文件句柄数
[root@web01 ~]# ulimit -n
65535
#设置的数值不能大于 cat /proc/sys/fs/nr_open 的值,否则注销后将无法正常登录
[root@web01 ~]# cat /proc/sys/fs/nr_open
1048576

	# 系统全局性修改【根据实际需要可以改更大,不超过 /proc/sys/fs/nr_open 的值】
	# soft 小于或等于 hard
cat >> /etc/security/limits.conf << EOF
* soft nofile 32768
* hard nofile 65535
EOF

	# www 用户局部性修改
cat >> /etc/security/limits.conf << EOF
www soft nofile 32768
www hard nofile 65535
EOF

	# 进程局部性修改
vim /etc/nginx/nginx.conf
user  www;
worker_processes  auto;
worker_rlimit_nofile 30000	#添加此行
端口重用
开启长链接优点降低三次握手四次挥手次数,缺点是结束连接后会处于time_wait状态,占用端口
	#调整内核参数:让time_wait状态占用的端口重用
vim /etc/sysctl.conf
net.ipv4.tcp_tw_reuse = 1
	#生效
sysctl -p

代理服务器优化

在高并发短连接的TCP服务器上,当服务器处理完请求后立刻主动正常关闭连接。这个场景下会出现大量socket处于TIME_WAIT状态。
如果客户端的并发量持续很高,此时部分客户端就会显示连接不上。主动正常关闭TCP连接,都会出现TIMEWAIT。

为什么要关注这个高并发短连接呢?有两个方面需要注意:
1. 高并发可以让服务器在短时间范围内同时占用大量端口,而端口有个0~65535的范围,并不是很多,刨除系统和其他服务要用的,剩下的就更少了。
2. 在这个场景中,短连接表示业务处理+传输数据的时间 远远小于 TIMEWAIT超时的时间的连接。

这里有个相对长短的概念,比如取一个web页面,1秒钟的http短连接处理完业务,在关闭连接之后,这个业务用过的端口会停留在TIMEWAIT状态几分钟,而这几分钟,其他HTTP请求来临的时候是无法占用此端口的(占着茅坑不拉翔)。单用这个业务计算服务器的利用率会发现,服务器干正经事的时间和端口(资源)被挂着无法被使用的时间的比例是 1:几百,服务器资源严重浪费。(说个题外话,从这个意义出发来考虑服务器性能调优的话,长连接业务的服务就不需要考虑TIMEWAIT状态。同时,假如你对服务器业务场景非常熟悉,你会发现,在实际业务场景中,一般长连接对应的业务的并发量并不会很高。

#该指令出现在1.1.4版中
Syntax: keepalive connection;
Default: -
Context: upstream

#该指令出现在1.15.3版中
Syntax: keepalive_requests number;
Default: keepalive_requests 10000;	#一次连接后可以请求1万次,超过1W次就断开,一般不用
Context: upstream

#该指令出现在1.15.3版中
Syntax: keepalive_timeout timeout;
Default: keepalive_timeout 60s;		#一次连接后没有请求动作,保持60秒后才断开,一般也不用
Context: upstream


# 7层负载均衡
upstream http_backend {
    server 172.16.1.31:8080;
    server 172.16.1.32:8080;
    keepalive 16;   #被代理的31、32web服务器优先使用16条长连接,不够用的时候再使用其他连接
}					#长链接过程中可以无限请求

server {
    ...
    location /http/ {
        proxy_pass http://http_backend;
        proxy_http_version 1.1;         #对于http协议应该指定为1.1
        proxy_set_header Connection ""; #清除请求头的“connection”头字段信息,变为‘keep-alive’,1.14版本以后不用设置
        proxy_next_upstream error timeout http_500 http_502 http_503 http_504;  #31访问失败后平滑过渡到32,不会报错
        proxy_set_header Host $http_host;								#传递请求的域名给后端服务器
        #proxy_set_header X-Real-IP $remote_addr;						#传递上一层IP给后方
        proxy_set_header X-Forwared-For $proxy_add_x_forwarded_for;		#传递用户IP给后方,一般都用这个
        proxy_connect_timeout 30s;      # 代理连接web超时时间
        proxy_read_timeout 60s;         # 代理等待web响应超时时间
        proxy_send_timeout 60s;         # web回传数据至代理超时时间
        proxy_buffering on;             # 开启代理缓冲区,web回传数据至缓冲区,代理边收边传返回给客户端
        proxy_buffer_size 32k;          # 代理接收web响应的头信息的缓冲区大小
        proxy_buffers 4 128k;           # 缓冲代理接收单个长连接内包含的web响应的数量和大小
    ...
    }
}

#代理PHP
#本机【web服务器】IP 172.16.1.31,41、42是PHP服务器
#假设用户访问的是 ab.linux.com/fastcgi/1/2/3/1.php
upstream fastcgi_backend {
    server 172.16.1.41:9000;
    server 172.16.1.42:9000;
    keepalive 8;
}

server {
    ...
    location /fastcgi/ {
    	#用户访问URI为/fastcgi/时,就跳转到 41、42 的PHP上
        fastcgi_pass fastcgi_backend;
        #	标准格式				  站点目录/code/ab	1/2/3/1.php
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        #开启长链接
        fastcgi_keep_conn on;
        #连接超时时间为60秒
        fastcgi_connect_timeout 60s;
        #包含的文件
        include fastcgi_params;
        ...
    }
}

# 注意:scgi和uwsgi协议没有保持连接的概念。2.但无论是proxy、fastcgi、uwsgi协议都有cache缓存的功能,开启后可加速网站访问的效率。(取决硬件)

静态资源优化

环境准备
主机名称应用环境外网地址内网地址
backuprsync服务端10.0.0.11172.16.1.11
nfsrsync客户端+inotify-tools=Sersync+nfs10.0.0.31172.16.1.21
web01nginx+php10.0.0.31172.16.1.31
web02nginx+php10.0.0.32172.16.1.32
db01mysql10.0.0.51172.16.1.51
静态资源介绍

静态资源指的是非WEB服务器端运行处理而生成的文件

静态资源类型种类
浏览器渲染HTML、CSS、JS
图片文件JPEG、GIF、PNG
视频文件FLV、Mp4、AVI
其他文件TXT、DOC、PDF、…
静态资源缓存
介绍

在这里插入图片描述

#浏览器访问过程
0# 判断有没有缓存,没有缓存直接想web服务器请求数据,有缓存再进行下面的判断

1# 浏览器请求服务器,首先会验证 Expires、Cache-Control 检查缓存是否过期,没有过期则直接从缓存文件中读取
Expires: Sun, 11 Jul 2021 10:54:06 GMT				# 本地缓存目录中,文件过期的时间(由服务器指定具体的时间)
cache-control: max-age=31536000	#本地缓存目录中,文件过期的时间(由服务器指定过期的间隔时间,由于浏览器根据间隔生成具体的时间)

2# 如果缓存过期检查是否存在Etag,存在Etag浏览器会向web服务器请求对比If-None-Match与Etag的值,由服务器决策返回200还是304
ETag: "5d8444bf-3790"								# 响应头中的:文件标识【服务器返回的】
If-None-Match: "5d8444bf-3790"						# 请求头中的:文件标识【请求后服务器放在浏览器上的值】

3# 如果Etag不存在,浏览器向web服务器请求if-Modified-Since的值与Last-Modified的值进行对比,由服务器决策返回200还是304
Last-Modified: Fri, 20 Sep 2019 03:17:19 GMT		# 响应头中的:服务器上文件的最后修改时间
If-Modified-Since: Fri, 20 Sep 2019 03:17:19 GMT	# 请求头中的:服务器上文件的最后修改时间
示例
#语法
#作用:添加Cache-Control Expires头
Syntax: expires [modified] time;
        epoch | max | off;
Default: expires off;
Context: http, server, location, if in location

server {
    listen 80;
    server_name static.drz.com;

    location ~ .*\.(jpg|gif|png)$ {
        expires      7d;
    }
    location ~ .*\.(js|css)$ {
        expires      30d;
    }
}

#开发过程中不想读取缓存,取消js、css、html等静态文件缓存
location ~ .*\.(js|css|html)$ {
    add_header Cache-Control no-store;
    add_header Pragma no-cache;
    #在响应头增加一行内容为 Server: nginx/1.11.1
    add_header Server nginx/1.11.1;
}
静态资源读取
介绍
# 静态资源高效读取 on 开启 | off 关闭
Syntax: sendfile on | off;
Default: sendfile off;
Context: http, server, location, if in location

# 将多个包一次发送,用于提升网络传输效率,大文件推荐打开,需要开启sendfile才行
Syntax: tcp_nopush on | off;
Default: tcp_nopush off;
Context: http, server, location


# 提高网络传输实时性,需要开启keepalive,来一个包发一个包不等待
Syntax: tcp_nodelay on | off;
Default: tcpnodelay off;
Context: http, server, location
示例
#组合使用
    sendfile       on;
    tcp_nopush     on;

#组合使用
    keepalive_timeout  65;
    tcp_nodelay	   on;
    
#tcp_nopush 和 tcp_nodelay 不能同时开启,但是1.20.1版本yum安装的配置文件中同时存在了,实际生产没同时用过。
#网上找到一个解说:
只能说看似矛盾,同时打开sendfile,tcp_nopush与tcp_nodelay时,针对资源发送nginx会参考如下:

1、确保数据包在发送给客户之前是已满的

2、对于最后一个数据包,tcp_nopush将被删除,允许TCP立即发送,没有延迟
静态资源压缩
介绍
#gzip传输压缩,传输前压缩,传输后解压,一般对文档压缩效果较好,图片压缩效果一般般
Syntax: gzip on | off;
Default: gzip off;
Context: http, server, location, if in location

#gzip压缩哪些文件
Syntax: gzip_types mime-type ...;
Default: gzip_types text/html;
Context: http, server, location

#gzip压缩比率,加快传输,但压缩本身比较耗费服务器性能
Syntax: gzip_comp_level level;
Default:gzip_comp_level 1;
Context: http, server, location

#gzip压缩协议版本,压缩使用在http哪个协议,主流选择1.1版本
Syntax: gzip_http_version 1.0 | 1.1;
Default:gzip_http_version 1.1;
Context: http, server, location
示例
[root@web01 code]# vim /etc/nginx/conf.d/ab.linux.com.conf
upstream daili {
        server 10.0.0.7:8080;
        keepalive 16;
}
server {
        listen 80;
        server_name ab.linux.com;
        root /code;
        index index.html;

        location / {
                proxy_pass http://daili;
                proxy_http_version 1.1;
        }

        location ~ \.(jpg|png|gif|txt)$ {
                gzip on;
                gzip_types image/jpeg image/gif image/png text/plain;
                gzip_comp_level 9;
                gzip_http_version 1.1;
        }
}

防止资源盗链

1.测试盗链页面
[root@web01 code]# vim /etc/nginx/conf.d/ab.linux.com.conf
server {
        listen 80;
        server_name ab.linux.com;
        root /code;
        index index.html;

        location ~ \.(jpg|png|gif|txt)$ {
                gzip on;
                gzip_types image/jpeg image/gif image/png text/plain;
                gzip_comp_level 9;
                gzip_http_version 1.1;
        }
}
2.防盗链配置
#语法
Syntax: valid_referers none | blocked | server_name | string ...;
Default: -;
Context: server, location

#none: referer来源头部为空的情况  配置 none 则可以访问    								来源头部为空
(日志格式为:10.0.0.7 - - [02/Jan/2020:15:26:08 +0800] "HEAD /2.jpg HTTP/1.1" 200 0 "-" 		"curl/7.29.0" "-" "-"#blocked: referer来源头部不为空,这些都不以http://或者https://开头  配置该值则可以访问	来源头部不为空
(日志格式为:10.0.0.7 - - [02/Jan/2020:15:27:48 +0800] "HEAD /2.jpg HTTP/1.1" 403 0 "www.baidu.com" "curl/7.29.0" "-" "-"#server_name: 来源头部信息包含当前域名,可以正则匹配   配置该值则可以访问
(日志格式为:10.0.0.7 - - [02/Jan/2020:15:31:42 +0800] "HEAD /2.jpg HTTP/1.1" 200 0 "http://static.linux.com" "curl/7.29.0" "-" "-"#防盗链示例1【来源头部 空、不为空、域名符合*.linux.com 才可以访问】
    location ~ .*\.(jpg|png|gif) {
        root /code/pic;
        valid_referers none blocked server_name *.linux.com;
        if ( $invalid_referer ) {
			return 403;
		}
    }
#防盗链示例2【域名符合*.linux.com 才可以访问】
    location ~ .*\.(jpg|png|gif) {
        root /code;
        valid_referers server_name *.linux.com ~\.linux\.;
        if ( $invalid_referer ) {
			rewrite ^(.*)$ /pic/fangdao.jpg break;
		}
    }
#允许某些网站【谷歌、百度】盗链
location ~ .*\.(jpg|png|gif) {
    root /data;
    valid_referers none blocked *.linux.com server_name ~\.google\. ~\.baidu\.;
    if ( $invalid_referer ) {
        return 403;
    }   
}
3.配置web02作为资源的网站
#配置nginx
[root@web02 conf.d]# vim static.conf
server {
    listen 80;
    server_name static.linux.com;
    root /code;

    location / {
        index index.html;
    }
}

#重启nginx
[root@web02 conf.d]# systemctl restart nginx

#上传几张图片
配置hosts访问测试
4.配置web01作为盗链的网站
#1.配置nginx
[root@web01 conf.d]# vim dl.conf
server {
    server_name dl.linux.com;
    listen 80;
    root /code;
    location / {
        index index.html;
    }
}

#2.配置盗链的页面
[root@web01 conf.d]# vim /code/index.html
<html>
<head>
    <meta charset="utf-8">
    <title>linux7.com</title>
</head>
<body style="background-color:pink;">
    <center><img src="http://static.linux.com/2.jpg"/></center>
</body>
</html>

#3.配置服务器hosts文件和电脑的hosts文件
[root@web01 conf.d]# vim /etc/hosts
10.0.0.32 static.linux.com
5.访问页面测试
# Windows 解析
C:\Windows\System32\drivers\etc\hosts
10.0.0.31 static.linux.com
# 访问web页面查看
static.linux.com
6.演示
#当然这种防护并不能百分百保证资源不被盗链,因为我们可以通过命令来修改来源的refer信息
-e 模拟来源网址为 http://static.linux.com
-I 只显示请求URL的响应头信息
[root@web01 conf.d]# curl -e "http://static.linux.com" -I http://static.linux.com/2.jpg
HTTP/1.1 200 OK
Server: nginx/1.16.1
Date: Thu, 02 Jan 2020 07:31:42 GMT
Content-Type: image/jpeg
Content-Length: 12517
Last-Modified: Wed, 18 Dec 2019 01:41:33 GMT
Connection: keep-alive
ETag: "5df983cd-30e5"
Accept-Ranges: bytes

允许跨域访问

#一般使用在
1.服务器迁移
2.域名更改
1.配置被跨域的网站
#配置nginx
[root@web02 ~]# vim /etc/nginx/conf.d/beikuayu.conf
server {
	listen 80;
    server_name beikuayu.linux.com;
    root /code;

    location / {
		index index.html;
	}
}

#配置网站页面文件
[root@web02 ~]# echo 'test' > /code/index.html
2.配置跨域的网站
#配置nginx
[root@web01 ~]# vim /etc/nginx/conf.d/kuayu.conf 
server {
        listen 80;
        server_name kuayu.linux.com;

        location / { 
                root /code;
        }
}

#配置跨域站点
[root@web01 ~]# vim /code/kuayu.html 
<html lang="en">
<head>
        <meta charset="UTF-8" />
        <title>测试ajax和跨域访问</title>
        <script src="http://libs.baidu.com/jquery/2.1.4/jquery.min.js"></script>
</head>
<script type="text/javascript">
$(document).ready(function(){
        $.ajax({
        type: "GET",
        url: "http://beikuayu.linux.com",
        success: function(data) {
                alert("sucess 卧槽 卧槽 卧槽 成功了!!!");
        },
        error: function() {
                alert("fail!!,跨不过去啊,不让进去啊,只能蹭蹭!");
        }
        });
});
</script>
        <body>
                <h1>测试跨域访问</h1>
        </body>
</html>
3.访问测试失败
# 访问测试失败
http://kuayu.linux.com/kuayu.html
# Windows 解析
C:\Windows\System32\drivers\etc\hosts
10.0.0.32 beikuayu.linux.com
10.0.0.31 kuayu.linux.com
# 访问web页面查看
kuayu.linux.com
4.配置允许跨域访问
[root@web02 ~]# vim /etc/nginx/conf.d/beikuayu.conf
server {
        listen 80;
        server_name beikuayu.linux.com;
        root /code;

        location / {
                index index.html;
        }

        location ~ .*\.(html|htm)$ {
            add_header Access-Control-Allow-Origin *;
            add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;
        }
}

CPU亲和

CPU亲和(affinity)减少进程之间不断频繁切换,减少性能损耗,其实现原理是建CPU核心和Nginx工作进程绑定方式,把每个worker进程固定到对应的cpu上执行,减少切换CPU的cache miss,获得更好的性能。

1.查看cpu

[root@tomcat01 ~]# lscpu | grep "CPU(s)"
CPU(s):                8
On-line CPU(s) list:   0-7
NUMA node0 CPU(s):     0-7

#以上服务器有一颗物理CPU,上面有8个核心
2.配置方法
# 第一种绑定组合方式(不推荐)
worker_processes 12;
worker_cpu_affinity 000000000001 000000000010 000000000100 000000001000 000000010000 000000100000 000001000000 000010000000 000100000000 001000000000 010000000000 10000000000;

# 第二种方式(使用较少)
worker_processes 2;
worker_cpu_affinity 101010101010 010101010101;

# 第三种最佳绑定方式,修改nginx启动的work进程为自动。
worker_processes  auto;
worker_cpu_affinity auto;
3.查看绑定cpu
[root@web01 ~]# ps -eo pid,args,psr|grep [n]ginx
  1242 nginx: master process /usr/   2
  1243 nginx: worker process         0
  1244 nginx: worker process         1
  1245 nginx: worker process         2
  1246 nginx: worker process         3

通用优化配置

网上 高并发优化参考 https://www.cnblogs.com/aaron-agu/p/12317211.html

	#设置一个不用登陆的统一用户
groupadd -g 666 www
useradd -u 666 -g 666 -Ms /sbin/nologin www
	#创建一个目录,并给他授权
mkdir /web
chown -R www.www /web

1#设置主配置文件
[root@web01 ~]# vim /etc/nginx/nginx.conf 
#------------------------------核心模块--------------------------------
	#用户原来是nginx,替换为前面设置的用户和用户组
user  www www;
worker_processes auto;      #启动的worker数量与cpu核心数一致即可,或者 auto
worker_cpu_affinity auto;   #cpu亲和,多核时使用
	#日志级别有:	debug/info/notice/warn/error/crit/alter/emerg
	#每个级别含义	调试 | 信息 | 通知 |警告| 错误| 临界| 改变| 紧急状态
	#设置日志级别为warn【表示会记录warn/error/crit/alter/emerg】
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
	#每个worker能打开的文件描述符,调整至1w以上,负荷较高建议2-3w
worker_rlimit_nofile 35535;

#------------------------------事件驱动模块-----------------------------
#表示核心模块中的每一个worker_processes  1;同一时间可以进行1024次连接
events {
    use epoll;                  #使用epoll高效网络模型【如果不写默认就是这个】
    worker_connections  1024;	#限制每个进程能处理多少个连接
}

#-----------------------------http内核模块-----------------------------
http {
	#包含在mime.types文件内的类型都会显示在网页中
    include       /etc/nginx/mime.types;
    #默认不包含在mime.types文件内的类型都会进行下载
    default_type  application/octet-stream;
    charset 'utf-8,gbk';	#统一使用utf-8和gbk字符集

	#日志格式内容设置 main
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    #日志格式内容设置 json_access
    log_format json_access '{"@timestamp":"$time_iso8601",'
                      '"host":"$server_addr",'
                      '"clientip":"$remote_addr",'
                      '"size":$body_bytes_sent,'
                      '"responsetime":$request_time,'
                      '"upstreamtime":"$upstream_response_time",'
                      '"upstreamhost":"$upstream_addr",'
                      '"http_host":"$host",'
                      '"url":"$uri",'
                      '"domain":"$host",'
                      '"xff":"$http_x_forwarded_for",'
                      '"referer":"$http_referer",'
                      '"status":"$status"}';

	#日志设置路径及包含内容为 main 中的内容
    access_log  /var/log/nginx/access.log  main;

    server_tokens off;  #禁止浏览器显示nginx版本号
    client_max_body_size 200m;  #文件上传大小限制调整
    
	#优化部分【分别在动静分离的web服务器上设置,2种设置要分开】
    #文件高效传输,静态资源服务器建议打开
    sendfile            on;
    tcp_nopush          on;		#【网页内容都拿到了,再一次性推送给用户】
    
    #文件实时传输,动态资源服务建议打开,需要打开keepalive【查看多少就传送多少数据】
    tcp_nodelay         on;
	#保持长连接的时间65秒限制【建议使用】
    keepalive_timeout	65;

	#网页的内容是否进行压缩【图片压缩不明显,文字压缩效果才明显】
    gzip  on;
    #gzip_disable "MSIE [1-6]\.";    #针对IE浏览器1-6版本,不进行压缩,一般不用
    gzip_http_version 1.1;	#gzip通过http1.1协议传输
    gzip_comp_level 5;      #压缩级别
    gzip_buffers 16 8k;     #压缩的缓冲区
    gzip_min_length 1024;   #文件大于1024字节才进行压缩,默认值20
    #压缩的文件类型
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript image/jpeg;

	#虚拟主机,包含每个网站的配置文件路径
	#/etc/nginx/conf.d/目录下的文件内容如果有冲突就会以文件名排名靠前的文件为准
    include /etc/nginx/conf.d/*.conf;
}

2、设置server层配置文件【路径就是上方主配置文件中的,文件名只要以.conf结尾就可以】
	#删除默认的server层配置文件
rm -f /etc/nginx/conf.d/default.conf
	#根据需要编辑一个新的server层配置文件
vim /etc/nginx/conf.d/web.conf
	#使用Server配置网站, 每个Server{}代表一个网站(简称虚拟主机)
	#一个文件中可以有多个server {} ,建议还是每个网站设置一个server {}
server {
	#监听端口, 默认80
    listen       80;
    #提供给用户访问的域名
    server_name  www.web01.com;
    
    #日志保存路径和保存内容【调用主配置main里面的设置】
    access_log /var/log/nginx/www.web01.com.log main;
    #支持的字符集,有时候不起作用,就需要在utf-8外面加上 ' ' 如下:
    charset 'utf-8,gbk';
            
    #控制网站访问路径
    location / {
    	#存放网站源代码的目录位置
        root   /code/html;
        #默认返回网站的文件
        index  index.html index.htm index.php;
    }
    #包含每个网站内的页面的文件【一般不用】
    #include /etc/nginx/location.d/*.conf
    #上传文件大小限制
    client_max_body_size 200m;
    
    #出现错误的时候根据返回值跳转到不同的页面
    error_page  404              /404.html;
    	location = /404.html {
        root   /usr/share/nginx/html;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    location ~ \.php$ {
        root /web/php;
        #关联的php软件的地址和端口
        fastcgi_pass 127.0.0.1:9000;
        #关联的页面
        fastcgi_index index.php;
        #关联的站点目录和PHP文件名
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        #包含的fastcgi模块的一些内容
        include fastcgi_params;
    }
}

# fastcgi_params 一般用在动态资源web服务器

# Nginx 的 fastcgi 模块提供了 fastcgi_param 指令来主要处理这些映射关系,下面 Nginx 的一个配置文件,其主要完成的工作是将 Nginx 中的变量翻译成 PHP 中能够理解的变量。
cat /etc/nginx/fastcgi_params

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# 脚本文件请求的路径,也就是说当访问127.0.0.1/index.php的时候,需要读取网站根目录下面的index.php文件,如果没有配置这一配置项时,nginx不回去网站根目录下访问.php文件,所以返回空白

fastcgi_param QUERY_STRING $query_string;            #请求的参数;如?app=123
fastcgi_param REQUEST_METHOD $request_method;        #请求的动作(GET,POST)
fastcgi_param CONTENT_TYPE $content_type;            #请求头中的Content-Type字段
fastcgi_param CONTENT_LENGTH $content_length;        #请求头中的Content-length字段。

fastcgi_param SCRIPT_NAME $fastcgi_script_name;      #脚本名称 
fastcgi_param REQUEST_URI $request_uri;              #请求的地址不带参数
fastcgi_param DOCUMENT_URI $document_uri;            #与$uri相同。 
fastcgi_param DOCUMENT_ROOT $document_root;          #网站的根目录。在server配置中root指令中指定的值 
fastcgi_param SERVER_PROTOCOL $server_protocol;      #请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
fastcgi_param  REQUEST_SCHEME     $scheme;			 #页面跳转?
fastcgi_param  HTTPS              $https if_not_empty;	#如果变量非空?

fastcgi_param GATEWAY_INTERFACE CGI/1.1;             #cgi 版本
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;  #nginx 版本号,可修改、隐藏

fastcgi_param REMOTE_ADDR $remote_addr;              #客户端IP
fastcgi_param REMOTE_PORT $remote_port;              #客户端端口
fastcgi_param SERVER_ADDR $server_addr;              #服务器IP地址
fastcgi_param SERVER_PORT $server_port;              #服务器端口
fastcgi_param SERVER_NAME $server_name; #服务器名,域名在server配置中指定的server_name

fastcgi_param PATH_INFO $path_info;                  #可自定义变量

-- PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;


# proxy_params 一般用在负载均衡服务器

vim /etc/nginx/proxy_params
proxy_set_header Host $http_host;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 60s;
proxy_read_timeout 60s;
proxy_send_timeout 60s;
proxy_buffering on;
proxy_buffer_size 8k;
proxy_buffers 8 8k;
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;

	#注释
proxy_set_header Host $http_host;	#带着客户访问的域名去访问后方服务器
proxy_http_version 1.1;				#使用http1.1版本协议去访问web服务器

#带着客户的IP告诉后方web服务器来访用户的IP是什么【多次跳转会累加】
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

#带着前端的ip告诉后方【多次跳转会覆盖,建议只配在第一层负载均衡服务器上】
#proxy_set_header X-Real-IP $remote_addr;

proxy_connect_timeout 60s;			#用户连接负载均衡超时时间
proxy_read_timeout 60s;				#负载均衡连接后端服务器的超时时间
proxy_send_timeout 60s;				#后端服务器返回上级服务器超时时间
proxy_buffering on;					#是否开启缓冲区

#设置读取从代理服务器接收的响应的第一部分的缓冲区的大小,这部分通常包含一个小的响应头,默认情况下,缓冲区大小等于一个内存页。这是4K还是8K,取决于平台。然而,它可以做得更小。
proxy_buffer_size 8k;
proxy_buffers 8 8k;					#设置缓冲区的数量和大小

#访问负载均衡后方主机如果出现错误就跳转另一台
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;

安全与优化总结

1、CPU亲和、worker进程数、调整每个worker进程打开的文件数

2、使用epoll网络模型、调整每个worker进程的最大连接数

3、文件的高效读取sendfile、nopush

4、文件的传输实时性、nodealy

5、开启tcp长连接,以及长连接超时时间keepalived

6、开启文件传输压缩gzip

7、开启静态文件expires缓存

8、隐藏nginx版本号

9、禁止通过ip地址访问,禁止恶意域名解析,只允许域名访问

10、配置防盗链、以及跨域访问

11、防DDOS、cc攻击,限制单IP并发连接,以及http请求

12、优雅显示nginx错误页面

13、nginx加密传输https优化

14、nginx proxy_cache、fastcgi_cache、uwsgi_cache 缓存,第三方工具(squid、varnish)

优化总结

1.硬件
	nginx作为代理服务器,需要提高他的内存和cpu
	nginx作为静态文件服务器,需要配置很大的磁盘
2.网络
	带宽给的大一些
	丢包处理
3.系统
	打开文件句柄数
	长链接time_wait端口重用【一定要做】
4.应用
	nginx作为代理,配置长链接
5.服务
	nginx作为静态网站:静态缓存、静态资源读取、静态资源压缩、防盗链、跨域访问、cpu亲和

Nginx 应用场景

静态服务		代理服务		安全服务		流行架构
浏览器缓存		协议类型		访问控制		Nginx+PHP(fastcgi_pass)LNMP
防资源盗用		正向代理		访问限制		Nginx+java(proxy_pass)LNMT
资源分类		反向代理		流量限制		 Nginx+Python(uwsgi_pass)
资源压缩		负载均衡		拦截攻击		
资源缓存		代理缓存		拦截异常请求		
跨域访问		动静分离		拦截SQL注入		
Logo

更多推荐