如何配置Nginx以优化Web服务器性能并强化安全防护措施?

2026-05-05 21:302阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计3684个文字,预计阅读时间需要15分钟。

如何配置Nginx以优化Web服务器性能并强化安全防护措施?

章节目录

1.引言

1.1 目的 1.2 目标范围 1.3 读者对象

2. 参考说明 2.1 帮助参考 2.2 参数说明

如何配置Nginx以优化Web服务器性能并强化安全防护措施?

3. 模块说明 3.3 服务优化

4. 安全配置

本章目录

1.引言

  • 1.1 目的
  • 1.2 目标范围
  • 1.3 读者对象

2.参考说明

  • 2.1 帮助参考
  • 2.2 参数说明
  • 3.3 模块说明

3.服务优化

  • 3.1 系统内核
  • 3.2 编译优化
  • 3.3 性能优化
  • 3.4 运营优化
  • 3.5 配置优化

4.安全配置

  • 0.隐藏nginx服务及其版本
  • 1.低权限用户运行服务
  • 2.配置SSL及其会话复用
  • 3.限制SSL协议与加密套件
  • 4.拦截垃圾信息
  • 5.恶意扫描拦截
  • 6.禁用WebDAV
  • 7.禁用Nginx状态模块
  • 8.关闭默认错误页上的Nginx版本号
  • 9.设置client_body_timeout超时
  • 10.设置client_header_timeout
  • 11.设置keepalive_timeout超时
  • 12.设置send_timeout超时
  • 13.Nginx可用的方法应限制为GET, HEAD, POST
  • 14.控制并发连接limit_zone slimits
  • 15.控制并发连接limit_conn slimits
  • 16.主机防webshell跨目录浏览以及列目录
  • 17.文件名解析漏洞php_info,加入fcgi.conf即可
  • 18.访问权限控制nginx
  • 19.异常状态返回200隐藏URL
  • 20.安全模块的选择
  • 21.记录访问者真实IP
  • 22.地区访问响应措施
  • 23.资源防盗链设置
  • 24.常规安全响应头配置
  • 25.防止非所属域名解析到服务器
  • 25.限制指定客户端地址访问

5.配置说明
6.补充知识


修订控制页

版本 修订日期 修订人 修订摘要 1.0 2019年9月8日 09点18分 WeiyiGeek 初稿 2.0 2022年1月8日 18点18分 WeiyiGeek 扩充

前置基础知识学习

  • 1.Nginx基础安装与配置详细 blog.weiyigeek.top/2019/9-1-121.html

  • 2.Nginx进阶学习之最佳配置实践指南 blog.weiyigeek.top/2019/9-1-124.html

  • 3.Nginx模块学习使用实践指南 blog.weiyigeek.top/2021/3-1-633.html

  • 4.Nginx安全加固与性能调优最佳指南 blog.weiyigeek.top/2019/9-2-122.html

  • 5.Nginx常遇问题入坑出坑整理 blog.weiyigeek.top/2020/9-2-622.html


1.引言 1.1 目的

为了更好的指导部署与测试艺术升系统nginx网站服务器高性能同时下安全稳定运行,需要对nginx服务进行调优与加固;

本次进行Nginx服务调优加固主要从以下几个部分:

  • 模块性能优化
  • 系统内核优化
  • 编译安装优化
  • 性能参数优化
  • 安全加固配置
1.2 目标范围

本文档仅供内部使用,禁止外传,帮助研发人员,运维人员对系统长期稳定的运行提供技术文档参考。

1.3 读者对象
  1. 项目经理
  2. 开发人员
  3. 测试人员
  4. 运维人员
  5. 相关领导

2.参考说明 2.1 帮助参考

Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。Nginx作为负载均衡服务器, Nginx 既可以在内部直接支持 Rails 和 PHP 程序对外进行服务,也可以支持作为 HTTP代理服务器对外进行服务。

Nginx版本选择:

  • Mainline version 最新版本,推荐测试的业务项目的时候使用
  • Stable version 稳定版本,推荐项目上线实际使用
  • Legacy versions 历史版本,不推荐选择可能存在脆弱性漏洞

项目结构:

#编译后的nginx项目结结构 /etc/nginx/ ├── client_body_temp #客户端上面的临时文件存放目录 ├── conf #nginx的配置文件存放目录 ├── fastcgi_temp #fastcgi的临时文件存放目录 ├── html #存放静态资源或者脚本文件的地方 ├── logs #nginx日志文件 ├── proxy_temp #nginx正向/反向代理缓存文件存放目录 ├── sbin #nginx可执行文件 ├── scgi_temp #scgi临时文件目录 └── uwsgi_temp #uwsgi临时文件存放目录

