Linux云计算架构-nginx调优

Linux云计算架构-nginx调优

1. 修改源码隐藏版本号[编译安装前]

# 查看nginx版本及其安装的模块
[root@master ~]# nginx -V
nginx version: nginx/1.19.2
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) 
configure arguments: --prefix=/usr/local/nginx --with-http_dav_module --with-http_stub_status_module --with-http_addition_module --with-http_sub_module --with-http_flv_module --with-http_mp4_module --with-pcre=/usr/local/src/pcre-8.41 --user=nginx --group=nginx
[root@master ~]# nginx -v
nginx version: nginx/1.19.2

# 无隐藏版本信息,查询如下:
[root@master ~]# curl -I 192.168.8.184
HTTP/1.1 200 OK
Server: nginx/1.19.2
Date: Tue, 25 Aug 2020 04:02:21 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 25 Aug 2020 01:43:48 GMT
Connection: keep-alive
ETag: "5f446cd4-264"
Accept-Ranges: bytes

# 编译前隐藏nginx版本号信息,修改三个源码文件
# 修改nginx版本号和软件名称
[root@master ~]# cat -n /usr/local/src/nginx-1.19.2/src/core/nginx.h
    13	#define NGINX_VERSION      "1.19.2"
    14	#define NGINX_VER          "nginx/" NGINX_VERSION

# 修改HTTP头信息中的connection字段,防止回显具体版本号
# nginx
[root@master ~]# cat -n /usr/local/src/nginx-1.19.2/src/http/ngx_http_header_filter_module.c
    49	static u_char ngx_http_server_string[] = "Server: nginx" CRLF;
    
# Nginx报404错误时,不回显版本号。
# nginx
[root@master ~]# cat -n /usr/local/src/nginx-1.19.2/src/http/ngx_http_special_response.c 
    36	"<hr><center>nginx</center>" CRLF

2. 修改nginx运行用户

[root@master ~]# cat -n /usr/local/nginx/conf/nginx.conf
     1	
     2	user  nginx nginx;   # 运行用户及其用户组
# 动态加载nginx配置文件
[root@master ~]# /usr/local/nginx/sbin/nginx -s reload
# 可以看到运行用户已经改为nginx了
# master process  nginx主进程,用于管理nginx的worker进程
# worker process  nginx的工作进程,为用户提供服务
[root@master ~]# ps aux | grep nginx
root      29079  0.0  0.0  18256   644 ?        Ss   09:51   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx     29080  0.0  0.0  20700  1904 ?        S    09:51   0:00 nginx: worker process
root      31171  0.0  0.0 112728   984 pts/1    S+   12:18   0:00 grep --color=auto nginx

3. 设置nginx的cpu亲和力

# 查看cpu内核数量,这里是8核的cpu
[root@master ~]# grep process /proc/cpuinfo 
processor	: 0
processor	: 1
processor	: 2
processor	: 3
processor	: 4
processor	: 5
processor	: 6
processor	: 7
[root@master ~]# grep process /proc/cpuinfo | wc -l
8

# 修改worker_processes为8个工作进程
[root@master ~]# vim /usr/local/nginx/conf/nginx.conf
  3 worker_processes  8;
[root@master ~]# /usr/local/nginx/sbin/nginx -s reload
# 可以看到有8个工作进程
[root@master ~]# ps aux | grep nginx
root      22550  0.0  0.1  18296  1400 ?        Ss   16:12   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx     23876  0.0  0.1  20792  1404 ?        S    17:13   0:00 nginx: worker process
nginx     23877  0.0  0.1  20792  1404 ?        S    17:13   0:00 nginx: worker process
nginx     23878  0.0  0.1  20792  1396 ?        S    17:13   0:00 nginx: worker process
nginx     23879  0.0  0.1  20792  1416 ?        S    17:13   0:00 nginx: worker process
nginx     23881  0.0  0.1  20792  1416 ?        S    17:13   0:00 nginx: worker process
nginx     23883  0.0  0.1  20792  1416 ?        S    17:13   0:00 nginx: worker process
nginx     23884  0.0  0.1  20792  1416 ?        S    17:13   0:00 nginx: worker process
nginx     23885  0.0  0.1  20792  1416 ?        S    17:13   0:00 nginx: worker process
root      23890  0.0  0.0 112724   988 pts/0    S+   17:13   0:00 grep --color=auto nginx

