Nginx安全&&调优

Nginx安全&&调优

1、隐藏版本号

编译前修改源码
[root@study nginx-1.16.1]# vim src/core/nginx.h 	
更改如下行即可
 13 #define NGINX_VERSION      "1.16.1"
 14 #define NGINX_VER          "nginx/" NGINX_VERSION

[root@study nginx-1.16.1]# vim src/http/ngx_http_header_filter_module.c 
修这一行Server:后的名称即可
 49 static u_char ngx_http_server_string[] = "Server: nginx" CRLF;

2、修改用户

[root@study ~]# vim /usr/local/nginx/conf/nginx.conf
 user  nginx;
[root@study ~]# useradd -M -s /sbin/nologin nginx
[root@study ~]# /usr/local/nginx/sbin/nginx -s reload
[root@study ~]# lsof -i :80
COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nginx   7890  root    6u  IPv4  38505      0t0  TCP *:http (LISTEN)
nginx   7942 nginx    6u  IPv4  38505      0t0  TCP *:http (LISTEN)

3、修改nginx运行个数(Nginx运行进程个数一般我们设置CPU的核心或者核心数x2)

[root@study ~]# vim /usr/local/nginx/conf/nginx.conf
3 worker_processes  1;-->worker_processes  4;
[root@study ~]# /usr/local/nginx/sbin/nginx -s reload
[root@study ~]# lsof -i :80
COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nginx   7890  root    6u  IPv4  38505      0t0  TCP *:http (LISTEN)
nginx   7947 nginx    6u  IPv4  38505      0t0  TCP *:http (LISTEN)
nginx   7948 nginx    6u  IPv4  38505      0t0  TCP *:http (LISTEN)
nginx   7949 nginx    6u  IPv4  38505      0t0  TCP *:http (LISTEN)
nginx   7950 nginx    6u  IPv4  38505      0t0  TCP *:http (LISTEN)

4、nginx最大打开的文件数

添加:
worker_rlimit_nofile 102400;	#这个指令是指当一个nginx进程打开的最多文件描述符数目,
events {
     use epoll;		#IO多路复用
     worker_connections  102400;
 }
select,poll,epoll都是IO多路复用的机制。I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。
查看最大文件数
[root@study ~]# cat /proc/sys/fs/file-max 
819200

epoll优势:
1、Epoll没有最大并发连接的限制,上限是最大可以打开文件的数目,这个数字一般远大于2048, 一般来说这个数目和系统内存关系很大,具体数目可以cat /proc/sys/fs/file-max查看。
[root@xuegod63 nginx-1.12.2]# cat /proc/sys/fs/file-max
95094
2、 效率提升,Epoll最大的优点就在于它只管你“活跃”的连接,而跟连接总数无关,因此在实际的网络环境中,Epoll的效率就会远远高于select和poll。
3、 内存拷贝,Epoll在这点上使用了“共享内存”,这个内存拷贝也省略了

5、开启高效传输模式

[root@study ~]# vim /usr/local/nginx/conf/nginx.conf
sendfile        on;
开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。
tcp_nopush     on;
必须在sendfile开启模式才有效,防止网络阻塞,积极的减少网络报文段的数量

6、连接超时时间

[root@study ~]# vim /usr/local/nginx/conf/nginx.conf	
     #keepalive_timeout  0;
     keepalive_timeout  65;
     tcp_nodelay on;
     client_header_timeout 15;
     client_body_timeout 15;
     send_timeout 15;
keepalived_timeout  客户端连接保持会话超时时间,超过这个时间,服务器断开这个链接
tcp_nodelay;防止网络阻塞,不过要包涵在keepalived参数才有效
client_header_timeout  客户端请求头读取超时时间,如果超过设个时间没有发送任何数据,nginx将返回request time out的错误
client_body_timeout  客户端求主体超时时间,超过这个时间没有发送任何数据,和上面一样的错误提示
send_timeout  响应客户端超时时间,这个超时时间仅限于两个活动之间的时间,如果超过这个时间,客户端没有任何活动,nginx关闭连接

7、限制文件上传大小