Nginx文档帮助: nginx.org/en/docs/
Nginx首页地址目录: /usr/share/nginx/html
Nginx配置文件:

  • /etc/nginx/nginx.conf
  • /usr/local/nginx/conf/nginx.conf
  • /usr/local/etc/nginx/nginx.conf

2.2 参数说明

localtion 请求匹配的url实是一个正则表达式:

# 语法规则: location [=|~|~*|^~] /uri/ { ... } # 参数解析: = 表示精确匹配,这个优先级也是最高的 / 通用匹配,任何请求都会匹配到,默认匹配. ~ 表示区分大小写的正则匹配 ~* 表示不区分大小写的正则匹配(和上面的唯一区别就是大小写) !~和!~*分别为区分大小写不匹配及不区分大小写不匹配的正则 !~,!~* : 分别标识为区分大小写不匹配及不区分大小写不匹配的正则 ^~ 表示 uri 以某个常规字符串开头,理解为匹配 url 路径即可。nginx 不对 url 做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa 匹配到(注意是空格)

Nginx 匹配判断表达式:

-f 和 !-f: 用来判断是否存在文件 -d 和 !-d: 用来判断是否存在目录 -e 和 !-e: 用来判断是否存在文件或目录 -x 和 !-x: 用来判断文件是否可执行

例如,匹配末尾为如下后缀的静态并判断是否存在该文件, 如不存在则404。

location ~* \.(js|css|jpg|jpeg|gif|png|swf)$ { if (-f $request_filename) { return 403; break; } }
3.3 模块说明

查看可用模块编译参数:nginx.org/en/docs/configure.html

#可以通过运行 "./configure --help" 查看编译帮助,决定是否需要安装哪些模块,比如下面的ssi模块能够实现访问shtml页面 ./configure -help

$host$request_uri; } # 方式2.ReWrite 重写 server { listen 80; server_name weiyigeek.top www.weiyigeek.top; # 判断请求host是否是 www.weiyigeek.top ,如果是 weiyigeek.top 则重写为 www.weiyigeek.top if ($www.weiyigeek.top$1 permanent; } }
3.5 配置优化

nginx配置文件指令优化一览表

