(1)修改第一个文件(核心头文件),在nginx安装目录下找到这个文件并修改
[(2) 更改nginx.conf,在nobody处指定](#(2) 更改nginx.conf,在nobody处指定)
1.优化nginx的worker进程数,并将进程绑定到不同的cpu上
2.优化nginx事件处理模型、最大连接数和进程最大打开文件数
(1)拒绝访问static目录和以static开头路径下的文件
一.基本安全优化
1.隐藏nginx软件版本信息
一般来讲,同一版本号的设备或软件出现漏洞或问题,那么这一批次就几乎都有被攻击的风险1,通过隐藏版本号等敏感信息,在一定成都上可以增强web服务的安全性
隐藏版本使用的是server_tokens off/on;,一般放在http块内
[root@localhost nginx-1.22.0]# curl -I 192.168.2.190
HTTP/1.1 200 OK
Server: nginx/1.22.0
Date: Sun, 13 Aug 2023 06:36:39 GMT
Content-Type: text/html
Content-Length: 4
Last-Modified: Thu, 10 Aug 2023 03:52:52 GMT
Connection: keep-alive
ETag: "64d45f14-4"
Accept-Ranges: bytes
[root@localhost conf]# vim nginx.conf
......
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server_tokens off;
......
}
[root@localhost conf]# systemctl restart nginx.service
[root@localhost nginx-1.22.0]# curl -I 192.168.2.190
HTTP/1.1 200 OK
Server: nginx
Date: Sun, 13 Aug 2023 06:38:00 GMT
Content-Type: text/html
Content-Length: 4
Last-Modified: Thu, 10 Aug 2023 03:52:52 GMT
Connection: keep-alive
ETag: "64d45f14-4"
Accept-Ranges: bytes
2.更改源码来隐藏软件名和版本
[root@localhost ~]# curl -I 192.168.2.190
HTTP/1.1 200 OK
Server: nginx/1.22.0
Date: Mon, 14 Aug 2023 02:47:15 GMT
Content-Type: text/html
Content-Length: 4
Last-Modified: Thu, 10 Aug 2023 03:52:52 GMT
Connection: keep-alive
ETag: "64d45f14-4"
Accept-Ranges: bytes
(1)修改第一个文件(核心头文件),在nginx安装目录下找到这个文件并修改
[root@localhost core]# pwd
/usr/local/src/nginx-1.22.0/src/core
[root@localhost core]# vim nginx.h
更改NGINX_VERSION,NGINX_VER,NGINX_VAR为要伪造的版本号和服务名
(2)第二个文件
[root@localhost http]# pwd
/usr/local/src/nginx-1.22.0/src/http
[root@localhost http]# vim ngx_http_header_filter_module.c
修改此处
(3)第三个文件,内置响应信息页面
[root@localhost http]# pwd
/usr/local/src/nginx-1.22.0/src/http
[root@localhost http]# vim ngx_http_special_response.c
修改此处
(4)第四个文件
[root@localhost v2]# pwd
/usr/local/src/nginx-1.22.0/src/http/v2
[root@localhost v2]# vim ngx_http_v2_filter_module.c
修改此处
(5)重新编译安装并重启
[root@localhost nginx-1.22.0]# pwd
/usr/local/src/nginx-1.22.0
[root@localhost nginx-1.22.0]# ./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie'
[root@localhost nginx-1.22.0]# make
[root@localhost nginx-1.22.0]# make install
[root@localhost nginx-1.22.0]# systemctl restart nginx.service
[root@localhost ~]# curl -I 192.168.2.190
HTTP/1.1 200 OK
Server: rpcbind/2.3.30
Date: Mon, 14 Aug 2023 02:47:23 GMT
Content-Type: text/html
Content-Length: 4
Last-Modified: Thu, 10 Aug 2023 03:52:52 GMT
Connection: keep-alive
ETag: "64d45f14-4"
Accept-Ranges: bytes
3.更改nginx服务的默认用户和组
(1)在编译安装时指定用户和组
[root@localhost nginx-1.22.0]# pwd
/usr/local/src/nginx-1.22.0
[root@localhost nginx-1.22.0]# ./configure --user=nginx --group=nginx
(2) 更改nginx.conf,在nobody处指定
#user nobody;
worker_processes 1;
二.修改参数优化服务性能
1.优化nginx的worker进程数,并将进程绑定到不同的cpu上
(1)一般在nginx.conf文件中是"worker_processes 1;",指定了nginx要开启的进程数,可以设置为cpu的核数,在面对高并发流量的场合可以进一步设置为cpu核数*2
(2)nginx的进程多是运行在某个cpu或某个cpu的核内,在优化这一硬件资源不均的情况时可以将不同的nginx进程绑定到对应的cpu配置,可以在任务管理器的性能中查看cpu核数
例如我的是四核就可以这样来绑定
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
#worker_cpu_affinity可以把不同的进程分给不同的cpu处理,上面4个二进制数是掩码,代表的是1-4个核,对应上面4个进程数,这个情况下每个进程会分到一个cpu核处理。
2.优化nginx事件处理模型、最大连接数和进程最大打开文件数
在Linux上使用epoll的I/O多路服用模型,最大连接数要根据具体的服务器性能和程序内存来指定,一般都放在events块内。最大文件打开数可以查询,一般和进程数放一起。
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
worker_rlimit_nofile 65535;
#可以设置为这个"ulimit -HSn"命令得出来的结果
events {
use epoll;
#事件模块指令,放在events中指定nginx的工作模式,select-标准工作模式,poll-标准工作模式,kqueue-BDS系统高效工作模式,epoll-Linux平台首选高效工作模式,rtsig,/dev/poll
worker_connections 1024;
#事件模块指令,定义每个进程的最大连接数,默认1024,max_client客户端连接数=worker_processes*worker_connections,max_clients=worker_processes*worker_connections/4,当然这些设置也受文件系统打开数量限制,执行名"ulimit -n 数量"后生效
}
3.开启高效传输模式和上传文件大小的限制
sendfile可以开启文件的高效传输模式,如果将tcp_nopush和tcp_nodelay都设置为on,可以有效防止网络和磁盘的I/O阻塞,提升效率,可以通过client_max_body_size指定最大上传文件大小,一般都放在http块中
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
client_max_body_size 20M;
......
}
4.配置nginx的gzip压缩
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
gzip on;
#开启压缩
gzip_min_length 1k;
#设置压缩页面的最小字节,建议设置为1K以上,小于1K会压缩变大
gzip_buffers 4 16k;
#压缩缓冲区大小,上面的表示是需要4个16k的内存作为压缩结果流缓存
gzip_http_version 1.1;
#压缩版本,用于识别http协议版本,默认1.1
gzip_comp_level 2;
#压缩比率,指定gzip压缩比,1的压缩比最小处理速度最快,9的压缩比最大传输速度快但处理速度最慢,较为消耗CPU资源
gzip_types text/plain application/x-javascript text/css application/xml;
#指定压缩类型
gzip_vary on;
#开启vary header,可以让前端的缓存服务器的缓存经过gzip压缩页面
......
}
三.优化访问日志
1.运用shell脚本优化nginx的访问日志
主要功能是将日志以一定的时间格式保存并重载配置,在测试完脚本运行无误后,可以配合定时任务使得保持访问日志的整洁,并且每天生成一个新的日志文件以进行记录
[root@localhost nginx-1.22.0]# whereis nginx
nginx: /usr/sbin/nginx.old /usr/sbin/nginx /etc/nginx
[root@localhost conf]# vim nginx_access_log_mg.sh
#!/bin/bash
cd /usr/local/src/nginx-1.22.0/logs &&\
/bin/mv access.log access_$(date +%F).log
/usr/sbin/nginx -s reload
[root@localhost conf]# bash nginx_access_log_mg.sh
[root@localhost logs]# ll
total 8
-rw-r--r-- 1 root root 1680 Aug 14 13:32 access_2023-08-14.log
-rw-r--r-- 1 root root 0 Aug 14 13:54 access.log
-rw-r--r-- 1 root root 1108 Aug 14 13:32 error.log
2.舍弃不需要的访问日志
舍弃掉一些图片资源的访问记录,以免消耗大量磁盘资源
server {
listen 192.168.2.190;
server_name www.aabb.com;
location / {
root /usr/local/src/nginx-1.22.0/html/ip;
index index.html index.htm;
}
location ~ .*\.(jpg|JPG|jpeg|JPEG|gif|GIF)$ {
access_log off;
}
}
3.日志权限设置
建议递归设置为700
[root@localhost nginx-1.22.0]# chmod -R 700 logs/
[root@localhost nginx-1.22.0]# pwd
/usr/local/src/nginx-1.22.0
四.站点目录和url路径访问优化
1.根据扩展名限制程序和文件访问
禁止访问images开头并php/php5/sh/pl/py结尾,static开头并以php/php5/sh/pl/py结尾,/data/attachment或/data/avatar开头以php/php5结尾的文件类型的内容
server {
listen 192.168.2.190;
server_name www.aabb.com;
location / {
root /usr/local/src/nginx-1.22.0/html/ip;
index index.html index.htm;
}
location ~ .*\.(jpg|JPG|jpeg|JPEG|gif|GIF)$ {
access_log off;
}
location ~ ^/images/.*\.(php|php5|sh|pl|py)$ {
deny all ;
}
location ~ ^/static/.*\.(php|php5|sh|pl|py)$ {
deny all;
}
location ~* ^/data/(attachment|avatar)/.*\.(php|php5)$ {
deny all;
}
location ~ .*\.(php|php5)?$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fcgi.conf;
}
}
2.禁止访问指定目录下的所有文件和目录
(1)拒绝访问static目录和以static开头路径下的文件
location ~ ^/(static)/ {
deny all;
}
location ~ ^/static {
deny all;
}
(2)禁止访问某个目录并返回状态码
location /xxx/ {
return 404;
}
location /xxx/ {
return 403;
}
3.禁止非法域名解析(防用户IP)访问网站
(1)返回501
server {
listen 80 default_server;
server_name _;
return 501;
}
(2)永久重写301
server {
listen 80 default_server;
server_name _;
rewrite ^(.*) http://xxx/$1 permanent;
}
#恶意域名解析IP
server {
if ($host !~ ^www/xxx/.com$){
rewrite ^(.*) http//www.xxx.com$l permanent;
}
五.nginxweb服务防盗链
1.文件名防盗链
location ~* \.(gif|jpg|png|swf|flv)$ {
valid_referers none blocked xxx.com ;
#valid_referers可以设置允许访问资源的引用者列表,none表示不允许任何引用这直接访问,blocked表示拒绝所有引用者,允许xxx.com域名下的引用者访问资源
if ($invalid_referer) {
rewrite ^/ http://xxx.com/retrun.html;
#如果引用者不在允许列表中,请求将会被重写到http://xxx.com/retrun.html,引用者在允许列表中则返回请求的资源,如上配置,xxx.com域名下的引用者可以获取资源
#return 404;
}
}
2.图片目录防盗链
location /images/ { #匹配/images、开头的请求
valid_referers none blocked server_names xxx;
#none,blocked含义同文件名防盗链,server_names后加上允许的域名列表
if ($invalid_referer) { #如上配置,引用者不在允许域名列表中则403拒绝访问,在列表中则则返回其请求的资源
return 403;
}
}