http {
......
client_max_body_size 10m;
......

8、Fastcgi

官方文档http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_cache

FastCGI接口方式采用C/S结构,可以将HTTP服务器和脚本解析服务器分开,同时在脚本解析服务器上启动一个或者多个脚本解析守护进程。当HTTP服务器每次遇到动态程序时,可以将其直接交付给FastCGI进程来执行,然后将得到的结果返回给浏览器。这种方式可以让HTTP服务器专一地处理静态请求或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能。

简单来说fastcgi就是静态服务和动态服务的一个接口

Nginx不支持对外部程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过FastCGI接口来调用。FastCGI接口在Linux下是socket(这个socket可以是文件socket,也可以是ip socket)。为了调用CGI程序,还需要一个FastCGI的wrapper(wrapper可以理解为用于启动另一个程序的程序),这个wrapper绑定在某个固定socket上,如端口或者文件socket。当Nginx将CGI请求发送给这个socket的时候,通过FastCGI接口,wrapper接收到请求,然后派生出一个新的线程,这个线程调用解释器或者外部程序处理脚本并读取返回数据;接着,wrapper再将返回的数据通过FastCGI接口,沿着固定的socket传递给Nginx;最后,Nginx将返回的数据发送给客户端。

fastcgi_connect_timeout 300;    #指定链接到后端FastCGI的超时时间。
fastcgi_send_timeout 300;       #向FastCGI传送请求的超时时间,这个值是指已经完成两次握手后向FastCGI传送请求的超时时间。
fastcgi_read_timeout 300;       #指定接收FastCGI应答的超时时间,这个值是指已经完成两次握手后接收FastCGI应答的超时时间。
fastcgi_buffer_size 64k;        #指定读取FastCGI应答第一部分需要用多大的缓冲区,这个值表示将使用1个64KB的缓冲区读取应答的第一部分(应答头),可以设置为fastcgi_buffers选项指定的缓冲区大小。
fastcgi_buffers 4 64k;  #指定本地需要用多少和多大的缓冲区来缓冲FastCGI的应答请求.
fastcgi_busy_buffers_size 128k; #建议设置为fastcgi_buffer的两倍,繁忙时候的buffer
fastcgi_temp_file_write_size 128k;  #在写入fastcgi_temp_path时将用多大的数据库,默认值是fastcgi_buffers的两倍,设置上述数值设置小时若负载上来时可能报502Bad Gateway
fastcgi_cache gnix; #表示开启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;       #请求的数量
fastcgi_cache_path              #定义缓存的路径

修改nginx.conf配置文件,在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_temp_path /data/ngx_fcgi_tmp;
fastcgi_cache_path /data/ngx_fcgi_cache   levels=2:2   #缓存路径,levels目录层次2级
keys_zone=ngx_fcgi_cache:512m  #定义了一个存储区域名字,缓存大小
inactive=1d max_size=40g;      #不活动的数据在缓存中多长时间,目录总大小

9、gzip模块

http://nginx.org/en/docs/http/ngx_http_gzip_module.html

gzip on;        #开启压缩功能
gzip_min_length  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 6;  #压缩比例,用来指定GZIP压缩比,1压缩比最小,处理速度最快,9压缩比最大,传输速度快,处理慢,也比较消耗CPU资源。
gzip_types  text/css text/xml application/javascript;   #用来指定压缩的类型,‘text/html’类型总是会被压缩。
gzip_vary on;   #vary header支持,该选项可以让前端的缓存服务器缓存经过GZIP压缩的页面.

配置文件中
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;

10、目录文件访问控制

(1)禁止访问images目录下的(php|php5|.sh|.py|.pl)文件
多目录的话location ~ ^/images/(目录1|目录2)
[root@study ~]# vim /usr/local/nginx/conf/nginx.conf
location ~ ^/images/.*\.(php|php5|.sh|.py|.pl)$ {
             deny all;
             }
[root@study ~]# /usr/local/nginx/sbin/nginx -s reload
[root@study ~]# mkdir /usr/local/nginx/html/images
[root@study ~]# cat /usr/local/nginx/html/images/index.php 
<?php
phpinfo();
?>
访问会显示403错误

(2)url重定向
[root@study ~]# /usr/local/nginx/sbin/nginx -s reload
[root@study ~]# echo 'test' > /usr/local/nginx/html/test.txt
     location ~* \.(txt|doc)$ {
                if ( -f $request_filename) {
                root /usr/local/nginx/html;
                rewrite ^/(.*)$ http://www.baidu.com last;
                break;
        }
        }
当我们访问 http://IP/test.txt 时,会重定向到baidu.com

(3)对目录进行限制
访问dir1时返回404,访问dir2时返回403
[root@study ~]# mkdir /usr/local/nginx/html/{dir1,dir2}
[root@study ~]# echo "dir1"  > /usr/local/nginx/html/dir1/index.html
[root@study ~]# echo "dir2"  > /usr/local/nginx/html/dir2/index.html
         location /dir1/ {return 404;}
         location /dir2/ {return 403;}
[root@study ~]#  /usr/local/nginx/sbin/nginx -s reload

(4)来源访问控制:ngx_http_access_module模块
http://nginx.org/en/docs/http/ngx_http_access_module.html
                 location ~/ {
                 deny 192.168.220.0/24;	#拒绝这个ip段
                 }

11、身份验证

[root@study ~]# vim /usr/local/nginx/conf/nginx.conf
		location /dir1/ {
             auth_basic "auth";
             auth_basic_user_file /usr/local/nginx/conf/passwd;
 }
 test用户,生成密码文件
[root@study ~]# htpasswd -c /usr/local/nginx/conf/passwd test
New password: 
Re-type new password: 
Adding password for user test
[root@study ~]# chmod 400 /usr/local/nginx/conf/passwd 
[root@study ~]# chown nginx /usr/local/nginx/conf/passwd 

12、控制访问次数限制ngx_http_limit_conn_module

http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html

控制单个IP或者域名的访问次数,并非所有连接都被计算在内 只有当服务器正在处理请求并且已经读取了整个请求标头时,才会计算连接。
   location / {
            root   html;
            limit_conn addr 1;
发布了65 篇原创文章 · 获赞 48 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/DoloresOOO/article/details/100701635