一.Nginx简要
先简单介绍一下Nginx :用于高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。它由俄罗斯程序员Igor Sysoev开发,最初是为解决C10K问题(即同时处理1万个连接)而设计的。
特点 :高性能,低内存消耗,高可靠性,模块化设计,支持热部署
适用性:Windows和Linux都行
配置文件nginx.conf由多个块组成:
全局块(最外层) :配置影响nginx全局的指令
events块(与全局块同级) :配置网络连接相关的参数,会影响nginx服务器或与用户的网络连接
http块(与全局块同级) :可以嵌套多个server,配置代理,缓存,日志定义等
server块(嵌套在 http 块内) :配置虚拟主机的相关参数
location块(嵌套在 server 块内):配置请求的路由,以及各种页面的处理情况
二.不同平台配置示例
示例配置,主要用于了解配置格式,这里分别不同平台举例2份 :
Windows 版 Nginx 配置示例
bash
# 主进程配置块
worker_processes 1; # Windows平台建议设置为1,因为Windows的I/O模型与Linux不同
# 事件处理模块配置
events {
worker_connections 1024; # 每个工作进程的最大连接数
accept_mutex off; # Windows平台需要关闭这个选项
}
# HTTP服务配置
http {
# 包含MIME类型定义文件
include mime.types; # 加载预定义的文件扩展名与MIME类型映射
default_type application/octet-stream; # 默认MIME类型
# 日志配置
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 logs/access.log main; # 访问日志路径和格式
error_log logs/error.log; # 错误日志路径
# 性能优化配置
sendfile on; # 启用高效文件传输模式
tcp_nopush on; # 仅在sendfile开启时有效,优化网络包发送
keepalive_timeout 65; # 保持连接的超时时间(秒)
# 启用Gzip压缩
gzip on; # 开启Gzip压缩功能
gzip_types text/plain text/css application/json application/javascript text/xml; # 需要压缩的文件类型
# 虚拟主机配置
server {
listen 80; # 监听80端口
server_name localhost; # 服务器名称,可以是域名或IP
# 字符集设置
charset utf-8; # 设置默认字符集
# 网站根目录配置
root html; # 网站文件根目录(相对于nginx安装目录)
index index.html index.htm; # 默认首页文件
# 静态文件缓存设置
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d; # 静态资源缓存30天
access_log off; # 不记录静态资源访问日志
}
# 错误页面配置
error_page 404 /404.html; # 404错误页面
error_page 500 502 503 504 /50x.html; # 50x错误页面
# 禁止访问隐藏文件
location ~ /\. {
deny all; # 拒绝所有访问
access_log off; # 不记录访问日志
log_not_found off; # 不记录未找到日志
}
}
}
Linux 版 Nginx 配置示例
shell
# 全局配置
user nginx; # 以nginx用户身份运行工作进程
worker_processes auto; # 自动检测CPU核心数设置工作进程数
pid /run/nginx.pid; # 主进程PID文件位置
# 事件处理模块配置
events {
worker_connections 2048; # 每个工作进程的最大连接数
multi_accept on; # 一个工作进程可以同时接受多个新连接
use epoll; # Linux高性能事件模型
}
# HTTP服务配置
http {
# 基础配置
include /etc/nginx/mime.types; # MIME类型定义文件
default_type application/octet-stream; # 默认MIME类型
# 日志格式定义
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; # 访问日志路径
error_log /var/log/nginx/error.log warn; # 错误日志路径及记录级别
# 性能优化配置
sendfile on; # 启用高效文件传输模式
tcp_nopush on; # 优化网络包发送
tcp_nodelay on; # 禁用Nagle算法
keepalive_timeout 65; # 保持连接的超时时间
types_hash_max_size 2048; # 类型哈希表大小
# 虚拟主机配置
server {
listen 80; # 监听80端口
server_name example.com www.example.com; # 服务器域名
# 网站根目录配置
root /var/www/html; # 网站文件根目录
index index.php index.html index.htm; # 默认首页文件
# 基础安全头设置
add_header X-Frame-Options "SAMEORIGIN"; # 防止点击劫持
add_header X-XSS-Protection "1; mode=block"; # 启用XSS保护
add_header X-Content-Type-Options "nosniff"; # 禁止MIME类型嗅探
# PHP处理配置
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; # PHP-FPM套接字
fastcgi_index index.php;
include fastcgi_params; # 包含FastCGI参数
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
# 静态文件处理
location / {
try_files $uri $uri/ =404; # 尝试按顺序查找文件
}
# 静态资源缓存
location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
expires 365d; # 缓存1年
access_log off; # 不记录访问日志
add_header Cache-Control "public"; # 允许公共缓存
}
# 禁止访问敏感文件
location ~ /(\.|conf|sql|bak|sh|env)$ {
deny all; # 拒绝所有访问
return 404; # 返回404错误
}
}
}
三.多应用场景配置示例
全局配置示例
场景概要:控制Nginx服务级别的全局参数,影响所有server块的默认行为
后续其他场景仅示例关键配置,其他全局配置可套用
bash
# 定义运行Nginx的用户/组(需与系统用户一致)
user www-data;
# 工作进程数(建议设置为CPU核心数或auto自动检测)
worker_processes auto;
# 错误日志路径及级别(debug/info/notice/warn/error/crit)
error_log /var/log/nginx/error.log warn;
# PID文件路径(记录主进程ID)
pid /run/nginx.pid;
# 事件模块配置(核心网络参数)
events {
# 每个worker的最大连接数(决定并发能力)
worker_connections 1024;
# 使用高效事件模型(Linux建议用epoll)
use epoll;
# 开启多请求并行接收(提升吞吐量)
multi_accept on;
}
# HTTP模块全局配置
http {
# MIME类型映射文件(默认包含text/html等)
include /etc/nginx/mime.types;
# 默认MIME类型(当无法识别文件类型时使用)
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;
# 保持连接超时时间(单位:秒)
keepalive_timeout 65;
# 客户端请求头缓冲区大小(根据Header大小调整)
client_header_buffer_size 4k;
# 大型客户端请求头处理(应对复杂Cookie场景)
large_client_header_buffers 4 16k;
# 客户端请求体最大值(影响文件上传大小)
client_max_body_size 100m;
# 开启Gzip压缩(降低传输体积)
gzip on;
gzip_types text/plain text/css application/json application/javascript;
# 包含其他配置文件(如各站点的server配置)
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
静态网站托管
场景概要:托管纯HTML/CSS/JS等静态资源,无后端交互
bash
server {
# 监听标准HTTP端口
listen 80;
# 绑定的域名或IP(支持多个值,空格分隔)
server_name test.com 192.168.1.1;
# 网站文件根目录(必须真实存在)
root /var/www/html;
# 默认索引文件(按顺序尝试匹配)
index index.html index.htm;
# 核心请求处理逻辑
location / {
# 尝试按顺序查找:精确文件→目录→返回404
try_files $uri $uri/ =404;
}
# 禁止访问隐藏文件(增强安全)
location ~ /\. {
deny all;
return 404;
}
}
正向代理(HTTP代理)
场景概要:作为中间代理服务器转发客户端请求(需客户端显式配置代理)
bash
server {
# 代理服务监听端口
listen 3128;
# 必须指定DNS解析服务器
resolver 8.8.8.8 113.113.113.113 valid=300s;
# 所有请求处理
location / {
# 关键指令:将请求转发到客户端指定的原始地址
proxy_pass http://$http_host$request_uri;
# 保留原始Host头
proxy_set_header Host $http_host;
# 连接超时时间(单位:秒)
proxy_connect_timeout 5;
# 禁用代理缓存
proxy_buffering off;
}
}
反向代理(后端应用)
场景概要:隐藏真实后端服务器,转发请求到内部服务(如Java/Python应用)
bash
server {
# 监听标准HTTP端口
listen 80;
# 服务域名(API网关场景)
server_name api.example.com;
# 所有动态请求转发
location / {
# 指向后端服务器组(需提前定义upstream)
proxy_pass http://backend_servers;
# 标准代理头设置(后端获取真实客户端IP)
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_read_timeout 30;
}
# 静态资源单独处理(性能优化)
location ~* \.(css|js|png)$ {
# 静态文件本地路径
root /var/www/static;
# 客户端缓存时间
expires 30d;
}
}
负载均衡
场景概要:将流量均匀分配到多个后端服务器,提高系统容错能力
bash
# 定义后端服务器集群(需放在http配置块内)
upstream backend_servers {
# 负载均衡策略(加权轮询)
server 10.0.0.1:8080 weight=5; # 50%流量
server 10.0.0.2:8080 weight=3; # 30%流量
server 10.0.0.3:8080 weight=2; # 20%流量
# 健康检查参数
max_fails 3;
fail_timeout 10s;
}
server {
listen 80;
server_name test.example.com;
location / {
# 关键指令:请求转发到后端集群
proxy_pass http://backend_servers;
# 故障转移配置
proxy_next_upstream error timeout http_500;
}
}
HTTPS安全加固
场景概要:启用加密传输并配置安全策略,符合PCI DSS标准
bash
server {
# 强制SSL监听+HTTP/2支持
listen 443 ssl http2;
# 服务域名
server_name test.example.com;
# 证书路径(需真实存在)
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# 协议安全配置(禁用旧版TLS)
ssl_protocols TLSv1.2 TLSv1.3;
# 加密套件配置(仅允许强加密算法)
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
# OCSP装订(提升SSL握手性能)
ssl_stapling on;
ssl_stapling_verify on;
# 安全响应头(防XSS/点击劫持等)
add_header X-Frame-Options "SAMEORIGIN" always;
add_header Content-Security-Policy "default-src 'self'";
# 其他业务配置...
}
文件下载服务
场景概要:提供大文件下载支持,可控制下载速度和目录列表
bash
server {
listen 80;
server_name downloads.example.com;
# 文件存储根目录
root /mnt/storage;
# 下载限速配置(单位:字节)
location / {
limit_rate 1m; # 全局限速1MB/s
limit_rate_after 50m; # 前50MB不限速
# 启用目录列表(慎用)
autoindex on;
# 文件列表显示格式
autoindex_format html;
}
# 特殊目录不限速
location /vip/ {
# 关闭限速
limit_rate off;
}
}
请求限流
场景概要:防止CC攻击或突发流量打垮后端服务
bash
# 全局限流定义(http配置块内)
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=100r/m;
server {
location /api/ {
# 应用限流规则(突发队列=5请求)
limit_req zone=api_limit burst=5 nodelay;
# 超时返回429状态码
limit_req_status 429;
proxy_pass http://backend;
}
# 登录接口特殊限制
location /api/login {
# 更严格的限制(10请求/分钟)
limit_req zone=api_limit burst=3;
}
}
IP黑白名单
场景概要:基于网络层控制访问权限,阻止恶意IP
bash
# 地理IP黑名单(http配置块内)
geo $block_ip {
default 0;
192.168.2.0/24 1; # 整个子网
10.0.0.3 1; # 单个IP
}
server {
location / {
# 黑名单检查
if ($block_ip) {
return 403 "Forbidden";
}
# 白名单模式(允许特定IP段)
allow 192.168.9.0/24;
deny all;
# 正常业务处理...
}
}