# 查看进程父子关系
[root@master ~]# pstree -p | grep nginx
           |-nginx(22550)-+-nginx(23876)
           |              |-nginx(23877)
           |              |-nginx(23878)
           |              |-nginx(23879)
           |              |-nginx(23881)
           |              |-nginx(23883)
           |              |-nginx(23884)
           |              `-nginx(23885)
# 为配置cpu亲和力,测试如下,可以看到23876这个工作进程可以在8个cpu上面运行,即cpu上下文会进行切换,带来额外开销。
[root@master ~]# taskset -cp 23876
pid 23876's current affinity list: 0-7

# 设置cpu的亲和力,即是把每个nginx工作进程绑定到固定的cpu上,从而减少cpu上下文切换导致的额外开销。
# 8核设置如下:
  2 user  nginx;
  3 worker_processes  8;
  4 worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;

 # 4核设置如下:
worker_cpu_affinity 0001 0010 0100 1000;

[root@master ~]# /usr/local/nginx/sbin/nginx -s reload
# 可以看到每个工作进程都只能使用1个cpu
[root@master ~]# pstree -p | grep nginx
           |-nginx(22550)-+-nginx(24183)
           |              |-nginx(24185)
           |              |-nginx(24186)
           |              |-nginx(24187)
           |              |-nginx(24188)
           |              |-nginx(24189)
           |              |-nginx(24190)
           |              `-nginx(24191)
[root@master ~]# taskset -cp 24183
pid 24183's current affinity list: 0
[root@master ~]# taskset -cp 24190
pid 24190's current affinity list: 6

4. 设置每个worker进程最多打开的文件数

# 1个nginx工作进程最多可以打开的文件数=最多打开的文件数/nginx工作进程数,即(ulimit -n)/worker_processes
# 查看最多可以打开的文件数
[root@master ~]# ulimit -n
1024

# 修改最大进程数和最大文件数,退出当前终端即可生效。
[root@master ~]# vim /etc/security/limits.conf
* soft noproc 102400
* hard noproc 102400
* soft nofile 102400
* hard nofile 102400
# 临时生效
[root@master ~]# ulimit -n 102400
[root@master ~]# ulimit -n
102400

# 修改nginx配置文件的1个工作进程最多可以打开的文件数为102400,一般与ulimit -n相同。
[root@master ~]# vim /usr/local/nginx/conf/nginx.conf
  5 worker_rlimit_nofile 102400;

5. 修改nginx事件处理模型和单个进程最大连接数

nginx下的IO多路复用有三种机制,分别是selectpollepoll。IO多路复用通过某一种机制,监视多个描述符,当某个描述符就绪,就会通知程序对齐进行读写操作。

epoll的优点:
无最大并发连接的限制,上限是最大可以打开文件的数目。该数字一般大于2048与内存有关

# epoll上限具体数值
[root@master ~]# cat /proc/sys/fs/file-max 
377834f

②epoll只在乎活跃的连接有多少,而不在乎连接总数有多少。故效率远高于其他两种机制。可以看作是共享内存

# 修改IO多路复用的机制
 16 events {
    
    
 17     use epoll;
 18     worker_connections  102400;
 19 }
# worker_connections:指单个工作进程可以允许同时建立外部连接的数量。无论这个连接外部主动建立的,还是内部建立的。一个工作进程建立一个连接后,进程将打开一个文件副本。
# worker_connections的值还受限于操作系统ulimit -n设定的值和nginx的worker_connections 的值。一般情况下,ulimit -n、worker_rlimit_nofile、worker_connections三者的值是一样的。 
[root@master ~]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@master ~]# /usr/local/nginx/sbin/nginx -s reload

