Nginx 配置详解
Nginx 是一款高性能的 Web 服务器、反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在互联网领域应用广泛。其配置文件采用模块化结构,通过配置文件可以灵活实现负载均衡、动静分离、虚拟主机等功能。
一、配置文件基础结构
Nginx 的主配置文件通常位于/etc/nginx/nginx.conf
,其他配置文件可通过include
指令包含进来:
# 全局块:配置影响nginx全局的指令,通常是和nginx服务运行相关的参数
user nginx; # 运行用户
worker_processes 1; # 工作进程数,通常设置为CPU核心数
# 错误日志配置
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
# events块:影响nginx服务器与用户的网络连接
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;
keepalive_timeout 65;
# 虚拟主机配置
include /etc/nginx/conf.d/*.conf;
}
二、配置块详解
Nginx 配置块详解-CSDN博客
三、虚拟主机配置 (server 块)
虚拟主机是 Nginx 最常用的功能之一,可以在一台服务器上运行多个网站:
# 基于域名的虚拟主机配置
server {
listen 80; # 监听端口
server_name example.com; # 域名
# 访问日志
access_log /var/log/nginx/example.access.log;
# 默认请求处理
location / {
root /var/www/example; # 网站根目录
index index.html index.htm; # 默认首页文件
}
# 错误页面配置
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
# 另一个虚拟主机
server {
listen 80;
server_name blog.example.com;
location / {
proxy_pass http://127.0.0.1:8080; # 反向代理到后端服务
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
四、反向代理与负载均衡配置
Nginx 最强大的功能之一就是反向代理和负载均衡:
# 定义后端服务器集群
upstream backend_servers {
# 轮询调度(默认)
server 192.168.1.100:8080 weight=5; # 权重为5
server 192.168.1.101:8080 weight=3; # 权重为3
server 192.168.1.102:8080 weight=2; # 权重为2
# 会话保持(基于IP哈希)
# ip_hash;
# 健康检查
keepalive 32;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend_servers; # 代理到后端集群
# 常用代理头设置
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_set_header X-Forwarded-Proto $scheme;
# 超时设置
proxy_connect_timeout 30s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
# 缓冲区设置
proxy_buffer_size 32k;
proxy_buffering on;
proxy_buffers 4 128k;
proxy_busy_buffers_size 256k;
proxy_max_temp_file_size 256k;
}
}
五、动静分离配置
将动态请求和静态请求分开处理,提高性能:
server {
listen 80;
server_name example.com;
# 静态文件处理
location ~* .(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
root /var/www/static; # 静态文件目录
expires 7d; # 缓存7天
access_log off; # 关闭访问日志
add_header Cache-Control "public";
}
# 动态请求处理
location / {
proxy_pass http://backend_servers;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
六、HTTPS 配置
配置 HTTPS 需要 SSL 证书:
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri; # 强制跳转HTTPS
}
server {
listen 443 ssl;
server_name example.com;
# SSL证书配置
ssl_certificate /path/to/cert.pem; # 证书文件
ssl_certificate_key /path/to/key.pem; # 私钥文件
# SSL会话缓存
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# SSL协议和加密算法
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384";
# 其他配置
location / {
root /var/www/example;
index index.html;
}
}
七、访问控制配置
限制特定 IP 或用户访问:
server {
listen 80;
server_name example.com;
# 基于IP的访问控制
location /admin {
deny 192.168.1.1; # 拒绝单个IP
allow 192.168.1.0/24; # 允许整个网段
allow 10.1.1.0/16;
deny all; # 拒绝其他所有
}
# 基于密码的访问控制
location /private {
auth_basic "Restricted Area";
auth_basic_user_file /etc/nginx/.htpasswd;
}
}
八、缓存配置
配置 Nginx 缓存可以显著提高性能:
http {
# 定义缓存区域
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend_servers;
# 启用缓存
proxy_cache my_cache;
proxy_cache_valid 200 302 10m; # 200和302状态码缓存10分钟
proxy_cache_valid 404 1m; # 404状态码缓存1分钟
# 设置缓存键
proxy_cache_key "$scheme$request_method$host$request_uri";
# 缓存控制头
add_header X-Cache $upstream_cache_status;
}
}
}
九、Gzip 压缩配置
启用 Gzip 可以减小传输数据量,提高加载速度:
http {
# Gzip压缩配置
gzip on;
gzip_disable "msie6"; # 对IE6禁用
# 压缩级别和类型
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
}
十、常见问题与优化
1)配置加载:修改配置后无需重启服务
nginx -s reload
2)检查配置语法:修改配置后检查语法是否正确
nginx -t
3)优化建议:
- worker_processes 设置为 CPU 核心数
- 根据内存大小调整 worker_connections
- 静态文件使用长缓存策略
- 启用 HTTP/2 提高传输效率
- 使用 sendfile 加速文件传输
4)性能监控:
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}
- 通过 stub_status 模块获取 Nginx 状态
Nginx 的配置非常灵活,可以根据实际需求进行定制。以上只是一些常见的配置示例,实际使用时需要根据服务器性能、应用特点和访问量进行调整和优化。