💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、豆包、星火、月之暗面及文生图、文生视频 广告
[TOC] ~~~ 1. gzip压缩优化 2. expires缓存有还 3. 网络IO事件模型优化 4. 隐藏软件名称和版本号 5. 防盗链优化 6. 禁止恶意域名解析 7. 禁止通过IP地址访问网站 8. HTTP请求方法优化 9. 防DOS攻击单IP并发连接的控制,与连接速率控制 10. 严格设置web站点目录的权限 11. 将nginx进程以及站点运行于监牢模式 12. 通过robot协议以及HTTP_USER_AGENT防爬虫优化 13. 配置错误页面根据错误码指定网页反馈给用户 14. nginx日志相关优化访问日志切割轮询,不记录指定元素日志、最小化日志目录权限 15. 限制上传到资源目录的程序被访问,防止木马入侵系统破坏文件 16. FastCGI参数buffer和cache配置文件的优化 17. php.ini和php-fpm.conf配置文件的优化 18. 有关web服务的Linux内核方面深度优化(网络连接、IO、内存等) 19. nginx加密传输优化(SSL) 20. web服务器磁盘挂载及网络文件系统的优化 21. 使用nginx cache ~~~ # 1、基本安全优化 ## 1.1 隐藏版本信息     一般来说,软件的漏洞都和版本相关,所以我们要隐藏或消除web服务对访问用户显示的各种敏感信息。 ~~~ #在http模块下加入: server_tokens off; ~~~ ## 1.2 隐藏nginx要修改源代码 要修改内容的路径: 第一路径: ~~~ 1 /home/oldboy/tools/nginx-1.6.3/src/core/nginx.h 第14,16行 2 #define NGINX_VERSION "1.6.2" 修改为想要的版本号如2.4.3 3 #define NGINX_VER "nginx/" NGINX_VERSION 将nginx修改为想要修改的软件名称,如Apache。 ~~~ 第二路径 ~~~ 1 /home/oldboy/tools/nginx-1.6.3/src/http/ngx_http_header_filter_module.c第49行 2 grep 'Server:nginx' ngx_http_header_filter_module.cstatic 3 sed -i 's#Server:nginx#Server:Apache#g' ngx_http_header_filter_module.c ~~~ 第三路径 ~~~ /home/oldboy/tools/nginx-1.6.3/src/http/ngx_http_special_response.c第21,30行 "<hr><center>"NGINX_VER "(http://oldboy.blog.51cto.com)</center>" CRLF "<hr><center>OWS</center>" CRLF ~~~ 然后重新编译 ## 1.3 更改nginx服务的默认用户 第一种方法:     直接更改配置文件nginx.conf.default参数,将默认的#user nobody;改为user nginx.nginx; 第二种方法:   直接在编译nginx的时候指定用户和用户组命令如下:   ./configure --prefix=/application/nginx-1.6.3 --user=nginx --group=nginx --with-http\_ssl\_module --with-http\_stub\_status\_module # 2、根据参数优化nginx服务性能 ## 2.1 优化nginx进程个数的策略 **一般调整到与CPU的核数相同(如,2个四核的cpu计为8)** worker\_processes  1; 查看LInux可查看CPU个数及总核数 ~~~ grep processor /proc/cpuinfo|wc -l ~~~ ## 2.2 优化绑定不同的nginx进程到不同的CPU上 默认情况下,nginx的进程跑在某一个CPU或CPU的某一个核上,导致nginx进程使用硬件的资源不均,本节的优化是不同的nginx进程给不同的CPU处理,充分有效的利用有效的硬件资源 四核cpu配置 ~~~ worker_processes 4; worker_cpu_affinity 0001 0010 0100 1000; ~~~ 双核配置 ~~~ worker_processes 2; worker_cpu_affinity 0101 1010; ~~~ 还有一个命令taskset -c用来分配服务给CPU ## 2.3 调整nginx单个进程允许的客户端最大连接数 参数语法:worker\_connections number  默认配置:worker\_connections 512  放置位置:events 标签   ~~~ events { worker_connections 1024; #一个worker进程的并发 } ~~~ 总并发= worker\_processes\* worker\_connections ## 2.4 配置nginx worker进程最大打开文件数 参数语法:worker\_rlimit\_nofile number  放置位置:主标签段  说明:作用是改变worker processes能打开的最大文件数 ~~~ worker_rlimit_nofile 65535; ~~~ ## 2.5 开启高效文件传输模式 设置参数 sendfile on; sendfile参数用于开启文件的高效传输模式。同时将tcp\_nopush和tcp\_nodelay两个指令设置为on,可防止网络及磁盘i/o阻塞,提升nginx工作效率。 ~~~ http {   sendfile on; #放在http,server,location都可以 } ~~~ 设置参数tcp\_nopush; 激活tcp\_nopush参数可以允许把httpresponse header和文件的开始放在一个文件里发布,积极的作用是减少网络报文段的数量(只有sendfile on开启才生效) ## 2.6 设置keepalive处理的最大请求数 设置在一个长连接上可以服务的最大请求数目。当达到最大请求数目并结束服务后,连接被关闭。 默认100,当面对高并发/高吞吐量时,意味着nginx可能会快速回收与client的长连接。 keepalive\_requests ## 2.7 配置nginx gzip压缩实现性能优化 nginx压缩功能的介绍: nginx gzip压缩模块提供了压缩文件内容的功能,用户请求的内容在发送给客户端之前,nginx服务器会根据一些具体的策略实施压缩,以节省网站出口带宽,同时加快了数据传输效率,提升了用户的访问体验。 ### 2.7.1 压缩的优点: 提升网站用户体验:由于发给用户的内容小了,所以用户访问单位大小的页面就快了,用户体验就提升了 节约网站带宽成本:由于数据时压缩传输的,因此,会消耗一些cpu资源 ### 2.7.2 压缩的对象: 纯文本内容压缩比很高,因此,纯文本的内容最好要压缩。 被压缩的纯文本文件必须要大于1KB,由于压缩算法的特殊原因,极小的文件压缩反而变大。 图片、视频(流媒体)等文件尽量不要压缩,因为这些文件大多都是经过压缩的,如果再压缩很可能不会减小或减小很少,或者有可能增大,而在压缩时还会消耗大量的CPU、内存资源。 ### 2.7.3 参数介绍及配置说明: 在文件传输过程中是否开启压缩, > gzip > 默认值: off 是否开启压缩 > gzip\_buffers > 默认值: 4 4k/8k 用于指定存放压缩响应的缓冲的数量和大小。如果没有设定,则等于一个页面的大小。 > gzip\_comp\_level > 默认值: 1 用于设定压缩级别,1是最小压缩率,9是最大压缩率。 > gzip\_min\_length > 默认值:20 设置响应体的最小长度 > gzip\_types mime-type > 默认值:text/html; 指定需要压缩的mime类型 > gzip\_vary on | off; > 默认值:off 是否向响应头中添加vary:`Accept-Encoding HTTP` **[ngx\_http\_gzip\_static\_module]** > gzip\_static on | off | always; > 默认值:off; 开启这个功能,会查找与请求文件同名并且以gz结尾的文件,这个文件被称为预压缩格式,我们先进行了压缩,以后就不会重复进行压缩了。 ~~~ gzip -c index.html > index.html.gz ~~~ ## 2.8 nginx expires功能 为用户访问网站的内容设定一个过期时间,当用户第一次访问到这些内容时,会把这些内容存储在用户浏览器本地,这样用户第二次及之后继续访问该网站,浏览器就会检查已经缓存在用户浏览器本地的内容,就不会去浏览器下载了,直到缓存的内容过期或者被清除为止。 ### 2.8.1 expires作用和优点:    expires可以降低网站的带宽,节约成本   加快用户访问网站的速度,提升了用户访问体验   服务器访问量降低,服务器压力就减轻了,服务器的成本也会降低,甚至可以节约人力成本 ### 2.8.2 nginx expires 配置详解: ~~~ ## Add expires header according to URI(path or dir). location ~ ^/(images|javascript|js|css|flash|media|static)/ { expires 360d; } ~~~ ### 2.8.3 expire缺点及解决办法:   当网站被缓存的页面或数据更新了,此时用户端看到的可能还是旧的已经缓存的内容,这样就会影响用户体验,那么如何解决这个问题呢?   第一:对于经常需要的变动图片等文件,可以缩短对象缓存时间,例如,百度、谷歌等网站的首页图片经常会换成一些节日的图,这里可以将缓存期修改为1天   第二:当网站改版或更新内容时,可以在服务器将缓存的对象改名(网站代码程序) # 3、nginx日志的优化 ## 3.1 编写脚本实现日志轮询   运维人员可以通过利用脚本开发、nginx的信号控制功能或reload重新加载,来实现日志的自动切割、轮询。 ~~~text nginx -s signal signal: stop — fast shutdown quit — graceful shutdown reload — reloading the configuration file reopen — reopening the log files 用来打开日志文件,这样nginx会把新日志信息写入这个新的文件中 ~~~ `/data/nginx/sbin/nginx -V`查看已经编译的参数。 使用kill命令操作nginx。格式:`kill -信号 PID` 信号名称 * TERM,INT 快速关闭 * QUIT 优雅的关闭,保持吸纳有的客户端连接 * HUP 重启应用新的配置文件 * USR1 重新打开日志文件 * USR2 升级程序 * WINCH 优雅的关闭工作进程 ~~~ mv access.log access_$(date +F -d -1day).log /usr/local/nginx/sbin/nginx -s reopen ~~~ ## 3.2 不记录不需要的日志      在实际工作中,对于负载均衡器健康检查节点或某些特定的文件(图片、JS、CSS)的日志,一般不需要记录下来,因为在统计PV时是按照页面计算的,而且日志写入的太频繁会消耗磁盘i/o,降低服务的性能 ~~~ 具体配制方法: location ~ .*\.(js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF)$ { access_log off; } ~~~ # 4、nginx站点目录及文件URL访问控制 ## 4.1 根据扩展名限制程序和文件访问   某些应用场景允许用户发图片甚至附件上传到服务器上,给用户开启了上传的功能。带来了很大的安全隐患。   下面将利用nginx配置禁止访问上传资源目录下的PHP,SHELL,PERL,PYTHON程序文件,这样就算是用户上传了木马文件也没办法执行 ~~~ 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服务配置的前面 ## 4.2 禁止访问指定目录下的所有文件和目录 配置禁止访问指定的单个或多个目录 ~~~ location ~ ^/static { deny all; } ~~~ 禁止访问目录并且返回代码404 ~~~ server { listen 80; server_name www.etiantian.org etiantian.org; root /data/www/www; index index.html index.htm; access_log /app/logs/www_access.log commonlog; location /admin/ { return 404; } location /templates/ { return 403; } } ~~~ ## 4.3 限制网站来源的IP访问 使用ngx\_http\_access\_module限制网站来源IP访问。 范例1:禁止外界访问,但允许某个IP访问该目录 ~~~ location ~ ^/oldboy/ { allow 202.111.12.211; deny all; } ~~~ 范例2:限制及指定IP或IP段访问。  ~~~ location / { deny 192.168.1.1; allow 192.168.1.0/24; allow 10.1.1.0/16; deny all; } ~~~ ## 4.4 配置nginx禁止非法域名解析访问企业网站 问题:nginx如何防止用户IP访问网站(恶意域名解析,相当于直接使用IP访问网站) 方法1:直接报错,用户体验不好 ~~~ server { listen 80 default_server; server_name _; return 501; } ~~~ 方法2:通过301跳转到主页 ~~~ server { listen 80 default_server; server_name _; rewrite ^(.*) http//:blog.etiantian.org/$1 permanent; } ~~~ # 5、nginx图片防盗链解决方案。 简单的说,没有经过你的允许在自己网站嵌入你的图片。 ## 5.1 常见的防盗链解决方案的基本原理 1. 根据HTTP referer实现防盗链 2. 根据cookie防盗链 ## 5.2 防盗链实战 valid\_referers 指令详解 该指令后面可以接 none blocked serevr\_names string或者是正则表达式 none 代表没有referer blocked 代表有referer但是被防火墙或者是代理给去除了 string或者正在表达式 用来匹配referer **nginx会通过查看referer字段和valid\_referers后面的referer列表进行匹配,如果匹配到了就invalid\_referer字段值为0 否则设置该值为1** 被盗链的网站配置: ~~~ 1 #Preventing hot linking of images and other file types 2 3 location ~* ^.+\.(jpg|png|swf|flv|rar|zip)$ { 4 5 valid_referers none blocked *.etiantian.org etiantian.org; 6 7 if ($invalid_referer) { 8 9 rewrite ^/ http://bbs.etiantian.org/img/nolink.gif; 10 11 } 12 13 root html/www; 14 15 } ~~~ # 6、nginx错误页面的优雅显示 范例:当出现403错误会跳转到403.html页面 ~~~ error_page 403 /403.html; ~~~ # 7、站点目录权限设置 (1)站点目录权限设置 方案1:推荐方案 目录:755 文件:644 所有者:root 图片及上传目录设置所有者为www ~~~ chown -R root.root /html/www find /html/www -type f|xargs chmod 644 find /html/www -type d|xargs chmod 755 ~~~ # 8、nginx防爬虫优化 配置 ~~~ if ($http_user_agent ~* LWP:Simple|BBBike|wget) { return 403 ; rewrite ^(.*) http://blog.etiantian.org/$1 permanent; } ~~~ # 9、利用nginx限制HTTP的请求方法 配置: ~~~ if ($request_method !~ ^(GET|HEAD|POST)$ ) { return 501; } ~~~ # 10、使用普通用户启动Nginx(监牢模式) 解决方案:   给Nginx服务降权,用普通用户跑Nginx服务,给运维设置普通账号 。   使用普通账号即可管理nginx服务及站点下的程序和日志 ``` user nginx ``` # 11、控制Nginx并发连接数量 模块:nginx\_http\_limit\_conn\_module 模块作用:限制每个key值的连接数,特别是单个IP连接数。 不是所有的连接数都会被计算,一个符合要求的连接是整个请求已经被读取的连接。 **Nginx并发连接数参数说明** ~~~ limit_conn_zone参数: 语法:limit_conn_zone key zone=name:size; 上下文:http ~~~ 用于设置共享内存区域,key可以是字符串,nginx自有变量或前两个组合,如$binary\_remote\_addr、$server\_name。name为内存区域的名称,size为内存区域的大小。 ~~~ limit_conn参数: 语法:limit_conn zone number; 上下文:http、server、location ~~~ # 12、 控制客户端请求Nginx的速率 在一些提供下载的站点,需要进行流量控制,核心模块提供了limit\_rate,limit\_rate\_after指令。 **指令** > limit\_rate speed > 上下文:http, server, location,if in location 该限制针对一个连接设定的,如果同时有两个连接,速度将会是设置值的两倍。 也可以利用$limit\_rate变量设置流量限制。如果想在特定条件下限制响应传输速率,可以使用这个功能: ~~~ server { if($slow){ set $limit_rate 4k; } } ~~~ > limit\_rate\_after bytes > 默认值:1m > 上下文:http, server, location,if in location 在传输了多少之后进行流量控制。 **示例** 以最快的速度现在3M后,速度控制为512k 实际测试结果,开始下载速度是1M多,下载3M后,逐步降速为512k ~~~ location /downlaod { limit_rate_after 3m; limit_rate 512k; } ~~~