位置 指令 说明 优化 main worker_processes 工作进程数的选择包括(但不限于)CPU核心的数量、存储数据的硬盘数量及负载模式 设置 auto 或者 `cat /proc/cpuinfo main worker_cpu_affinity Nginx默认未开启CPU绑定,绑定工作进程到对应CPU核心 多核CPU建议设置CPU绑定,绑定样例:
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
main worker_rlimit_nofile 打开文件数限制(默认值1024),受限于系统的用户进程打开文件数限制,未设置则使用系统默认值 修改用户打开文件数限制:
echo "* - nofile 65536" >> /etc/security/limits.conf
修改所有Shell和通过Shell启动的进程打开文件数限制:
echo "ulimit -n 65536" >> /etc/profile
临时生效(重启后生效): ulimit -n 65536 main worker_connections Nginx一个工作进程的最大同时连接数,不仅限于客户端连接,包括了和后端被代理服务器等其他的连接 建议设置成与 worker_rlimit_nofile 值相等 mian sendfile 在www.weiyigeek.com</center>" "</body>" "</html>" ; static u_char ngx_weiyigeek.top } proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; set $Real $www.weiyigeek.top/picture/images/details-image-1.jpg; } }
24.常规安全响应头配置

描述: 下面收集了Web服务中常规的安全响应头, 它可以保证不受到某些攻击,建议在指定的 server{} 代码块进行配置。

# HSTS (ngx_code.jquery.com www.google-analytics.com; img-src 'self' www.google-analytics.com; connect-src 'self'; font-src 'self'; style-src 'self';
25.防止非所属域名解析到服务器

描述: 为了防止某些未备案的域名或者恶意镜像站域名绑定到我们服务器上, 导致服务器被警告关停,将会对业务或者SEO排名以及企业形象造成影响,我们可以通过如下方式进行防范。

server { listen 80 default_server; server_name 82.156.18.253; # 禁止搜索引擎收录IP add_header X-Robots-Tag 'noindex,noarchive,nosnippet'; location ^~ / { # IP地址访问强制301跳转 if ( $host = 82.156.18.253 ){ return 301 www.weiyigeek.top/index.html; } # 请求host非指定域名时返回json if ( $host !~* weiyigeek\.top ) { add_header Content-Type 'application/json; charset=utf-8'; return 200 '{"status":"error","Author":"WeiyiGeek","Site":"www.weiyigeek.top","Chinese":"大佬, 请不要把你的域名解析到我的服务器上","English":"Friend, Please do not resolve your domain name to my server"}'; # return 301 space.bilibili.com/385802642; } } ... }

执行结果:

$ curl -I 82.156.18.253 HTTP/1.1 301 Moved Permanently Server: nginx Date: Mon, 11 Apr 2022 12:15:02 GMT Content-Type: text/html Content-Length: 162 Connection: keep-alive Location: www.weiyigeek.top/index.html X-Robots-Tag: noindex,noarchive,nosnippet $ curl --insecure -I 82.156.18.253 HTTP/2 301 server: nginx date: Mon, 11 Apr 2022 12:15:24 GMT content-type: text/html content-length: 162 location: www.weiyigeek.top/index.html x-robots-tag: noindex,noarchive,nosnippet $ curl weiyigeek.cn {"status":"error","Author":"WeiyiGeek","Site":"www.weiyigeek.top","Chinese":"大佬, 请不要把你的域名解析到我的服务器上","English":"Friend, Please do not resolve your domain name to my server"}
25.限制指定客户端地址访问

描述: 有时你的网站可能只需要被某一IP或者IP段的地址请求访问,那么非白名单中的地址访问将被阻止访问, 我们可以如下配置;

location / { allow 12.97.167.194; allow 12.33.1.2; allow 12.152.49.4; deny all; }
5.配置说明

常用nginx配置文件解释:

#[Main] Nginx启动的用户(建议非root用户) user nginx; #[Main] NGINX工作进程数设置值和CPU核心数一致(优化选项) #采用 grep ^processor /proc/cpuinfo | wc -l 进行查看或者auto worker_processes auto; #[Main] 工作模式与连接数上限即每个工作进程可以处理并发的最大连接数(优化选项) events { #[Main-events] nginx作为反向代理服务器单个进程最大连接数(最大连接数=连接数*进程数) #建议与worker_rlimit_nofile一致 worker_connections 65535; #[Main-events] use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; #epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。 use epoll; #[Main-events] 提高性能和吞吐量 accept_mutex off; } #[Main] 高并发参数(通过设置cpu粘性来降低由于多CPU核切换造成的寄存器等现场重建带来的性能损耗)(优化选项) worker_cpu_affinity 0001 0010 0100 1000; #四核的时候 #假如是8 cpu 分配如下: worker_cpu_affinity 00000001 00000010 00000100 00001000 0001000000100000 01000000 10000000 #[Main] 默认是没有设置,可以限制为操作系统最大的限制65535。(优化选项) worker_rlimit_nofile 65535 #[Main]日志位置和日志级别[ debug | info | notice | warn | error | crit ] #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; error_log logs/error.log error; #服务进程启动文件 pid /var/run/nginx.pid; #当前主配置文件包含其他的nginx模块配置文件 include /etc/nginx/conf.d/*.conf; #[Main部分] $host$request_uri; #access_log logs/host.access.log main; #请求正则匹配的来判断访问路径,默认访问localhost:80 访问的是下面这个路径的网页 location / { #站点根目录你网站文件存放的地方 root html; #定义路径下默认访问的文件名,一般跟着root放 index index.html index.htm; #开启限制IP连接数的时候需要使用 #limit_zone crawler $binary_remote_addr 10m; #访问控制模块默认就会安装,而且写法也非常简单,可以分别有多个allow,deny,允许或禁止某个ip或ip段访问, #依次满足任何一个规则就停止往下匹配 (安全选项) allow 192.168.10.100; allow 172.29.73.0/24; deny all; #认证访问 通过127.0.0.1; #} #将PHP脚本传递到正在监听127.0.0.1:9000的FastCGI服务器 #location ~ .+\.(php|php5)$ { # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_pass unix:/tmp/php.sock; #为了安全推荐方式 # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; # fastcgi_cache cache_fastcgi; #} # 如果Apache的文档根目录与nginx的根目录一致,则拒绝访问.htaccess文件 #location ~ /\.ht { # deny all; #} #静态资源正则请求路径匹配 location ~ .+\.(gif|jpg|jpeg|png|bmp|swf|txt|csv|doc|docx|xls|xlsx|ppt|pptx|flv)$ { root e:wwwroot; expires 30d; #缓存有效期30天 access_log off; #访问记录 } #JS和CSS缓存时间设置 location ~ .+\.(js|css|html|xml)$ { expires 30d;} #访问控制也可以加入认证 location /nginx-status{ #nginx中的stub_status模块主要用于查看Nginx的一些状态信息. 本模块默认没有安装需要编译安装。 stub_status on; allow 192.168.1.0/24; allow 127.0.0.1; deny all; } } #### Nginx反向代理 ###### #[Main-monitor_server; #代理服务器相关信息头设置 proxy_redirect off; #如果是有涉及redirect的服务,一定要加上端口8081,否 则默认tomcat在redirect时候默认找80端口 proxy_set_header Host $host; #转发请求的原IP地址,程序中通过request.getHeader("Proxy-Client-IP")获得ip proxy_set_header X-Real-IP $remote_addr; #端的Web服务器可以通过X-Forwarded-For获取用户真实IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; ##nginx跟后端服务器连接超时时间(代理连接超时) #模块www.google.com.hk/ ; #重定向 #proxy_redirect ; #sub_filter www.google.com.hk www.example.com; #把谷歌的域名替换成自己的,注意需要安装nginx的sub_filter模块 #反向代理的配置. END } #本地动静分离反向代理配置 #所有jsp的页面均交由tomcat或resin处理 location ~ .(jsp|jspx|do)?$ { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass 127.0.0.1:8080; } #所有静态文件由nginx直接读取不经过tomcat或resin location ~ \.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ { expires 15d; } location ~ \.(js|css)$ { expires 1h; } } # 另一个虚拟主机,混合使用IP、名称和基于端口的配置 server { listen 80; listen [::]:80; server_name weiyigeek.top; return 301 $host$request_uri; } server { listen 443 ssl ssl-config.mozilla.org/ffdhe2048.txt > /path/to/dhparam ssl_dhparam /path/to/dhparam; # 兼容性较为通用的SSL协议与加密算法套件 ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE:ECDH:AES:HIGH:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:!NULL:!aNULL:!eNULL:!EXPORT:!PSK:!ADH:!DH:!DES:!MD5:!RC4; # 安全配置: ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4:!DH:!DHE; # 证书常规握手加密算法方式共十八个,ECDHE、DHE、AES开头分别6个 ; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:HIGH:!NULL:!aNULL:!eNULL:!EXPORT:!PSK:!ADH:!DES:!MD5:!RC4; # 为了兼容性推荐服务器自动选择要使用的算法套件 ssl_prefer_server_ciphers on; # replace with the IP address of your resolver resolver 223.6.6.6 8.8.8.8 192.168.12.254; } }


6.补充知识

(1) 阿里巴巴提供的Concat或者Google的PageSpeed模块实现这个合并文件的功能。

  • Concat源代码网址:github.com/alibaba/nginx-github.com/pagespeed/ngx_pagespeed。

(2) PHP-FPM的优化
如果您高负载网站使用PHP-FPM管理FastCGI对于PHP-FPM的优化非常重要

  • 1.增加FastCGI进程数:把PHP FastCGI子进程数调到100或以上,在4G内存的服务器上200就可以建议通过压力测试获取最佳值。
  • 2.增加 PHP-FPM打开文件描述符的限制

# vi /path/to/php-fpm.conf 找到“1024”,把1024更改为 4096 或者更高,之后重启 PHP-FPM # /etc/security/limits.conf * hard nofile 65536 * soft nofile 65536

  • 3.适当增加max_requests: 标签max_requests指明了每个children最多处理多少个请求后便会被关闭默认的设置是500。

(3) 配置Resin on Linux或者Windows为我们可以打开 resin-3.1.9/bin/blog.weiyigeek.top/2019/9-2-122.html

文章书写不易,如果您觉得这篇文章还不错的,请给这篇专栏 (人间五大情),这将对我的肯定,谢谢!。

本文章来源 我的Blog站点 或 WeiyiGeek 公众账号 以及 我的BiliBili专栏 (技术交流、友链交换请邮我哟),谢谢支持!(๑′ᴗ‵๑) ❤
欢迎各位志同道合的朋友一起学习交流,如文章有误请留下您宝贵的知识建议,通过邮箱联系我哟!

本文共计3684个文字,预计阅读时间需要15分钟。

如何配置Nginx以优化Web服务器性能并强化安全防护措施?

章节目录

1.引言

1.1 目的 1.2 目标范围 1.3 读者对象

2. 参考说明 2.1 帮助参考 2.2 参数说明

如何配置Nginx以优化Web服务器性能并强化安全防护措施?

3. 模块说明 3.3 服务优化

4. 安全配置

本章目录

1.引言

  • 1.1 目的
  • 1.2 目标范围
  • 1.3 读者对象

2.参考说明

  • 2.1 帮助参考
  • 2.2 参数说明
  • 3.3 模块说明

3.服务优化

  • 3.1 系统内核
  • 3.2 编译优化
  • 3.3 性能优化
  • 3.4 运营优化
  • 3.5 配置优化

4.安全配置

  • 0.隐藏nginx服务及其版本
  • 1.低权限用户运行服务
  • 2.配置SSL及其会话复用
  • 3.限制SSL协议与加密套件
  • 4.拦截垃圾信息
  • 5.恶意扫描拦截
  • 6.禁用WebDAV
  • 7.禁用Nginx状态模块
  • 8.关闭默认错误页上的Nginx版本号
  • 9.设置client_body_timeout超时
  • 10.设置client_header_timeout
  • 11.设置keepalive_timeout超时
  • 12.设置send_timeout超时
  • 13.Nginx可用的方法应限制为GET, HEAD, POST
  • 14.控制并发连接limit_zone slimits
  • 15.控制并发连接limit_conn slimits
  • 16.主机防webshell跨目录浏览以及列目录
  • 17.文件名解析漏洞php_info,加入fcgi.conf即可
  • 18.访问权限控制nginx
  • 19.异常状态返回200隐藏URL
  • 20.安全模块的选择
  • 21.记录访问者真实IP
  • 22.地区访问响应措施
  • 23.资源防盗链设置
  • 24.常规安全响应头配置
  • 25.防止非所属域名解析到服务器
  • 25.限制指定客户端地址访问

5.配置说明
6.补充知识


修订控制页

版本 修订日期 修订人 修订摘要 1.0 2019年9月8日 09点18分 WeiyiGeek 初稿 2.0 2022年1月8日 18点18分 WeiyiGeek 扩充

前置基础知识学习

  • 1.Nginx基础安装与配置详细 blog.weiyigeek.top/2019/9-1-121.html

  • 2.Nginx进阶学习之最佳配置实践指南 blog.weiyigeek.top/2019/9-1-124.html

  • 3.Nginx模块学习使用实践指南 blog.weiyigeek.top/2021/3-1-633.html

  • 4.Nginx安全加固与性能调优最佳指南 blog.weiyigeek.top/2019/9-2-122.html

  • 5.Nginx常遇问题入坑出坑整理 blog.weiyigeek.top/2020/9-2-622.html


1.引言 1.1 目的

为了更好的指导部署与测试艺术升系统nginx网站服务器高性能同时下安全稳定运行,需要对nginx服务进行调优与加固;

本次进行Nginx服务调优加固主要从以下几个部分:

  • 模块性能优化
  • 系统内核优化
  • 编译安装优化
  • 性能参数优化
  • 安全加固配置
1.2 目标范围

本文档仅供内部使用,禁止外传,帮助研发人员,运维人员对系统长期稳定的运行提供技术文档参考。

1.3 读者对象
  1. 项目经理
  2. 开发人员
  3. 测试人员
  4. 运维人员
  5. 相关领导

2.参考说明 2.1 帮助参考

Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。Nginx作为负载均衡服务器, Nginx 既可以在内部直接支持 Rails 和 PHP 程序对外进行服务,也可以支持作为 HTTP代理服务器对外进行服务。

Nginx版本选择:

  • Mainline version 最新版本,推荐测试的业务项目的时候使用
  • Stable version 稳定版本,推荐项目上线实际使用
  • Legacy versions 历史版本,不推荐选择可能存在脆弱性漏洞

项目结构:

#编译后的nginx项目结结构 /etc/nginx/ ├── client_body_temp #客户端上面的临时文件存放目录 ├── conf #nginx的配置文件存放目录 ├── fastcgi_temp #fastcgi的临时文件存放目录 ├── html #存放静态资源或者脚本文件的地方 ├── logs #nginx日志文件 ├── proxy_temp #nginx正向/反向代理缓存文件存放目录 ├── sbin #nginx可执行文件 ├── scgi_temp #scgi临时文件目录 └── uwsgi_temp #uwsgi临时文件存放目录

Nginx文档帮助: nginx.org/en/docs/
Nginx首页地址目录: /usr/share/nginx/html
Nginx配置文件:

  • /etc/nginx/nginx.conf
  • /usr/local/nginx/conf/nginx.conf
  • /usr/local/etc/nginx/nginx.conf

2.2 参数说明

localtion 请求匹配的url实是一个正则表达式:

# 语法规则: location [=|~|~*|^~] /uri/ { ... } # 参数解析: = 表示精确匹配,这个优先级也是最高的 / 通用匹配,任何请求都会匹配到,默认匹配. ~ 表示区分大小写的正则匹配 ~* 表示不区分大小写的正则匹配(和上面的唯一区别就是大小写) !~和!~*分别为区分大小写不匹配及不区分大小写不匹配的正则 !~,!~* : 分别标识为区分大小写不匹配及不区分大小写不匹配的正则 ^~ 表示 uri 以某个常规字符串开头,理解为匹配 url 路径即可。nginx 不对 url 做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa 匹配到(注意是空格)

Nginx 匹配判断表达式:

-f 和 !-f: 用来判断是否存在文件 -d 和 !-d: 用来判断是否存在目录 -e 和 !-e: 用来判断是否存在文件或目录 -x 和 !-x: 用来判断文件是否可执行

例如,匹配末尾为如下后缀的静态并判断是否存在该文件, 如不存在则404。

location ~* \.(js|css|jpg|jpeg|gif|png|swf)$ { if (-f $request_filename) { return 403; break; } }
3.3 模块说明

查看可用模块编译参数:nginx.org/en/docs/configure.html

#可以通过运行 "./configure --help" 查看编译帮助,决定是否需要安装哪些模块,比如下面的ssi模块能够实现访问shtml页面 ./configure -help

$host$request_uri; } # 方式2.ReWrite 重写 server { listen 80; server_name weiyigeek.top www.weiyigeek.top; # 判断请求host是否是 www.weiyigeek.top ,如果是 weiyigeek.top 则重写为 www.weiyigeek.top if ($www.weiyigeek.top$1 permanent; } }
3.5 配置优化

nginx配置文件指令优化一览表

位置 指令 说明 优化 main worker_processes 工作进程数的选择包括(但不限于)CPU核心的数量、存储数据的硬盘数量及负载模式 设置 auto 或者 `cat /proc/cpuinfo main worker_cpu_affinity Nginx默认未开启CPU绑定,绑定工作进程到对应CPU核心 多核CPU建议设置CPU绑定,绑定样例:
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
main worker_rlimit_nofile 打开文件数限制(默认值1024),受限于系统的用户进程打开文件数限制,未设置则使用系统默认值 修改用户打开文件数限制:
echo "* - nofile 65536" >> /etc/security/limits.conf
修改所有Shell和通过Shell启动的进程打开文件数限制:
echo "ulimit -n 65536" >> /etc/profile
临时生效(重启后生效): ulimit -n 65536 main worker_connections Nginx一个工作进程的最大同时连接数,不仅限于客户端连接,包括了和后端被代理服务器等其他的连接 建议设置成与 worker_rlimit_nofile 值相等 mian sendfile 在www.weiyigeek.com</center>" "</body>" "</html>" ; static u_char ngx_weiyigeek.top } proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; set $Real $www.weiyigeek.top/picture/images/details-image-1.jpg; } }
24.常规安全响应头配置