# 查看下每个nginx进程占用内存的大小。为42096kb。
[root@master ~]# top -u nginx
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND  
  9562 nginx     20   0  221208   6640   1324 S   0.0  0.2   0:00.02 php-fpm      
  9565 nginx     20   0  221208   6640   1324 S   0.0  0.2   0:00.02 php-fpm      
 21598 nginx     20   0   61292  42096    748 S   0.0  1.1   0:00.29 nginx        
 21599 nginx     20   0   61292  42096    748 S   0.0  1.1   0:00.29 nginx        
 21600 nginx     20   0   61292  42096    748 S   0.0  1.1   0:00.32 nginx        
 21601 nginx     20   0   61292  42096    748 S   0.0  1.1   0:00.28 nginx        
 21602 nginx     20   0   61292  42096    748 S   0.0  1.1   0:00.29 nginx        
 21603 nginx     20   0   61292  42096    748 S   0.0  1.1   0:00.30 nginx        
 21604 nginx     20   0   61292  42096    748 S   0.0  1.1   0:00.30 nginx        
 21605 nginx     20   0   61292  42096    748 S   0.0  1.1   0:00.29 nginx  

6. 修改ServerName和location

# ServerName可以写什么?这里建议写IP地址或精准匹配
①精准匹配   www.abong.com
②左模糊     *.abong.com
③右模糊     www.*
④正则表达式  
⑤default_server
⑥服务IP地址   192.168.8.184

# 修改ServerName
[root@master ~]# vim /usr/local/nginx/conf/nginx.conf
 40     server {
    
    
 41         listen       80;
 42         server_name  192.168.8.184;
[root@master ~]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@master ~]# /usr/local/nginx/sbin/nginx -s reload
# location匹配
=    绝对匹配
^~   url前半部分匹配,不进行正则
~    正则匹配,区分大小写
~*   正则匹配,不区分大小写
\    转义
*    任意字符
$    以什么结尾

# ~ \.php$    匹配url以php结尾的文件,且区分大小写
# 注释取消掉,然后该脚本文件名为$document_root
[root@master ~]# vim /usr/local/nginx/conf/nginx.conf
 70         location ~ \.php$ {
    
    
 71             root           html;
 72             fastcgi_pass   127.0.0.1:9000;
 73             fastcgi_index  index.php;
 74             fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
 75             include        fastcgi_params;
 76         }

7. 开启高效传输模式

[root@master ~]# vim /usr/local/nginx/conf/nginx.conf
 32     sendfile       on;    # 开启高效文件传输模式。on表示调用sendfile函数来发送文件;
# 普通应用为on,磁盘IO负载中设为off。图片显示不正常设为off;
 33     tcp_nopush     on;    # 当sendfile为on时,防止网络阻塞,积极减少网络报文段数量
 
# tcp_nopush on; #防止网络阻塞
# tcp_nodelay on; #防止网络阻塞

8. 设置连接超时时间

keepalive_timeout的设置主要是为了保护服务器资源【cpu、内存、控制连接数】。客户端和服务器之间建立连接,会消耗服务器资源,该参数的设置是为了断掉那些处于等待状态的连接,以释放服务器资源。

[root@master ~]# vim /usr/local/nginx/conf/nginx.conf
 36     keepalive_timeout  65;   # 客户端连接保持会话的时间,单位s
 37     tcp_nodelay on;    # 防止网络阻塞,在keepalive_timeout下才有效
 38     client_header_timeout 15;    # 客户端请求头读取超时时间,超时将返回request time out的错误。
 39     client_body_timeout 15;     # 客户端请求主体超时时间,超时将返回request time out的错误。
 40     send_timeout 15;   # 客户端响应时间,两次活动的时间间隔超过这个时间,nginx将断开连接。

# 当客户端停止访问时,允许nginx服务器关闭连接,释放socket资源。
reset_timedout_connection on;
# 可以设置php上传附件的文件大小
client_max_body_size 10m;

[root@master ~]# nginx -t
[root@master ~]# /usr/local/nginx/sbin/nginx -s reload

9. fastcgi调优

