Nginx在web应用中非常广泛,尤其是现在前后端分离项目中,前端的项目打包之后一般都习惯部署在Nginx下,方便利用Nginx做静态资源的缓存处理,动静分离,以及做反向代理,负载均衡,以及其他安全方面的限制,Nginx功能非常强大,前后端程序员都需要掌握。
目录
1、Nginx的基本概念
2.Nginx的安装与配置
3. Nginx配置反向代理
4.Nginx的缓存配置
5.Ngiinx的日志管理
6.Nginx的安全设置
7.Nginx的性能优化
8. Nginx的邮件代理设置
9.Nginx的web服务性能监控
10.Nginx的模块系统
11.Nginx的高可用性配置
12. Nginx的SSL和TLS配置
13.Nginx的Websocket支持的配置
14.Nginx的限流和防DDos攻击
15.Nginx的URL重写和重定向
16.Nginx的地理ip定位
17.Nginx的缓存防篡改和验证
18.Nginx的限流策略
19. Nginx的监控和调试
20. Nginx的高级配置和优化策略
21. Nginx的容器化部署
22.Nginx的模块开发与自定义
1、Nginx的基本概念
知识点 |
描述 |
示例 |
Nginx 简介 |
Nginx是一个高性能的HTTP服务器和反向代理,也是一个IMAP/POP3/SMTP代理服务器。 |
Nginx通常用于负载均衡、反向代理、静态文件服务等。 |
特点 |
高并发、高稳定性、低资源消耗。 |
Nginx能够支持数万并发连接,而资源消耗相对较低。 |
配置文件 |
Nginx的配置文件通常分为几个部分,包括main、events、http等。 |
配置文件通常位于/etc/nginx/nginx.conf 。 |
2.Nginx的安装与配置
知识点 |
描述 |
示例 |
安装Nginx |
Nginx可以在多种操作系统上安装,包括Linux、macOS和Windows。 |
使用包管理器(如apt、yum)或从源代码编译安装。 |
配置文件结构 |
Ngginx的配置文件由指令和指令块组成,指令块可以嵌套。 |
server 块是配置文件中用于定义服务器配置的指令块。 |
基本配置 |
包括服务器块、监听端口、服务器名称等。 |
server { listen 80; server_name example.com; } |
默认网站配置 |
设置网站的默认页面,如index.html。 |
location / { root /usr/share/nginx/html; index index.html index.htm; } |
配置SSL |
为HTTPS配置SSL证书和密钥。 |
ssl_certificate /path/to/cert.pem; ssl_certificate_key /path/to/key.pem; |
3. Nginx配置反向代理
知识点 |
描述 |
示例 |
反向代理 |
Nginx可以作为反向代理服务器,将客户端的请求转发给后端服务器。 |
通过proxy_pass 指令实现。 |
静态资源代理 |
用于加速静态资源的加载。 |
`location ~* .(jpg |
上游服务器配置 |
定义后端服务器的地址和负载均衡策略。 |
upstream backend { server 192.168.1.100:8080; } |
负载均衡 |
Nginx支持轮询、IP哈希等负载均衡方法。 |
upstream backend { server backend1; server backend2; } |
HTTP头部转发 |
确保客户端的HTTP头部信息被传递给后端服务器。 |
proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; |
HTTPS反向代理 |
配置SSL加密的反向代理。 |
server { listen 443 ssl; ssl_certificate cert.pem; ssl_certificate_key key.pem; proxy_pass https://backend; } |
4.Nginx的缓存配置
知识点 |
描述 |
示例 |
缓存类型 |
Nginx支持多种缓存类型,包括磁盘缓存和内存缓存。 |
磁盘缓存使用proxy_cache_path 指令,内存缓存使用共享内存区。 |
缓存路径配置 |
指定缓存文件的存储位置和索引文件。 |
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m; |
缓存策略 |
定义哪些响应可以被缓存,以及缓存的有效期。 |
proxy_cache my_cache; proxy_cache_valid 200 302 10m; |
缓存命中和未命中 |
控制缓存命中和未命中时的行为。 |
proxy_cache_bypass $arg_no_cache; |
缓存锁定 |
防止同时从后端服务器获取相同的资源。 |
proxy_cache_lock on; |
缓存清除 |
提供清除缓存的方法。 |
使用purge 模块,如`location ~ /purge(/ |
5.Ngiinx的日志管理
知识点 |
描述 |
示例 |
访问日志 |
记录客户端请求的详细信息。 |
默认情况下,访问日志位于/var/log/nginx/access.log 。 |
错误日志 |
记录Nginx运行时的错误信息。 |
默认错误日志位于/var/log/nginx/error.log 。 |
自定义日志格式 |
定义自定义的日志格式以满足特定的需求。 |
log_format myformat '$http_user_agent — $remote_addr — $remote_user [$time_local] "$request" $status $body_bytes_sent'; |
日志分割 |
根据时间或大小自动分割日志文件。 |
使用logrotate 工具进行日志分割。 |
日志权限 |
设置日志文件的权限,以保证安全性。 |
使用chown 和chmod 命令设置日志文件权限。 |
日志缓冲 |
控制日志的写入方式,减少磁盘I/O。 |
access_log /var/log/nginx/access.log buffer=16k flush=1m; |
6.Nginx的安全设置
知识点 |
描述 |
示例 |
防止目录列表 |
禁用目录浏览,防止敏感信息泄露。 |
autoindex off; |
限制访问 |
限制特定IP或IP范围的访问。 |
allow 192.168.1.0/24; deny all; |
HTTPS强制跳转 |
强制所有HTTP请求通过HTTPS。 |
if ($http_x_forwarded_proto != 'https') { return 301 https://$host$request_uri; } |
配置SSL |
使用SSL/TLS加密流量,提高安全性。 |
ssl on; ssl_certificate /path/to/cert.pem; ssl_certificate_key /path/to/key.pem; |
禁用SSL弱加密 |
禁用不安全的SSL/TLS协议和密码套件。 |
ssl_protocols TLSv1.2; ssl_prefer_server_ciphers on; |
配置HSTS |
HTTP Strict Transport Security,强制客户端始终通过HTTPS连接。 |
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains;"; |
7.Nginx的性能优化
知识点 |
描述 |
示例 |
连接超时 |
设置连接超时时间,优化连接效率。 |
proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; |
压缩设置 |
启用压缩,减少传输数据量。 |
gzip on; gzip_types text/plain text/css text/xml application/json; |
静态资源优化 |
缓存和压缩静态资源,提高加载速度。 |
`location ~* .(jpg |
客户端缓冲区 |
控制客户端缓冲区的大小,优化响应速度。 |
proxy_buffer_size 4k; proxy_buffers 4 32k; |
禁用不必要的日志 |
减少不必要的日志记录,提高性能。 |
access_log off; |
禁用本地解析 |
避免DNS查询导致的延迟。 |
set_real_ip_from 192.168.1.0/24; real_ip_header X-Forwarded-For; |
8. Nginx的邮件代理设置
知识点 |
描述 |
示例 |
IMAP/POP3代理 |
Nginx可以作为IMAP/POP3的代理服务器。 |
使用imap 或pop3 指令配置代理。 |
SMTP代理 |
Nginx可以作为SMTP的代理服务器,转发邮件。 |
使用smtp 指令配置代理。 |
SSL邮件代理 |
配置SSL加密的邮件代理服务。 |
ssl_certificate /path/to/cert.pem; ssl_certificate_key /path/to/key.pem; |
邮件代理认证 |
配置邮件代理的认证机制。 |
使用auth_http 指令实现认证。 |
邮件代理日志 |
记录邮件代理的请求和错误信息。 |
error_log /var/log/nginx/mail_error.log debug; |
邮件代理性能 |
优化邮件代理的性能,如连接超时设置。 |
proxy_connect_timeout 5s; proxy_send_timeout 5s; proxy_read_timeout 5s; |
注意,Nginx主要被用作Web服务器和反向代理,其邮件代理功能并不常用,且通常由专门的邮件服务器软件(如Postfix、Dovecot)来提供。
9.Nginx的web服务性能监控
知识点 |
描述 |
示例 |
启用访问日志 |
记录所有HTTP请求的详细信息,用于监控和分析。 |
默认情况下,访问日志位于/var/log/nginx/access.log 。 |
启用错误日志 |
记录服务器错误和潜在问题,有助于故障排查。 |
默认错误日志位于/var/log/nginx/error.log 。 |
使用第三方模块 |
利用如ngx_http_stub_status_module等第三方模块来监控性能。 |
http { include /path/to/status/status.conf; } |
实时性能监控 |
通过实时监控工具(如Nginx Plus中的ngx_http_status_module)获取性能指标。 |
location /status { stub_status on; access_log off; } |
日志分析工具 |
使用如GoAccess、AWStats等日志分析工具来解析和可视化访问日志。 |
goaccess /var/log/nginx/access.log |
性能基准测试 |
使用工具如Apache JMeter、ab(Apache Bench)进行压力测试和性能基准测试。 |
使用ab -n 1000 -c 100 http://example.com/ 进行测试 |
10.Nginx的模块系统
知识点 |
描述 |
示例 |
模块类型 |
Nginx的模块分为几种类型,包括核心模块、基础模块、HTTP模块、Mail模块等。 |
核心模块是Nginx功能的基础,如ngx_core_module。 |
配置模块 |
通过配置文件中的指令块来配置模块的行为。 |
如使用http 块配置HTTP模块。 |
加载模块 |
模块可以在编译Nginx时静态编译进去,也可以运行时动态加载。 |
使用load_module 指令加载动态模块。 |
第三方模块 |
除了Nginx官方提供的模块外,还有许多第三方模块可供使用。 |
如使用ngx_http_gzip_module模块启用Gzip压缩。 |
模块开发 |
开发者可以编写自己的模块来扩展Nginx的功能。 |
需要了解Nginx的模块开发API和框架。 |
模块调试 |
调试模块时可以使用Nginx的日志功能,或者使用专门的调试工具。 |
使用error_log 指令设置日志级别。 |
11.Nginx的高可用性配置
知识点 |
描述 |
示例 |
负载均衡 |
Nginx可以作为负载均衡器,将流量分发到多个后端服务器。 |
使用upstream 指令定义服务器组,并配置负载均衡策略。 |
健康检查 |
通过健康检查确保流量只会被转发到健康的后端服务器。 |
使用proxy_next_upstream 指令实现健康检查。 |
会话持久性 |
确保来自同一客户端的请求始终被转发到同一个后端服务器。 |
使用ip_hash 指令实现会话持久性。 |
故障转移 |
当一个后端服务器失败时,自动将流量转移到其他服务器。 |
通过upstream 块中的fail_timeout 参数实现。 |
集群部署 |
在多个Nginx实例之间实现高可用性,通常结合使用如Keepalived等工具。 |
使用VRRP协议实现Nginx的高可用性。 |
热备份 |
实现无感知的故障转移,确保服务的连续性。 |
使用nginx -s reload 进行配置的热更新。 |
12. Nginx的SSL和TLS配置
知识点 |
描述 |
示例 |
SSL证书配置 |
配置SSL证书和私钥,启用HTTPS。 |
ssl_certificate /path/to/cert.pem; ssl_certificate_key /path/to/key.pem; |
密码套件配置 |
设置密码套件优先级,禁用不安全的密码套件。 |
ssl_prefer_server_ciphers on; ssl_protocols TLSv1.2 TLSv1.3; |
证书链配置 |
配置完整的证书链,包括中间证书。 |
ssl_trusted_certificate /path/to/ca-bundle.pem; |
OCSP Stapling |
配置在线证书状态协议(OCSP)固定,减少证书验证时间。 |
ssl_stapling on; ssl_stapling_verify on; |
会话缓存和票据 |
配置SSL会话缓存和票据,提高性能。 |
ssl_session_cache shared:SSL:10m; ssl_session_tickets off; |
TLS重握手 |
防止特定条件下的TLS重握手攻击。 |
ssl_session_timeout 1h; |
13.Nginx的Websocket支持的配置
知识点 |
描述 |
示例 |
Websocket 支持 |
Nginx支持作为Websocket服务的代理。 |
使用proxy_http_version 1.1; 启用Websocket支持。 |
Websocket 代理 |
将Websocket请求转发到后端服务器。 |
location /websocket/ { proxy_pass http://backend; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } |
Websocket 持久连接 |
保持Websocket连接活跃。 |
proxy_set_header Connection ""; |
Websocket 子协议 |
支持Websocket子协议。 |
proxy_set_header Sec-WebSocket-Protocol $http_sec_websocket_protocol; |
Websocket 性能 |
优化Websocket代理的性能。 |
调整缓冲区大小和延迟参数,例如:proxy_buffers 8 4k; proxy_buffer_size 2k; |
Websocket 安全 |
配置SSL/TLS加密Websocket连接。 |
与SSL配置类似,确保使用wss:// 协议。 |
14.Nginx的限流和防DDos攻击
知识点 |
描述 |
示例 |
限流 |
限制客户端的请求频率,防止滥用。 |
使用limit_req 模块进行请求频率限制。 |
防DDoS攻击 |
通过限制单个IP的连接数和请求频率来减轻DDoS攻击的影响。 |
使用limit_conn 和limit_req 模块。 |
SYN Floods 保护 |
配置TCP参数以减轻SYN Floods攻击。 |
通过调整操作系统的TCP参数来实现。 |
IP黑名单 |
阻止特定IP地址的访问。 |
使用deny 指令在配置文件中设置黑名单。 |
白名单 |
允许特定IP地址的访问,而拒绝其他所有访问。 |
使用allow 和deny 指令组合使用。 |
连接队列 |
限制等待连接队列的长度。 |
使用listen 指令的backlog 参数。 |
15.Nginx的URL重写和重定向
知识点 |
描述 |
示例 |
URL重写 |
用于改变请求的URI,而不改变请求方法。 |
使用rewrite 指令实现URL重写。 |
重定向 |
将请求从一个URI重定向到另一个URI,并改变请求方法为GET。 |
使用return 指令进行301或302重定向。 |
正则表达式 |
在URL重写和重定向中使用正则表达式匹配特定的模式。 |
rewrite ^oldpath/(.*)$ /newpath/$1 permanent; |
重定向到HTTPS |
将所有HTTP请求重定向到HTTPS。 |
if ($http_x_forwarded_proto != 'https') { return 301 https://$host$request_uri; } |
路径别名 |
使用别名重写URL路径,指向不同的文件系统路径。 |
rewrite ^/path/(.*)$ /alias/$1 break; |
重定向规则优先级 |
指定重定向和重写的优先级,确保正确处理请求。 |
使用if 或try_files 指令确定请求处理顺序。 |
16.Nginx的地理ip定位
知识点 |
描述 |
示例 |
地理IP模块 |
Nginx可以使用地理IP模块根据客户端IP地址定位其地理位置。 |
使用geo 指令根据IP地址进行地理位置匹配。 |
地理位置数据库 |
需要一个IP地址到地理位置的映射数据库。 |
可以使用MaxMind的GeoLite数据库。 |
基于位置的路由 |
根据客户端的地理位置将请求路由到不同的后端服务器。 |
geo $location { default "international"; include /path/to/geoip.conf; } |
语言定向 |
根据用户所在地区提供不同语言的版本。 |
使用if 和geo 指令结合语言版本提供。 |
访问限制 |
根据地理位置限制或允许某些区域的访问。 |
使用allow 和deny 指令基于地理位置进行访问控制。 |
性能考虑 |
使用地理IP定位可能会影响性能,需要合理配置以减少延迟。 |
使用高效的查找算法和缓存策略 |
17.Nginx的缓存防篡改和验证
知识点 |
描述 |
示例 |
缓存验证 |
确保缓存内容与原始服务器内容保持一致,防止缓存数据被篡改。 |
使用proxy_cache_valid 指令设置缓存响应的验证时机和状态码。 |
缓存锁定 |
防止在缓存数据还未完全写入磁盘时,另一个请求又从上游服务器获取相同资源。 |
使用proxy_cache_lock 指令启用缓存锁定,以同步对缓存文件的访问。 |
缓存过期 |
控制缓存内容的生命周期,确保内容的及时更新或重新验证。 |
使用expires 指令设置静态资源的过期时间,或者通过proxy_cache_valid 指令设置缓存的有效时间。 |
缓存刷新 |
提供一种机制来刷新或清除缓存中的特定内容,以响应内容更新。 |
使用purge 指令清除缓存,通常与第三方模块如ngx_cache_purge 结合使用。 |
缓存重试 |
当后端服务不可用时,设置重试逻辑以提高获取缓存内容的成功率。 |
使用proxy_next_upstream 指令定义重试逻辑,如proxy_next_upstream error timeout 。 |
缓存安全性 |
确保缓存数据的安全性,防止未授权访问或敏感数据泄露。 |
通过合理的权限设置、网络隔离以及使用安全的传输层协议(如TLS)增强缓存的安全性。 |
18.Nginx的限流策略
知识点 |
描述 |
示例 |
限流基本概念 |
限流是控制进入系统的请求数量,以保护系统不被过载。 |
使用limit_req 和limit_conn 模块来实现限流。 |
请求频率限制 |
限制单个客户端在特定时间内可以发起的请求数量。 |
limit_req zone=req_limit burst=5 nodelay; |
连接数限制 |
限制单个客户端可以同时保持的连接数。 |
limit_conn zone=conn_limit; |
漏桶算法 |
一种流行的限流算法,平滑处理请求流量。 |
Nginx的limit_req 模块使用漏桶算法。 |
令牌桶算法 |
另一种限流算法,允许一定程度的突发请求。 |
可以通过自定义模块或第三方模块实现。 |
基于IP的限流 |
根据客户端IP地址进行限流。 |
使用$binary_remote_addr 作为limit_req 的键。 |
基于用户名的限流 |
对特定的用户名或会话进行限流。 |
可以结合认证模块,使用用户标识作为限流键。 |
19. Nginx的监控和调试
知识点 |
描述 |
示例 |
日志级别 |
Nginx提供了不同的日志级别,用于记录不同严重性的信息。 |
error_log 指令可以设置日志级别,如debug 、info 、notice 、warn 、error 、crit 、alert 或emerg 。 |
调试日志 |
在开发和调试过程中,可以使用更高级别的日志记录来获取详细信息。 |
设置error_log 为debug 级别以获取详细日志。 |
性能监控 |
使用工具和模块来监控Nginx的性能指标,如请求处理时间、活跃连接数等。 |
利用OpenResty、ngx_http_stub_status_module等工具。 |
请求跟踪 |
跟踪单个请求的完整处理过程,以便于调试。 |
可以通过增加日志记录的详细程度来实现请求跟踪。 |
核心转储 |
当Nginx发生故障时,生成核心转储文件,用于后续分析。 |
使用操作系统工具如gdb 分析核心转储文件。 |
性能分析 |
使用性能分析工具来识别瓶颈和优化点。 |
使用ab (Apache Bench)、 siege 、wrk 等工具进行压力测试。 |
20. Nginx的高级配置和优化策略
知识点 |
描述 |
示例 |
优化文件描述符 |
调整Nginx和操作系统的文件描述符限制,以支持更多并发连接。 |
在Nginx配置中使用worker_rlimit_nofile 指令。 |
优化网络参数 |
调整TCP缓冲区大小和连接超时设置,减少网络延迟。 |
在sysctl 配置中调整网络相关参数。 |
使用SSL/TLS优化 |
SSL/TLS可能会增加延迟,通过启用SSL会话缓存和Ticket机制来优化。 |
使用ssl_session_cache 和ssl_session_tickets 指令。 |
优化内存使用 |
通过调整缓冲区大小和数量,减少内存占用。 |
使用proxy_buffers 和client_header_buffer_size 指令。 |
优化静态资源服务 |
通过配置静态资源的缓存和压缩,提高响应速度。 |
使用expires 、gzip 和sendfile 指令。 |
优化数据库代理 |
减少数据库查询次数,使用缓存和索引优化数据库代理性能。 |
根据后端数据库的性能调整Nginx的代理配置。 |
21. Nginx的容器化部署
知识点 |
描述 |
示例 |
Docker部署 |
Nginx可以在Docker容器中运行,实现快速部署和隔离。 |
使用官方Nginx Docker镜像或自定义Dockerfile构建镜像。 |
Kubernetes部署 |
在Kubernetes集群中部署Nginx,实现自动扩展和自我修复。 |
使用Kubernetes部署和服务对象配置Nginx。 |
配置卷 |
在容器中使用卷来挂载外部配置文件和证书。 |
在Docker容器中使用-v 参数挂载配置卷。 |
健康检查 |
实现容器化Nginx的健康检查,确保负载均衡器只转发给健康的实例。 |
在Kubernetes中使用Liveness和Readiness探针。 |
资源限制 |
在容器中设置资源限制,避免Nginx占用过多系统资源。 |
在Docker中使用--memory 参数设置内存限制。 |
日志管理 |
容器化部署中需要合理管理日志,以便监控和分析。 |
将容器日志输出到第三方日志系统,如ELK堆栈。 |
22.Nginx的模块开发与自定义
知识点 |
描述 |
示例 |
模块开发基础 |
Nginx模块开发需要熟悉Nginx的API和模块框架。 |
学习Nginx的模块编写指南和示例代码。 |
配置指令 |
开发模块时可以定义新的配置指令,供用户在配置文件中使用。 |
使用ngx_command_t 结构定义指令。 |
处理HTTP请求 |
编写模块以处理HTTP请求,可以介入请求的读取、处理和响应过程。 |
使用ngx_http_request_t 结构处理请求。 |
阶段处理器 |
Nginx模块可以设置不同的阶段处理器,如访问阶段、内容阶段等。 |
使用ngx_http_phases 定义阶段处理器。 |
模块依赖 |
模块之间可能存在依赖关系,需要在配置中声明。 |
使用ngx_module_t 结构体中的ctx 和index 字段声明依赖。 |
编译和测试 |
开发完成后,需要编译并测试模块以确保其正确性。 |
使用Nginx的./configure 和make 命令编译模块。 |
模块签名 |
为了安全性,自定义模块可以进行签名,以便在Nginx中验证。 |
使用SSL签名机制对模块进行签名。 |
最后给个基本的配置文件示例作为参考吧:
# 用户和用户组
user nginx;
# 启动的worker进程数,通常设置为CPU核心数
worker_processes auto;
# 错误日志的路径和日志级别
error_log /var/log/nginx/error.log warn;
# PID文件存放的位置
pid /var/run/nginx.pid;
# 事件模块配置
events {
worker_connections 1024;
}
# HTTP服务器配置
http {
# 文件扩展名与文件类型映射
include /etc/nginx/mime.types;
default_type application/octet-stream;
# 日志格式定义
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# 访问日志的路径
access_log /var/log/nginx/access.log main;
# 开启高效文件传输模式
sendfile on;
# 防止网络阻塞时,发送延迟
tcp_nopush on;
# 防止网络阻塞时,发送堆叠
tcp_nodelay on;
# 连接超时时间
keepalive_timeout 65;
# Gzip压缩设置
gzip on;
gzip_disable "msie6";
# 包含Nginx的SSL配置文件
include /etc/nginx/ssl.conf;
# 包含Nginx的代理设置文件
include /etc/nginx/proxy.conf;
# 包含Nginx的缓存配置文件
include /etc/nginx/cache.conf;
# 包含Nginx的额外配置文件
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
# 邮件服务器配置
mail {
# (Mail server configuration is not shown)
}
# 流式配置
stream {
# (Stream configuration is not shown)
}