一.基本安全优化
1.隐藏nginx软件版本信息
2.更改源码来隐藏软件名和版本
(1)修改第一个文件(核心头文件),在nginx安装目录下找到这个文件并修改
(2)第二个文件
(3)第三个文件,内置响应信息页面
(4)第四个文件
(5)重新编译安装并重启
3.更改nginx服务的默认用户和组
(1)在编译安装时指定用户和组
(2) 更改nginx.conf,在nobody处指定
二.修改参数优化服务性能
1.优化nginx的worker进程数,并将进程绑定到不同的cpu上
2.优化nginx事件处理模型、最大连接数和进程最大打开文件数
3.开启高效传输模式和上传文件大小的限制
4.配置nginx的gzip压缩
三.优化访问日志
1.运用shell脚本优化nginx的访问日志
2.舍弃不需要的访问日志
3.日志权限设置
四.站点目录和url路径访问优化
1.根据扩展名限制程序和文件访问
2.禁止访问指定目录下的所有文件和目录
(1)拒绝访问static目录和以static开头路径下的文件
(2)禁止访问某个目录并返回状态码
3.禁止非法域名解析(防用户IP)访问网站
(1)返回501
(2)永久重写301
五.nginxweb服务防盗链
1.文件名防盗链
2.图片目录防盗链
一.基本安全优化
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;
}
}