fastcgi是一种协议,规定了fastcgi应用和支持fastcgi的web服务器之间的接口。fastcgi是动态服务和静态服务的接口,以二进制连续传递。目的是为了改善网站的性能,减少资源占用,提高访问速度。

cache 写入缓存区
buffer 读取缓存区
fastcgi 动态服务和静态服务的接口

# fastcgi各参数介绍
fastcgi_connect_timeout 300;   #指定链接到后端FastCGI的超时时间。
fastcgi_send_timeout 300;      #向FastCGI传送请求的超时时间,这个值是指已经完成两次握手后向 FastCGI传送请求的超时时间。
fastcgi_read_timeout 300;      #指定接收FastCGI应答的超时时间,这个值是指已经完成两次握手后接收 FastCGI应答的超时时间。
fastcgi_buffer_size 64k;       #指定读取FastCGI应答第一部分需要用多大的缓冲区,这个值表示将使用1个64KB的缓冲区读取应答的第一部分(应答头),可以设置为gastcgi_buffers选项指定的缓冲区大小.
fastcgi_buffers 4 64k;         #指定本地需要用多少和多大的缓冲区来缓冲FastCGI的应答请求,如果一个php脚本所产生的页面大小为256KB,那么会分4个64KB的缓冲区来缓存,如果页面大小大于256KB,那么大于256KB的部分会缓存到fastcgi_temp_path指定的路径中,但是这并不是好方法,因为内存中的数据处理速度要快于磁盘。一般这个值应该为站点中php脚本所产生的页面大小的中间值,如果站点大部分脚本所产生的页面大小为 256KB,那么可以把这个值设置为“8 16K”、“4 64k”等。
fastcgi_busy_buffers_size 128k;     #建议设置为fastcgi_buffer的两倍,繁忙时候的buffer。
fastcgi_temp_file_write_size 128k;  #在写入磁盘fastcgi_temp指定的路径时,将用多大的数据库容量,默认值是fastcgi_buffers的两倍,设置上述数值设置小时若负载上来时可能报502Bad Gatewnay。
fastcgi_cache ngnix;                 #表示开启FastCGI缓存并为其指定一个名称。开启缓存非常有用,可以有效降低CPU的负载,并且防止502的错误发生,但是开启缓存也可能会引起其他问题,要很据具体情况选择。
fastcgi_cache_valid 200 302 1h;     #用来指定应答代码的缓存时间,实例中的值表示将200和302应答缓存一小时,要和fastcgi_cache配合使用。应答代码即使状态码。
fastcgi_cache_valid 301 1d;         #将301应答缓存一天。
fastcgi_cache_valid any 1m;         #将其他应答缓存为1分钟。
fastcgi_cache_min_uses 1;           #请求的数量。请求1次就不再缓存。
fastcgi_cache_path /tmp/nginx_cache                  #定义缓存的路径。
fastcgi_temp_path /tmp/nginx_cache  # 定义临时缓存路径,用于缓存大于fastcgi_buffers的部分,一般不用。
fastcgi_cache_use_stale
fastcgi_cache_key
keys_zone=nginx:512m        # 定义缓存区域名称,缓存大小为512m
inactive=1d max_size=5G;    # 不活动的数据缓存1天,缓存大小为5G。

实战设置:

# location匹配
=    绝对匹配
^~   url前半部分匹配,不进行正则
~    正则匹配,区分大小写
~*   正则匹配,不区分大小写
\    转义
*    任意字符
$    以什么结尾

#http标签下生产设置: 
    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 128k;
    fastcgi_cache_path /tmp/nginx_cache levels=2:2
    keys_zone=nginx:512m
    inactive=1d max_size=5G;
# location匹配
=    绝对匹配
^~   url前半部分匹配,不进行正则
~    正则匹配,区分大小写
~*   正则匹配,不区分大小写
\    转义
*    任意字符
$    以什么结尾

# server下location生产设置:
        location ~ .*\.(php|php5)?$
        {
    
    
         fastcgi_pass 127.0.0.1:9000;
         fastcgi_index index.php;
         include fastcgi.conf;
         fastcgi_cache nginx;
         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配置文件。
[root@master ~]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@master ~]# /usr/local/nginx/sbin/nginx -s reload

