🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] # 基本安全优化 ## 隐藏版本信息 软件的漏洞都和版本相关,要隐藏或消除web服务对访问用户显示的各种敏感信息。 ![](https://img.kancloud.cn/c7/f6/c7f63e5c1f22afb5d605dd4a9b4bf25e_337x131.png) 修改 nginx.conf: ~~~text http { …… server_tokens off; # 关闭 Nginx 版本号 …… ~~~ # 常用配置优化 ## worker_processes 工作进程的数量, 一般设置成 CPU 核的数量。同时配合 `worker_cpu_affinity` (用于worker process与指定cpu核绑定)。 例: ~~~shell # 分别给每个worker进程绑定一个CPU. worker_processes 4; worker_cpu_affinity 0001 0010 0100 1000; # 将CPU0/CPU2绑定给第一个worker进程,将CPU1/CPU3绑定给第二个worker进程。 worker_processes 2; worker_cpu_affinity 0101 1010; ~~~ > 一般设置为 `auto` (自动检测) ## worker_connections 单个进程允许的客户端最大连接数。 ~~~text events { …… worker_connections 1024; …… } ~~~ ## 配置nginx worker进程最大打开文件数 `worker_rlimit_nofile` 改变nginx 工作进程能打开的最大文件数。受系统文件的最大打开数限制。 ~~~shell # 查看系统文件的最大打开数 [root@admin nginx]# cat /proc/sys/fs/file-max 1299568 # 文件系统最大可打开文件数 [root@admin nginx]# ulimit -n 1024 ~~~ 配置: ~~~ …… events { …… worker_rlimit_nofile 2048; ~~~ ## 开启高效文件传输模式 设置参数`sendfile on` 用于开启文件的高效传输模式。同时将`tcp_nopush`和`tcp_nodelay`两个指令设置为on,可防止网络及磁盘i/o阻塞,提升nginx工作效率。 ~~~text http { …… sendfile on; tcp_nopush on; tcp_nodelay on; ~~~ ## 配置 Gzip 压缩 nginx gzip压缩模块提供了压缩文件内容的功能,用户请求的内容在发送给客户端之前,nginx服务器会根据一些具体的策略实施压缩,以节省网站出口带宽,同时加快了数据传输效率,提升了用户的访问体验。 > https://nginx.org/en/docs/http/ngx_http_gzip_module.html ### 压缩的对象 * 纯文本内容压缩比很高,因此,纯文本的内容最好要压缩 * 被压缩的纯文本文件必须要大于1KB,由于压缩算法的特殊原因,极小的文件压缩反而变大 * 图片、视频(流媒体)等文件尽量不要压缩,因为这些文件大多都是经过压缩的,如果再压缩很可能不会减小或减小很少,或者有可能增大,而在压缩时还会消耗大量的CPU、内存资源 ### 配置参数 ~~~text http { …… ## # Gzip Settings ## gzip on; gzip_vary on; # vary header支持 # gzip_proxied any; gzip_comp_level 6; # 压缩比率 gzip_buffers 16 8k; # 压缩缓存区大小 gzip_http_version 1.1; # 压缩版本 gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; # 指定压缩的类型 ~~~ ## nginx expires功能 为用户访问网站的内容设定一个过期时间,当用户第一次访问到这些内容时,会把这些内容存储在用户浏览器本地,这样用户第二次及之后继续访问该网站,浏览器就会检查已经缓存在用户浏览器本地的内容,就不会去浏览器下载了,直到缓存的内容过期或者被清除为止。 ### 作用和优点 * 可以降低网站的带宽,节约成本 * 加快用户访问网站的速度,提升了用户访问体验 * 服务器访问量降低,服务器压力就减轻了,服务器的成本也会降低 ### 配置详解 ~~~text location ~ ^/(images|javascript|js|css|flash|media|static)/ { expires 360d; } ~~~ ### 缺点 当网站被缓存的页面或数据更新了,此时用户端看到的可能还是旧的已经缓存的内容。 * 对于经常需要的变动图片等文件,可以缩短对象缓存时间 * 当网站改版或更新内容时,可以在服务器将缓存的对象改名 ## nginx日志的优化 * 编写脚本实现日志轮询 以通过利用脚本开发、nginx的信号控制功能或reload重新加载,来实现日志的自动切割、轮询 ~~~shell mv www_access.log www_access_$(date +F -d -1day).log nginx -s reload ~~~ * 不记录不需要的日志 对于负载均衡器健康检查节点或某些特定的文件(图片、JS、CSS)的日志,一般不需要记录下来 * 访问日志的权限设置 假如日志目录为/app/logs,则授权方法为: ~~~shell chown -R root.root /app/logs chmod -R 600 /app/logs ~~~ 不需要在日志目录上给nginx用户读写或者读写许可 ## Nginx站点目录及文件URL访问控制 ### 根据扩展名限制程序和文件访问 web2.0时代,绝大多数网站都是以用户为中心的,这些产品有一些共同点,就是不允许用户发布内容到服务器,还允许用户发图片甚至附件上传到服务器上,给用户开启了上传的功能。带来了很大的安全隐患。 下面将利用nginx配置禁止访问上传资源目录下的 `php`,`shell`,`perl`,`python`程序文件,这样就算是用户上传了木马文件也没办法执行 ~~~text 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; } ~~~ > 对于上述目录的限制必须写在nginx处理PHP服务配置的前面 ### 禁止访问指定目录下的所有文件和目录 配置禁止访问指定的单个或多个目录 ~~~text location ~ ^/(static)/ { deny all; } location ~ ^/static { deny all; } ~~~ 禁止访问目录并且返回代码404 ~~~text server { listen 80; server_name xxxxx; root /var/www/xxxxx; index index.html index.htm; access_log /var/logs/www_access.log commonlog; location /admin/ { return 404; } location /templates/ { return 403; } } ~~~ ### 限制网站来源的IP访问 使用[`ngx_http_access_module`](https://nginx.org/en/docs/http/ngx_http_access_module.html)限制网站来源IP访问。 `allow`:允许,`deny`:拒绝 ~~~text location / { deny 192.168.1.1; allow 192.168.1.0/24; allow 10.1.1.0/16; allow 2001:0db8::/32; deny all; } ~~~ ### 配置nginx禁止非法域名解析访问网站 防止用户IP访问网站(恶意域名解析,相当于直接使用IP访问网站) ~~~text server { listen 80 default_server; server_name _; return 501; } ~~~ ## nginx图片防盗链解决方案 * 根据HTTP referer实现防盗链 * 根据cookie防盗链 利用Nginx [`ngx_http_referer_module`](https://nginx.org/en/docs/http/ngx_http_referer_module.html)模块,用于阻止对“Referer”标头字段中具有无效值的请求的访问。 ~~~text location ~* ^.+\.(jpg|png|swf|flv|rar|zip)$ { valid_referers none blocked *.xxx.com; if ($invalid_referer) { return 404; } } ~~~ `valid_referers [none|blocked|server_names|string ...] ` 默认值:none none:请求标头中缺少“Referer”字段; blocked:“Referer”字段存在于请求标头中,但其值已被防火墙或代理服务器删除;此类值是不以“ http://”或“ https://”开头的字符串; server_names:“Referer”请求标头字段包含服务器名称之一; # 使用CDN做网站内容加速 * 本地Cache加速 提高了企业站点(尤其含有大量图片和静态页面站点)的访问速度,并大大提高以上性质站点的稳定性 * 镜像服务 消除了不同运营商之间互联的瓶颈造成的影响,实现了跨运营商的网络加速,保证不同网络中的用户都能得到良好的访问质量 * 远程加速 远程访问用户根据DNS负载均衡技术智能自动选择Cache服务器,选择最快的Cache服务器,加快远程访问的速度 * 带宽优化 自动生成服务器的远程Mirror(镜像)cache服务器,远程用户访问时从cache服务器上读取数据,减少远程访问的带宽、分担网络流量、减轻原站点WEB服务器负载等功能。 * 集群抗攻击 广泛分布的CDN节点加上节点之间的智能冗余机制,可以有效地预防黑客入侵以及降低各种D.D.o.S攻击对网站的影响,同时保证较好的服务质量 。