描述: 下面收集了Web服务中常规的安全响应头, 它可以保证不受到某些攻击,建议在指定的 server{} 代码块进行配置。

# HSTS (ngx_code.jquery.com www.google-analytics.com; img-src 'self' www.google-analytics.com; connect-src 'self'; font-src 'self'; style-src 'self';
25.防止非所属域名解析到服务器

描述: 为了防止某些未备案的域名或者恶意镜像站域名绑定到我们服务器上, 导致服务器被警告关停,将会对业务或者SEO排名以及企业形象造成影响,我们可以通过如下方式进行防范。

server { listen 80 default_server; server_name 82.156.18.253; # 禁止搜索引擎收录IP add_header X-Robots-Tag 'noindex,noarchive,nosnippet'; location ^~ / { # IP地址访问强制301跳转 if ( $host = 82.156.18.253 ){ return 301 www.weiyigeek.top/index.html; } # 请求host非指定域名时返回json if ( $host !~* weiyigeek\.top ) { add_header Content-Type 'application/json; charset=utf-8'; return 200 '{"status":"error","Author":"WeiyiGeek","Site":"www.weiyigeek.top","Chinese":"大佬, 请不要把你的域名解析到我的服务器上","English":"Friend, Please do not resolve your domain name to my server"}'; # return 301 space.bilibili.com/385802642; } } ... }

执行结果:

$ curl -I 82.156.18.253 HTTP/1.1 301 Moved Permanently Server: nginx Date: Mon, 11 Apr 2022 12:15:02 GMT Content-Type: text/html Content-Length: 162 Connection: keep-alive Location: www.weiyigeek.top/index.html X-Robots-Tag: noindex,noarchive,nosnippet $ curl --insecure -I 82.156.18.253 HTTP/2 301 server: nginx date: Mon, 11 Apr 2022 12:15:24 GMT content-type: text/html content-length: 162 location: www.weiyigeek.top/index.html x-robots-tag: noindex,noarchive,nosnippet $ curl weiyigeek.cn {"status":"error","Author":"WeiyiGeek","Site":"www.weiyigeek.top","Chinese":"大佬, 请不要把你的域名解析到我的服务器上","English":"Friend, Please do not resolve your domain name to my server"}
25.限制指定客户端地址访问

描述: 有时你的网站可能只需要被某一IP或者IP段的地址请求访问,那么非白名单中的地址访问将被阻止访问, 我们可以如下配置;

location / { allow 12.97.167.194; allow 12.33.1.2; allow 12.152.49.4; deny all; }
5.配置说明

常用nginx配置文件解释:

#[Main] Nginx启动的用户(建议非root用户) user nginx; #[Main] NGINX工作进程数设置值和CPU核心数一致(优化选项) #采用 grep ^processor /proc/cpuinfo | wc -l 进行查看或者auto worker_processes auto; #[Main] 工作模式与连接数上限即每个工作进程可以处理并发的最大连接数(优化选项) events { #[Main-events] nginx作为反向代理服务器单个进程最大连接数(最大连接数=连接数*进程数) #建议与worker_rlimit_nofile一致 worker_connections 65535; #[Main-events] use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; #epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。 use epoll; #[Main-events] 提高性能和吞吐量 accept_mutex off; } #[Main] 高并发参数(通过设置cpu粘性来降低由于多CPU核切换造成的寄存器等现场重建带来的性能损耗)(优化选项) worker_cpu_affinity 0001 0010 0100 1000; #四核的时候 #假如是8 cpu 分配如下: worker_cpu_affinity 00000001 00000010 00000100 00001000 0001000000100000 01000000 10000000 #[Main] 默认是没有设置,可以限制为操作系统最大的限制65535。(优化选项) worker_rlimit_nofile 65535 #[Main]日志位置和日志级别[ debug | info | notice | warn | error | crit ] #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; error_log logs/error.log error; #服务进程启动文件 pid /var/run/nginx.pid; #当前主配置文件包含其他的nginx模块配置文件 include /etc/nginx/conf.d/*.conf; #[Main部分] $host$request_uri; #access_log logs/host.access.log main; #请求正则匹配的来判断访问路径,默认访问localhost:80 访问的是下面这个路径的网页 location / { #站点根目录你网站文件存放的地方 root html; #定义路径下默认访问的文件名,一般跟着root放 index index.html index.htm; #开启限制IP连接数的时候需要使用 #limit_zone crawler $binary_remote_addr 10m; #访问控制模块默认就会安装,而且写法也非常简单,可以分别有多个allow,deny,允许或禁止某个ip或ip段访问, #依次满足任何一个规则就停止往下匹配 (安全选项) allow 192.168.10.100; allow 172.29.73.0/24; deny all; #认证访问 通过127.0.0.1; #} #将PHP脚本传递到正在监听127.0.0.1:9000的FastCGI服务器 #location ~ .+\.(php|php5)$ { # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_pass unix:/tmp/php.sock; #为了安全推荐方式 # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; # fastcgi_cache cache_fastcgi; #} # 如果Apache的文档根目录与nginx的根目录一致,则拒绝访问.htaccess文件 #location ~ /\.ht { # deny all; #} #静态资源正则请求路径匹配 location ~ .+\.(gif|jpg|jpeg|png|bmp|swf|txt|csv|doc|docx|xls|xlsx|ppt|pptx|flv)$ { root e:wwwroot; expires 30d; #缓存有效期30天 access_log off; #访问记录 } #JS和CSS缓存时间设置 location ~ .+\.(js|css|html|xml)$ { expires 30d;} #访问控制也可以加入认证 location /nginx-status{ #nginx中的stub_status模块主要用于查看Nginx的一些状态信息. 本模块默认没有安装需要编译安装。 stub_status on; allow 192.168.1.0/24; allow 127.0.0.1; deny all; } } #### Nginx反向代理 ###### #[Main-monitor_server; #代理服务器相关信息头设置 proxy_redirect off; #如果是有涉及redirect的服务,一定要加上端口8081,否 则默认tomcat在redirect时候默认找80端口 proxy_set_header Host $host; #转发请求的原IP地址,程序中通过request.getHeader("Proxy-Client-IP")获得ip proxy_set_header X-Real-IP $remote_addr; #端的Web服务器可以通过X-Forwarded-For获取用户真实IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; ##nginx跟后端服务器连接超时时间(代理连接超时) #模块www.google.com.hk/ ; #重定向 #proxy_redirect ; #sub_filter www.google.com.hk www.example.com; #把谷歌的域名替换成自己的,注意需要安装nginx的sub_filter模块 #反向代理的配置. END } #本地动静分离反向代理配置 #所有jsp的页面均交由tomcat或resin处理 location ~ .(jsp|jspx|do)?$ { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass 127.0.0.1:8080; } #所有静态文件由nginx直接读取不经过tomcat或resin location ~ \.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ { expires 15d; } location ~ \.(js|css)$ { expires 1h; } } # 另一个虚拟主机,混合使用IP、名称和基于端口的配置 server { listen 80; listen [::]:80; server_name weiyigeek.top; return 301 $host$request_uri; } server { listen 443 ssl ssl-config.mozilla.org/ffdhe2048.txt > /path/to/dhparam ssl_dhparam /path/to/dhparam; # 兼容性较为通用的SSL协议与加密算法套件 ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE:ECDH:AES:HIGH:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:!NULL:!aNULL:!eNULL:!EXPORT:!PSK:!ADH:!DH:!DES:!MD5:!RC4; # 安全配置: ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4:!DH:!DHE; # 证书常规握手加密算法方式共十八个,ECDHE、DHE、AES开头分别6个 ; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:HIGH:!NULL:!aNULL:!eNULL:!EXPORT:!PSK:!ADH:!DES:!MD5:!RC4; # 为了兼容性推荐服务器自动选择要使用的算法套件 ssl_prefer_server_ciphers on; # replace with the IP address of your resolver resolver 223.6.6.6 8.8.8.8 192.168.12.254; } }


6.补充知识

(1) 阿里巴巴提供的Concat或者Google的PageSpeed模块实现这个合并文件的功能。

  • Concat源代码网址:github.com/alibaba/nginx-github.com/pagespeed/ngx_pagespeed。

(2) PHP-FPM的优化
如果您高负载网站使用PHP-FPM管理FastCGI对于PHP-FPM的优化非常重要

  • 1.增加FastCGI进程数:把PHP FastCGI子进程数调到100或以上,在4G内存的服务器上200就可以建议通过压力测试获取最佳值。
  • 2.增加 PHP-FPM打开文件描述符的限制

# vi /path/to/php-fpm.conf 找到“1024”,把1024更改为 4096 或者更高,之后重启 PHP-FPM # /etc/security/limits.conf * hard nofile 65536 * soft nofile 65536

  • 3.适当增加max_requests: 标签max_requests指明了每个children最多处理多少个请求后便会被关闭默认的设置是500。

(3) 配置Resin on Linux或者Windows为我们可以打开 resin-3.1.9/bin/blog.weiyigeek.top/2019/9-2-122.html

文章书写不易,如果您觉得这篇文章还不错的,请给这篇专栏 (人间五大情),这将对我的肯定,谢谢!。

本文章来源 我的Blog站点 或 WeiyiGeek 公众账号 以及 我的BiliBili专栏 (技术交流、友链交换请邮我哟),谢谢支持!(๑′ᴗ‵๑) ❤
欢迎各位志同道合的朋友一起学习交流,如文章有误请留下您宝贵的知识建议,通过邮箱联系我哟!