10. gzip压缩网页调优

使用gzip压缩功能,节约带宽,节约成本,加快传输速度,让用户有更好的体验。但是使用gzip压缩是会消耗cpu的,故cpu较大时使用该gzip功能较合适。
nginx启用压缩功能需要加载ngx_http_gzip_module模块;
apache启动压缩功能需要加载mod_deflate模块。
【压缩:文本、js、html、css】
【不压缩:图片、视频、flash】

gzip on;                #开启压缩功能。 
gzip_min_length  1k;    #设置允许压缩的页面最小字节数,页面字节数从header头的Content-Length(内容长度)中获取,默认值是0,不管页面多大都进行压缩,建议设置成大于1K,如果小与1K可能会越压越大。 gzip_buffers     4 32k; #压缩缓冲区大小,表示申请4个单位为 32K的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果。 
gzip_http_version 1.1;  #压缩版本(默认1.1,前端为squid2.5时使用1.0)用于设置识别HTTP协议版本,默认是 1.1,目前大部分浏览器已经支持GZIP解压,使用默认即可。 
gzip_comp_level 9;      #压缩比例,用来指定GZIP压缩比,1压缩比最小,处理速度最快,9压缩比最大,传输速度快,但是处理慢,也比较消耗CPU资源。
gzip_types  text/css text/xml application/javascript;   #用来指定压缩的类型,‘text/html’ 类型总是会被压缩.
gzip_vary on;            #vary header支持,该选项可以让前端的缓存服务器缓存经过GZIP压缩的页面,例如用Squid缓存经过nginx压缩的数据。 
# 生产设置:
[root@master ~]# vim /usr/local/nginx/conf/nginx.conf
    gzip on;
    gzip_min_length  1k;
    gzip_buffers     4 32k;
    gzip_http_version 1.1;
    gzip_comp_level 9;
    gzip_types  text/css text/xml application/javascript;
    gzip_vary on;
[root@master ~]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is succes
[root@master ~]# /usr/local/nginx/sbin/nginx -s reload

11. expires缓存调优

对图片、css、js等更新频率较低的元素使用缓存,第一次加载慢一点,但是第二次就会很快了。

扫描二维码关注公众号,回复: 11710721 查看本文章

不希望缓存的内容:
①广告图片
②网络流量统计工具
③更新频繁的文件

# location匹配
=    绝对匹配
^~   url前半部分匹配,不进行正则
~    正则匹配,区分大小写
~*   正则匹配,不区分大小写
\    转义
*    任意字符
$    以什么结尾

# 以下缓存设置都是在server下设置
# 对某种类型的文件进行缓存
       location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
        {
    
           
         expires      365d;
        }
        location ~ .*\.(js|css)?$ 
        {
    
            
        expires      30d;
        }

# 对某个目录下的文件进行缓存
        location ~ ^/(images|javascript|js|css|flash|media|static)/
        {
    
            
        expires 360d;
        }

# 对某个文件进行缓存
        location ~(test.txt) 
        {
    
    
        expires 7d;
        break;
        }

缓存的优缺点:

优点:缩短服务的响应时间、减轻服务器负担、减少网络带宽使用量,降低企业成本。

缺点:若被缓存的内容更新了,客户端无法及时看到最新的内容。

解决方法:缩短缓存时间、更改缓存对象的名字、客户端可通过清理缓存看到最新的内容。

12. nginx日志优化

12.1 日志切割优化

对访问日志和错误日志一天一压缩,仅保留10天数据。

# 时间调整
[root@master ~]# date
2020年 08月 26日 星期三 14:45:24 CST
[root@master ~]# echo $(date +%F)
2020-08-26
[root@master ~]# echo $(date +%F -d -1day)
2020-08-25
[root@master ~]# echo $(date +%F -d 1day)
2020-08-27
[root@master logs]# cd /usr/local/nginx/logs/
[root@master logs]# vim log_cut.sh
#!/bin/bash
# 日志切割脚本
date=$(date +%F -d -1day)
cd /usr/local/nginx/logs
if [ ! -d cut ] ; then
 mkdir cut
