nginx上web服务的基本安全优化、服务性能优化、访问日志优化、目录资源优化和防盗链配置简介

一.基本安全优化

1.隐藏nginx软件版本信息

2.更改源码来隐藏软件名和版本

(1)修改第一个文件(核心头文件),在nginx安装目录下找到这个文件并修改

(2)第二个文件

(3)第三个文件,内置响应信息页面

(4)第四个文件

(5)重新编译安装并重启

3.更改nginx服务的默认用户和组

(1)在编译安装时指定用户和组

[(2) 更改nginx.conf,在nobody处指定](#(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;
            }
}
相关推荐
海阔天空_20139 分钟前
Python pyautogui库:自动化操作的强大工具
运维·开发语言·python·青少年编程·自动化
桥田智能12 分钟前
气爪在自动化装配线中是如何应用的?
运维·自动化
€☞扫地僧☜€2 小时前
docker 拉取MySQL8.0镜像以及安装
运维·数据库·docker·容器
hjjdebug2 小时前
linux 下 signal() 函数的用法,信号类型在哪里定义的?
linux·signal
其乐无涯2 小时前
服务器技术(一)--Linux基础入门
linux·运维·服务器
Diamond技术流2 小时前
从0开始学习Linux——网络配置
linux·运维·网络·学习·安全·centos
写bug的小屁孩2 小时前
前后端交互接口(三)
运维·服务器·数据库·windows·用户界面·qt6.3
斑布斑布2 小时前
【linux学习2】linux基本命令行操作总结
linux·运维·服务器·学习
紅色彼岸花2 小时前
第六章:DNS域名解析服务器
运维·服务器
Spring_java_gg2 小时前
如何抵御 Linux 服务器黑客威胁和攻击
linux·服务器·网络·安全·web安全