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)
}