fi
mv access.log cut/access_$(date +%F -d -1day).log
mv error.log cut/error_$(date +%F -d -1day).log
/usr/local/nginx/sbin/nginx -s reload
tar -cjvf cut/$date.tar.bz2 cut/*
rm -rf cut/access* && rm -rf cut/error*
cat >>/var/spool/cron/root<<eof
00 00 * * * /bin/sh /usr/local/nginx/logs/cut_nginx_log.sh >/dev/null 2>&1
eof
find -type f -mtime +10 | xargs rm -rf

[root@master logs]# chmod +x log_cut.sh

不把图片信息记录到访问日志中:

[root@master logs]# vim /usr/local/nginx/conf/nginx.conf
        location ~ .*\.(js|jpg|jpeg|JPG|JPEG|css|bmp|gif|GIF)$ {
    
    
         access_log off;
        }
[root@master logs]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

日志目录权限优化:

[root@master ~]# chown -R root:root /usr/local/nginx/logs/
[root@master ~]# chmod -R 777 /usr/local/nginx/logs/

日志格式优化:

# 访问日志格式:
# 日志格式取消注释即可
log_format  access  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

1.$remote_addr$http_x_forwarded_for用以记录客户端的ip地址;
2.$remote_user:用来记录客户端用户名称;
3.$time_local:用来记录访问时间与时区;
4.$request:用来记录请求的url与http协议;
5.$status:用来记录请求状态,正常是200;
6.$body_bytes_s ent :记录发送给客户端文件主体内容大小;
7.$http_referer:用来记录从哪个页面链接访问过来的;
8.$http_user_agent:记录客户端浏览器的相关信息;

# 定义日志存放路径:
# access_log 路径 日志级别
access_log  logs/nginx/access.log main
access_log  logs/host.access.404.log  log404;

12.2 目录文件访问控制

主要功能是禁止目录下指定文件被访问,也可以是禁止所有文件被访问。

# 拒绝所有人访问images目录下的某些文件
[root@master ~]# vim /usr/local/nginx/conf/nginx.conf
		location ~ ^/images/.*\.(php|php5|.sh|.py|.pl)$
        {
    
    
        deny all;
        }
[root@master ~]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@master ~]# /usr/local/nginx/sbin/nginx -s reload
[root@master ~]# mkdir /usr/local/nginx/html/images/
[root@master ~]# echo "<?php phpinfo(); ?>" >> /usr/local/nginx/html/images/index.php
[root@master ~]# ll /usr/local/nginx/html/images/index.php
-rw-r--r--. 1 root root 20 8月  26 15:00 /usr/local/nginx/html/images/index.php

访问网站:http://192.168.8.184/images/index.php,如果看到以下界面,应该就是未安装php。
在这里插入图片描述
在这里插入图片描述
如果安装了php的,未拒绝应该会显示如下界面:
在这里插入图片描述
设置了拒绝,应该显示如下:
在这里插入图片描述
如果显示正常,可以检查下location是不是有允许php的。

# d1目录和d2目录下的文件被拒绝访问
        location ~ ^/images/(d1|d2)/.*\.(php|php5|.sh|.py|.py)$
        {
          deny all;
        }

# 访问txt文件或doc文件,会被重定向到百度
        location ~* \.(txt|doc)$
        {
        if ( -f $request_filename) {
        root /usr/local/nginx/html;
        rewrite ^/(.*)$ http://www.baidu.com last;
        break;
        }
        }
        
# 访问test1下的内容,则返回404
# 访问test2下的内容,则返回403
       location /test1/ { return 404 ; }
       location /test2/ { return 403 ; }
        
# 不允许访问test下的内容
        location ~ ^/(test)/ {
        deny all;
        }

12.3 来源访问控制

需要ngx_http_access_module模块支持,默认安装。

# 拒绝192.168.8.网段的主机访问test目录下的内容
        location ~ ^/(test)/ {
    
    
        allow 192.168.8.0/24;
        deny all;
        }

# 拒绝192.168.8.网段的主机访问网站
        location / {
    
    
        allow 192.168.8.0/24;
        deny all;
        }

# 当192.168.8.185访问网站时,显示404
        location / {
    
    
          if ( $remote_addr = 192.168.8.185 )
          {
    
    
            return 404;
          }
        }

13. 禁止使用IP访问网站

# 使用IP访问,跳转到百度
    server {
        listen       80;
        server_name  192.168.8.184;
        rewrite ^ http://www.baidu.com$request_uri?;

# 使用IP访问,跳转到403
    server {
        listen       80;
        server_name 192.168.8.184;
        return 403;

# 301跳转,使用域名访问。
# abong.com会跳转到www.abong.com
        listen       80;
        root /usr/share/nginx/html/;
        server_name www.abong.com abong.com;
        if ($host = 'abong.com'){
        rewrite ^/(.*)$http://www.abong.com/$1 permanent;
        }

14. 防盗链

防止别人直接从你的网站引用图片等链接,消耗服务器的资源和网络流量。
解决方法:
①图片加水印
②防火墙,控制访问IP
③防盗链策略

# 访问图片返回404
        location ~* \.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ {
    
    
        valid_referers none blocked *.abong.com abong.com;
          if ($invalid_referer) {
    
    
          return 404;
          }
        }
        
# 访问图片重定向到其他页面(跳转页面)
        location ~* \.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ {
    
    
        valid_referers none blocked *.abong.com abong.com;
          if ($invalid_referer) {
    
    
          rewrite ^/ http://www.abong.com/img/nolink.png;
          }
        }
# 在server中设置错误页面
# error_page 状态码 页面
 error_page  404   /404.html;

15. 开启登录认证功能

# 修改nginx配置文件,支持登录认证功能。
[root@master ~]# vim /usr/local/nginx/conf/nginx.conf
        location / {
    
    
            root   html;
            auth_basic "my site";
            auth_basic_user_file /usr/local/nginx/conf/passwd;
            index  index.html index.htm;
        }
# 创建登录用户,需要httpd-tools包支持
[root@master ~]# yum install httpd-tools -y
[root@master ~]# htpasswd -cm /usr/local/nginx/conf/passwd abong
New password: 
Re-type new password: 
Adding password for user abong
[root@master ~]# htpasswd -m /usr/local/nginx/conf/passwd test
New password: 
Re-type new password: 
Adding password for user test
[root@master ~]# cat  /usr/local/nginx/conf/passwd
abong:$apr1$leIUQGWv$.SgSU6/.xP6k0TAOfQMOJ/
test:$apr1$BHgJNkv0$.nEDOO/ciGK0reU2SLOMK.

# 设置密码文件权限,只允许nginx用户读
[root@master ~]# chmod 400 /usr/local/nginx/conf/passwd
[root@master ~]# chown nginx:nginx /usr/local/nginx/conf/passwd
[root@master ~]# /usr/local/nginx/sbin/nginx -s reload

# 如果没有显示认证界面,注意是不是location配置冲突了。

在这里插入图片描述

16. 防止DDOS攻击

DDOS攻击即洪水攻击,指的是网站同一时刻被访问了很多次,占用了大量的系统资源。这里限制某一时刻客户端与服务端只能建立1次连接。

# 需要加载ngx_http_limit_conn_module模块,默认是没有的。这里就不演示了,生产环境中常用防火墙去控制。
[root@master ~]# cd /usr/local/src/nginx-1.19.2/
[root@master nginx-1.19.2]# ./configure --help | grep limit
  --without-http_limit_conn_module   disable ngx_http_limit_conn_module
  --without-http_limit_req_module    disable ngx_http_limit_req_module
  --without-stream_limit_conn_module disable ngx_stream_limit_conn_module

# 限流设置如下:
[root@master ~]# vim /usr/local/nginx/conf/nginx.conf
# http标签设置
    limit_conn_zone $binary_remote_addr zone=addr:10m;   # 定义一个以源IP地址为标识的限制连接区域(共享内存区),区域名为addr,区域大小为10m

# server设置
        location / {
    
    
            root   html;
            limit_conn addr 1;     # 限制连接1次,即每次只能建立一次连接。
            index  index.html index.htm;
        }
[root@master ~]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

# 一秒并发2次连接,一次成功连接200,一次丢失请求503
[root@master ~]# ab -c 2 -t 1 http://192.168.8.184/test/index.html

# 可以通过访问日志查看
 tail -f /usr/local/nginx/logs/access.log

17. 反向代理参数说明

# location块可对指定目录或者文件进行访问控制
# proxy_set_header设置请求头所包含的内容
# 以下配置是反向代理的标准配置,需要设置3个proxy_set_header
location / {
    
    
	index  index.html index.htm index.jsp;     # 支持代理的文件类型。
	proxy_pass      http://192.168.8.184;      # 后端服务器地址或者后端服务器集群地址
	proxy_set_header Host $host:$server_port;  # 代理服务器的主机名和端口号,默认是proxy_pass的值。
	proxy_set_header X-Real-IP $remote_addr;   # 从web服务器上获取远程客户端的IP地址
	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;    # 获取远程客户端IP地址
}

18. 其他参数说明

# 错误日志格式:
# error_log 路径 日志级别
#日志级别:[ debug | info | notice | warn | error | crit ]
error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

# nginx进程文件
pid        logs/nginx.pid;

# 配置http服务器
http{
    
    
   server_tokens off;  # 隐藏nginx版本信息
   include       mime.types;  # 文件扩展名与文件类型映射表
   default_type  application/octet-stream;   # 默认文件类型
   #charset utf-8;  # 默认编码
   # server_names_hash_bucket_size 128; # 服务器名字的hash表大小
   # client_header_buffer_size 32k;     # 上传文件大小限制
   server {
    
           # 一个server就是一个虚拟主机
   		listen   80;  # 监听端口号
   		server_name 192.168.8.184;   # 域名,存在多个可用空格隔开。
   		client_header_buffer_size 4k;   # 客户端请求头部的缓冲区大小,小头
   		large_client_header_buffers 4 128k;   # 客户端请求头部的缓冲区大小,大头
   		client_max_body_size 300m;   # 允许客户端请求的最大单文件字节数
   		client_body_buffer_size 128k;  # 缓冲区代理缓冲客户端请求的最大字节数
		proxy_connect_timeout 600;   # nginx与后端服务器连接超时时间
		proxy_read_timeout 600;  # 连接成功后,后端服务器响应时间
		proxy_send_timeout 600;  # 连接成功后,请求发送到后端服务器超时时间
		proxy_buffer_size 64k;   # nginx代理服务器报错用户头信息的缓冲区大小
		proxy_buffers   4 32k;   # 缓冲区大小,4个32k的空间
		proxy_busy_buffers_size 64k;   # 高负荷下缓冲区大小,一般为proxy_buffers的2倍
		proxy_temp_file_write_size 64k;   # 设置缓存文件夹大小,大于这个值,直接从upstream后端服务器传数据。
		
# proxy_temp_path和proxy_cache_path要在同一分区
		proxy_temp_path  /data/proxy_temp_dir       # 临时文件存放路径
		proxy_cache_path /data/proxy_cache_dir      # 缓冲文件存放路径

# 内存缓冲空间名为cache_one,大小为200M,缓存时间为1天。
# 硬盘缓存空间大小为30G
		keys_zone=cache_one:200m inactive=1d max_size=30g;
	
		client_body_buffer_size 512k;    # 客户端请求页面主体大小,默认是系统页面大小的2倍,8k或者16k。
		proxy_intercept_errors on;   # 是否使用nginx拦截应答代码为400及以上应答。
		location /nginxstatus{
    
        # location块设置
			stub_status on;  # 获取nginx状态
			access_log on;   # 把nginx状态信息记录到访问日志中
		}
   }
}

以上就是nginx调优的基本内容了,具体使用还是要结合生产环境实验。
授人以鱼不如授人以渔!!!nginx调优很重要!!!

猜你喜欢

转载自blog.csdn.net/weixin_36522099/article/details/108278459