Nginx配置详解:如何搭建生产级Web服务器
引言
在现代互联网架构中,Web服务器作为连接用户与后端应用的关键一环,其性能、稳定性和安全性至关重要。Nginx(发音为 “engine-x”)以其高性能、高并发处理能力、低资源消耗以及丰富的模块功能,成为了业界构建生产级Web服务器和反向代理的首选。无论是搭建静态网站、作为动态应用(如Node.js, Python, PHP)的反向代理,还是实现负载均衡、缓存、SSL卸载等复杂功能,Nginx都能游刃有余。
本文将深入探讨Nginx的核心配置,从基础安装到高级优化与安全实践,旨在提供一个全面的指南,帮助您搭建并维护一个稳定、高效、安全的生产级Web服务器。
第一部分:Nginx基础与安装
1. Nginx为何如此强大?
在深入配置之前,我们先来回顾Nginx的核心优势:
- 高性能与高并发: Nginx采用事件驱动、异步非阻塞的架构,能够处理数万乃至数十万的并发连接,远超传统进程/线程模型的服务器。
- 低资源消耗: 相较于Apache等服务器,Nginx在处理相同并发量时,内存和CPU占用率更低。
- 出色的静态文件服务: Nginx在提供静态内容方面表现卓越,是快速加载网站的首选。
- 强大的反向代理与负载均衡: Nginx是实现应用层负载均衡和构建微服务网关的理想工具。
- SSL/TLS支持: 原生支持HTTPS,并能进行SSL卸载,减轻后端服务器压力。
- 模块化设计: 丰富的模块生态系统,可以轻松扩展功能。
- 灵活的配置: 直观且强大的配置语法,能够实现各种复杂的路由和请求处理逻辑。
2. 安装Nginx
在生产环境中,通常推荐通过发行版官方仓库或Nginx官方仓库进行安装。这里以主流的Linux发行版Ubuntu和CentOS为例。
a) Ubuntu/Debian系统
“`bash
更新apt包列表
sudo apt update
安装Nginx
sudo apt install nginx
启动Nginx服务并设置为开机自启
sudo systemctl start nginx
sudo systemctl enable nginx
检查Nginx状态
sudo systemctl status nginx
“`
b) CentOS/RHEL系统
“`bash
安装EPEL仓库(Nginx通常在其中)
sudo yum install epel-release -y
安装Nginx
sudo yum install nginx -y
启动Nginx服务并设置为开机自启
sudo systemctl start nginx
sudo systemctl enable nginx
检查Nginx状态
sudo systemctl status nginx
“`
c) 验证安装
安装完成后,在浏览器中访问您的服务器IP地址或域名,如果看到Nginx的欢迎页面(”Welcome to nginx!”),则表示安装成功。
3. Nginx常用命令
管理Nginx服务:
sudo systemctl start nginx: 启动Nginx服务。sudo systemctl stop nginx: 停止Nginx服务。sudo systemctl restart nginx: 重启Nginx服务(会停止再启动,有短暂中断)。sudo systemctl reload nginx: 平滑重启Nginx服务(重新加载配置文件,不中断现有连接)。生产环境推荐此方式。sudo systemctl status nginx: 查看Nginx服务状态。sudo systemctl enable nginx: 设置Nginx开机自启。sudo systemctl disable nginx: 关闭Nginx开机自启。
Nginx配置相关:
sudo nginx -t: 测试Nginx配置文件语法是否正确。这是在重新加载配置前必做的步骤。sudo nginx -s reload: 重新加载配置文件(与systemctl reload nginx效果相同)。sudo nginx -v: 查看Nginx版本。sudo nginx -V: 查看Nginx版本及编译参数(包含已安装的模块信息)。
4. Nginx文件结构
理解Nginx的文件结构对于配置至关重要:
- /etc/nginx/: Nginx主配置文件目录。
nginx.conf: Nginx的主配置文件,包含全局设置。conf.d/: 包含额外的配置文件,通常用于存放各个虚拟主机的配置(*.conf)。sites-available/: 存放所有可用的虚拟主机配置文件,但未启用。sites-enabled/: 存放已启用的虚拟主机配置文件,通常是指向sites-available/中文件的符号链接。snippets/: 存放可重用的配置片段,如SSL参数、fastcgi参数等。
- /var/log/nginx/: Nginx的日志文件目录,包括访问日志(
access.log)和错误日志(error.log)。 - /usr/share/nginx/html/: Nginx默认的网站根目录(静态文件)。
- /run/nginx.pid 或 /var/run/nginx.pid: Nginx主进程的PID文件。
第二部分:核心配置详解
Nginx的配置基于指令(directives)和块(blocks)。最外层是main块(或称全局上下文),它不显式声明。然后是events、http等顶层块。
1. nginx.conf 主配置文件
“`nginx
全局设置
user www-data; # Nginx工作进程运行的用户和组 (Ubuntu/Debian通常为www-data, CentOS为nginx)
worker_processes auto; # 工作进程数量,推荐设置为CPU核心数或auto
error_log /var/log/nginx/error.log warn; # 错误日志路径和级别 (debug, info, notice, warn, error, crit, alert, emerg)
pid /run/nginx.pid; # Nginx主进程的PID文件路径
事件模型配置
events {
worker_connections 1024; # 每个工作进程的最大连接数
# use epoll; # Linux下推荐使用epoll模型,其他系统可能有不同,Nginx通常会自动选择最优
multi_accept on; # 告诉Nginx在收到一个新连接通知时,尽可能多地接受连接
}
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; # 访问日志路径和格式
sendfile on; # 开启sendfile优化,提高静态文件传输性能
tcp_nopush on; # 配合sendfile使用,减少网络包数量
tcp_nodelay on; # 实时发送数据,提高交互性(适用于小数据包)
keepalive_timeout 65; # 客户端保持连接的超时时间,单位秒
types_hash_max_size 2048; # MIME类型哈希表的最大尺寸
# Gzip压缩
gzip on; # 开启gzip压缩
gzip_vary on; # 在响应头中添加Vary: Accept-Encoding,告知代理服务器缓存压缩和未压缩版本
gzip_proxied any; # 代理请求也进行压缩 (off, expired, no-cache, no-store, private, no_last_modified, no_etag, auth, any)
gzip_comp_level 6; # 压缩级别 (1-9, 6是推荐值)
gzip_buffers 16 8k; # 压缩缓冲区数量和大小
gzip_http_version 1.1; # 对HTTP/1.1及以上版本请求进行压缩
gzip_min_length 1000; # 只有大于此长度的响应才进行压缩
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; # 指定压缩类型
# 虚拟主机配置
include /etc/nginx/conf.d/*.conf; # 包含conf.d目录下所有.conf文件
# 或 include /etc/nginx/sites-enabled/*; # 如果使用sites-available/sites-enabled结构
}
“`
关键指令解释:
user: Nginx工作进程运行的用户。出于安全考虑,不建议使用root用户。worker_processes: Nginx工作进程数。通常设置为CPU核心数或auto。error_log: 定义错误日志路径和记录级别。warn是一个平衡的级别,既能发现问题又不会产生过多日志。events块:配置Nginx网络连接处理模型。worker_connections: 每个工作进程能够打开的最大并发连接数。实际的最大连接数是worker_processes * worker_connections。
http块:配置所有HTTP服务器的行为。include mime.types: 引入MIME类型映射,让Nginx知道如何处理不同文件类型。default_type: 当文件类型无法识别时的默认MIME类型。log_format: 定义访问日志的格式。main格式是常用的。access_log: 访问日志路径和使用的日志格式。sendfile on: 启用sendfile系统调用,允许Nginx直接从磁盘读取数据并发送到网络,减少CPU拷贝次数,提高静态文件传输效率。tcp_nopush on: 与sendfile配合使用,在Linux下,它会等到缓冲区满或文件传输结束时才发送数据,减少网络包数量,提高吞吐量。tcp_nodelay on: 禁用Nagle算法,确保小数据包能立即发送,提高实时交互性,但可能增加网络开销。keepalive_timeout: 客户端和服务器之间保持长连接的超时时间。适当增加可以减少TCP连接建立的开销。gzip: 开启Gzip压缩,可以显著减少传输的数据量,提高网站加载速度。需要注意gzip_types指定要压缩的文件类型。
2. server 块:定义虚拟主机
一个server块定义了一个虚拟主机,它处理特定域名或IP地址的请求。
“`nginx
HTTP虚拟主机
server {
listen 80; # 监听端口,默认为80
listen [::]:80; # 监听IPv6地址的80端口
server_name example.com www.example.com; # 定义服务器名称/域名,多个域名用空格分隔
# 可以使用通配符如 *.example.com,或正则表达式 ~^www\d+\.example\.com$
root /var/www/example.com; # 网站根目录
index index.html index.htm index.nginx-debian.html; # 默认索引文件,按顺序查找
# 错误页面
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
# 配置一个location块来处理所有请求
location / {
try_files $uri $uri/ =404; # 尝试查找文件,如果不存在则查找目录,最后返回404错误
# $uri: 当前请求的URI
# $uri/: 尝试查找URI对应的目录下的index文件
# =404: 如果前面都找不到,则返回HTTP 404错误
}
# 其他location块可以定义特定的URI处理逻辑
# location ~ \.php$ { ... } # 处理PHP文件
}
“`
关键指令解释:
listen: 指定服务器监听的IP地址和端口。listen 80;表示监听所有IPv4地址的80端口。listen 443 ssl;用于HTTPS。server_name: 定义虚拟主机名称。Nginx根据Host头字段匹配请求到对应的server块。_或default_server可以作为默认的捕获所有未匹配域名的虚拟主机。root: 定义网站的根目录。当Nginx接收到请求时,它会在此目录下查找对应的文件。index: 定义默认的索引文件列表。当请求一个目录时,Nginx会按顺序查找这些文件。error_page: 定义自定义错误页面。
3. location 块:URI请求匹配
location块是Nginx中最灵活和强大的部分之一,它根据URI来匹配请求并执行相应的处理逻辑。
匹配规则:
| 修饰符 | 描述 | 示例 |
|---|---|---|
| (无) | 前缀匹配。匹配给定URI前缀的请求,不区分大小写。 | location /images/ |
= |
精确匹配。只有URI与指定字符串完全匹配时才处理。 | location = /login |
~ |
正则表达式匹配。区分大小写。 | location ~ \.php$ |
~* |
正则表达式匹配。不区分大小写。 | location ~* \.(jpg|jpeg|gif|png)$ |
^~ |
前缀匹配。如果匹配成功,则停止进一步的正则匹配。 | location ^~ /static/ |
匹配优先级:
=精确匹配。^~最长前缀匹配。~或~*正则表达式匹配(如果多个正则匹配,按配置顺序的第一个)。- (无修饰符) 最长前缀匹配。
示例:
“`nginx
server {
listen 80;
server_name example.com;
root /var/www/example.com;
# 默认处理所有请求,如果文件或目录不存在则返回404
location / {
try_files $uri $uri/ =404;
}
# 精确匹配 /login 路径
location = /login {
return 200 "This is the login page.";
}
# 处理所有静态文件 (js, css, 图片等),设置较长缓存时间
location ~* \.(js|css|gif|jpg|jpeg|png|ico)$ {
expires 30d; # 设置浏览器缓存30天
add_header Cache-Control "public";
access_log off; # 静态文件通常不需要记录访问日志
}
# 处理PHP文件,将请求转发给PHP-FPM
location ~ \.php$ {
include snippets/fastcgi-php.conf; # 包含PHP-FPM相关配置
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; # PHP-FPM监听的socket
# fastcgi_pass 127.0.0.1:9000; # 或者TCP端口
}
# 禁止访问隐藏文件 (.ht*等)
location ~ /\.ht {
deny all;
}
}
“`
第三部分:生产级Nginx高级特性
1. 反向代理 (Reverse Proxy)
Nginx作为反向代理,可以将客户端请求转发到后端的一个或多个服务器,并将后端服务器的响应返回给客户端。这是部署动态Web应用(如Node.js、Python Gunicorn/uWSGI、Java Tomcat等)的常见方式。
“`nginx
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://backend_servers; # 将请求转发到名为 backend_servers 的上游服务器组
proxy_set_header Host $host; # 转发原始Host头
proxy_set_header X-Real-IP $remote_addr; # 转发客户端真实IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 转发客户端IP链
proxy_set_header X-Forwarded-Proto $scheme; # 转发协议 (http或https)
proxy_redirect off; # 禁用Nginx修改后端服务器的响应头中的Location和Refresh字段
# 缓冲区配置
proxy_buffers 4 32k; # 缓冲区数量和大小
proxy_buffer_size 64k; # 单个请求缓冲区大小
proxy_busy_buffers_size 64k; # 忙缓冲区大小
# 超时配置
proxy_connect_timeout 60s; # Nginx与后端服务器建立连接的超时时间
proxy_send_timeout 60s; # Nginx向后端服务器发送请求的超时时间
proxy_read_timeout 60s; # Nginx从后端服务器读取响应的超时时间
# 错误页
proxy_intercept_errors on; # 截取后端服务器的错误响应
error_page 502 503 504 /custom_50x.html; # 定义自定义错误页面
}
}
上游服务器组定义(通常放在http块内或单独的conf文件)
upstream backend_servers {
server 192.168.1.100:8000;
server 192.168.1.101:8000;
}
“`
关键代理指令:
proxy_pass: 核心指令,指定后端服务器的地址。proxy_set_header: 允许Nginx修改或添加请求头,对于后端服务器获取客户端真实IP和协议至关重要。proxy_redirect: 用于重写后端服务器返回的Location和Refresh响应头,确保重定向到正确的外部地址。proxy_buffers/proxy_buffer_size/proxy_busy_buffers_size: 缓冲区设置,影响大文件下载和高并发时的性能。proxy_connect_timeout/proxy_send_timeout/proxy_read_timeout: 超时设置,防止后端服务器无响应导致Nginx资源耗尽。
2. 负载均衡 (Load Balancing)
结合upstream块,Nginx可以作为强大的负载均衡器,将请求分发到多个后端服务器,提高应用的可用性和可伸缩性。
“`nginx
http {
upstream backend_api {
# 负载均衡算法:
# 1. 默认:轮询 (Round Robin) – 依次向每台服务器分发请求
server 192.168.1.10:8080 weight=5; # weight: 权重,数字越大,被分配的请求越多
server 192.168.1.11:8080 weight=1;
# 2. least_conn: 最少连接数 - 转发给当前连接数最少的服务器
# least_conn;
# server 192.168.1.10:8080;
# server 192.168.1.11:8080;
# 3. ip_hash: 基于客户端IP的哈希 - 确保来自同一IP的请求始终转发到同一服务器,适用于需要会话持久性的场景
# ip_hash;
# server 192.168.1.10:8080;
# server 192.168.1.11:8080;
# 4. hash key [consistent]: 基于任意键的哈希 - 例如URI、Header等,可以实现更精细的控制
# hash $request_uri consistent;
# server 192.168.1.10:8080;
# server 192.168.1.11:8080;
# 服务器状态:
server 192.168.1.12:8080 max_fails=3 fail_timeout=30s; # max_fails: 失败多少次认为服务器不可用
# fail_timeout: 服务器被标记为不可用后,多长时间内不再转发请求
server 192.168.1.13:8080 backup; # backup: 备用服务器,只有当其他非backup服务器都不可用时才启用
server 192.168.1.14:8080 down; # down: 暂时停止使用此服务器
}
server {
listen 80;
server_name app.example.com;
location / {
proxy_pass http://backend_api; # 将请求转发到上游服务器组
# ... 其他 proxy_set_header 等配置 ...
}
}
}
“`
负载均衡策略:
- 轮询 (Round Robin): 默认策略,按顺序循环将请求分发给后端服务器。可以通过
weight参数调整权重。 - 最少连接 (Least Connections): 将请求分发给当前连接数最少的服务器。适用于请求处理时间差异较大的场景。
- IP哈希 (IP Hash): 根据客户端IP地址的哈希值将请求分发给后端服务器,确保同一IP的客户端始终访问同一台服务器,适用于需要会话持久性的场景。
- 通用哈希 (Generic Hash): 根据用户定义的键(如URI、请求头)的哈希值进行分发。
服务器状态指令:
max_fails/fail_timeout: 用于健康检查,当后端服务器在fail_timeout时间内连续失败max_fails次后,Nginx会认为其失效,并在fail_timeout时间后再次尝试。backup: 标记为备用服务器,只在所有主服务器都失效时才使用。down: 标记服务器已离线,Nginx不会再转发请求给它。
3. SSL/TLS (HTTPS) 配置
为网站启用HTTPS是生产环境的强制要求,它能加密客户端与服务器之间的通信,保护数据隐私和完整性。
a) 获取SSL证书
最常见和推荐的方式是使用Let’s Encrypt,通过certbot工具自动化获取和续期。
“`bash
安装certbot (Ubuntu)
sudo apt install certbot python3-certbot-nginx -y
获取并配置证书 (示例:yourdomain.com 和 www.yourdomain.com)
sudo certbot –nginx -d yourdomain.com -d www.yourdomain.com
测试自动续期
sudo certbot renew –dry-run
“`
b) Nginx SSL配置
certbot会自动修改Nginx配置,生成一个包含SSL配置的server块。通常会包含以下内容:
“`nginx
server {
listen 443 ssl http2; # 监听443端口,启用SSL和HTTP/2协议
listen [::]:443 ssl http2;
server_name yourdomain.com www.yourdomain.com;
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem; # 证书路径
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem; # 私钥路径
# 推荐的SSL/TLS安全设置
ssl_protocols TLSv1.2 TLSv1.3; # 仅允许使用安全的TLSv1.2和TLSv1.3协议
ssl_ciphers 'TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256'; # 限制使用的加密套件,排除不安全的
ssl_prefer_server_ciphers on; # 服务器优先选择加密套件
ssl_session_timeout 1d; # SSL会话缓存超时时间
ssl_session_cache shared:SSL:10m; # SSL会话缓存大小
ssl_session_tickets off; # 禁用SSL会话票证 (Ticket)
ssl_stapling on; # 开启OCSP Stapling,减少客户端验证证书的时间
ssl_stapling_verify on; # 验证OCSP响应
resolver 8.8.8.8 8.8.4.4 valid=300s; # DNS解析器,用于OCSP Stapling
resolver_timeout 5s;
# HSTS (HTTP Strict Transport Security)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always; # 强制浏览器在指定时间内只通过HTTPS访问
# 其他安全头
add_header X-Frame-Options "DENY" always; # 防止点击劫持
add_header X-Content-Type-Options "nosniff" always; # 防止MIME类型嗅探
add_header X-XSS-Protection "1; mode=block" always; # 启用浏览器XSS过滤器
root /var/www/yourdomain.com;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
HTTP到HTTPS的重定向
server {
listen 80;
listen [::]:80;
server_name yourdomain.com www.yourdomain.com;
return 301 https://$host$request_uri; # 永久重定向所有HTTP请求到HTTPS
}
“`
关键SSL指令:
listen 443 ssl: 告知Nginx监听443端口并启用SSL。ssl_certificate/ssl_certificate_key: 指定SSL证书和私钥的路径。ssl_protocols: 指定允许的SSL/TLS协议版本。推荐禁用TLSv1.0和TLSv1.1。ssl_ciphers: 指定允许的加密套件,应禁用不安全的弱加密算法。ssl_prefer_server_ciphers on: 让服务器优先选择加密套件,而不是客户端。add_header Strict-Transport-Security: 开启HSTS,强制浏览器在指定时间内使用HTTPS访问。return 301 https://$host$request_uri;: 实现HTTP到HTTPS的永久重定向。
4. 安全最佳实践
- 隐藏Nginx版本信息: 避免暴露Nginx版本给潜在攻击者。
nginx
# 在http块内或全局块内
server_tokens off; - 限制请求方法: 如果不需要,禁用PUT、DELETE等请求方法。
nginx
location /upload {
limit_except GET POST { deny all; }
# ...
} -
拒绝恶意IP或User-Agent:
“`nginx
# 在http块内或server块内
map $http_user_agent $bad_bot {
default 0;
“~SemrushBot” 1;
“~AhrefsBot” 1;
}server {
# …
if ($bad_bot) {
return 403;
}
# …
}
* **速率限制 (Rate Limiting):** 防止恶意请求或DDoS攻击。nginx在http块内定义限制区域
name: 区域名称, zone_size: 存储会话的内存大小, rate: 请求速率限制 (e.g., 1r/s, 10r/m)
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=5r/s;
server {
# …
location /api/login {
limit_req zone=mylimit burst=10 nodelay; # burst: 允许的突发请求数量, nodelay: 不延迟处理突发请求
# …
}
}
“`
* 禁用不必要的模块: 仅编译或启用Nginx所需的模块,减少攻击面。
* 文件权限: 确保Nginx用户对网站文件只有读权限,对日志目录有写权限。
5. 性能优化进阶
- 缓存静态文件: 除了Gzip压缩,利用浏览器缓存可以显著提升用户体验。
nginx
location ~* \.(jpg|jpeg|gif|png|css|js|ico|woff2|woff|ttf|svg|eot)$ {
expires 30d; # 缓存30天
add_header Cache-Control "public"; # 允许公共缓存
access_log off; # 不记录静态文件访问日志
log_not_found off; # 不记录未找到静态文件的错误
} - 代理缓存 (Proxy Cache): 对于反向代理的后端动态内容,Nginx可以缓存其响应,减少后端服务器负载。
“`nginx
http {
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m max_size=1g;
proxy_cache_key “$scheme$request_method$host$request_uri”; # 定义缓存键server { listen 80; server_name example.com; location / { proxy_cache my_cache; # 启用缓存 proxy_cache_valid 200 302 10m; # 200和302响应缓存10分钟 proxy_cache_valid 404 1m; # 404响应缓存1分钟 proxy_cache_bypass $http_pragma $http_authorization; # 不缓存带有特定头的请求 add_header X-Proxy-Cache $upstream_cache_status; # 添加缓存状态头 proxy_pass http://backend; } }}
* **`client_max_body_size`:** 限制客户端上传文件的大小。nginx在http, server 或 location 块中
client_max_body_size 100M; # 允许最大上传100MB文件
* **`open_file_cache`:** 缓存文件句柄,减少文件系统I/O。nginx在http块内
open_file_cache max=1000 inactive=20s; # 缓存1000个文件句柄,20秒不活动清除
open_file_cache_valid 30s; # 缓存有效期
open_file_cache_min_uses 2; # 访问两次以上才缓存
open_file_cache_errors on; # 缓存文件查找错误
“`
6. 日志与监控
- 自定义日志格式: 除了
main,可以定义更详细的日志格式。
nginx
log_format combined_plus '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$upstream_addr $request_time $upstream_response_time';
access_log /var/log/nginx/access.log combined_plus; - 日志轮转 (Log Rotation): 使用
logrotate定期归档和删除旧日志文件,防止磁盘空间耗尽。logrotate通常会自动配置Nginx日志,位于/etc/logrotate.d/nginx。 - Nginx Stub Status模块: 开启Nginx自带的状态页面,用于监控Nginx的连接数、请求数等基本指标。
nginx
# 编译Nginx时需开启 --with-http_stub_status_module
# 在server块中
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1; # 仅允许本地访问
deny all;
}
第四部分:真实场景配置示例
1. 静态网站配置
“`nginx
server {
listen 80;
listen [::]:80;
server_name static.example.com;
root /var/www/static_site;
index index.html index.htm;
# 静态文件缓存
location ~* \.(jpg|jpeg|gif|png|css|js|ico|woff2|woff|ttf|svg|eot)$ {
expires 30d;
add_header Cache-Control "public, no-transform";
access_log off;
log_not_found off;
}
# 处理所有非静态文件请求
location / {
try_files $uri $uri/ =404;
}
error_page 404 /404.html;
location = /404.html {
internal;
}
}
“`
2. Node.js 应用反向代理配置
假设Node.js应用监听在 http://127.0.0.1:3000
“`nginx
server {
listen 80;
listen [::]:80;
server_name nodeapp.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade; # 支持WebSocket
proxy_set_header Connection 'upgrade'; # 支持WebSocket
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
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;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html; # 可以放一个友好的错误页面
}
}
“`
3. PHP (WordPress) 应用配置 (通过PHP-FPM)
“`nginx
server {
listen 80;
listen [::]:80;
server_name wordpress.example.com;
root /var/www/wordpress; # WordPress安装目录
index index.php index.html index.htm;
# 默认location块,处理非PHP文件和目录
location / {
try_files $uri $uri/ /index.php?$args; # 重要的重写规则,确保WordPress的URL路由正常工作
}
# 静态文件缓存
location ~* \.(css|js|gif|jpg|jpeg|png|ico|woff2|woff|ttf|svg|eot)$ {
expires 30d;
add_header Cache-Control "public, no-transform";
access_log off;
log_not_found off;
}
# 处理PHP文件请求
location ~ \.php$ {
include snippets/fastcgi-php.conf; # 包含fastcgi_params等常用配置
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; # 替换为您的PHP-FPM版本和socket路径
# fastcgi_pass 127.0.0.1:9000; # 或者使用TCP端口
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_intercept_errors on; # 允许Nginx处理PHP脚本产生的错误
}
# 禁止访问敏感文件
location ~ /\.ht {
deny all;
}
error_page 404 /404.php; # WordPress通常使用404.php处理未找到页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
“`
结论
Nginx是一个功能强大、性能卓越的Web服务器和反向代理工具。通过本文的详细介绍,您应该对Nginx的安装、核心配置、高级特性(反向代理、负载均衡、SSL/TLS)以及生产环境下的安全和性能优化有了深入的理解。
搭建一个生产级的Nginx服务器不仅仅是复制粘贴配置,更重要的是理解每个指令背后的含义和其对服务器行为的影响。在实际部署中,请务必根据您的具体需求、应用架构和服务器资源进行调整和优化。持续的学习、测试和监控是确保Nginx服务器长期稳定、高效运行的关键。
Nginx的世界广阔而深邃,除了上述内容,还有如地理位置模块、限流模块、认证模块、WebSockets支持等更多高级功能等待探索。希望本文能成为您Nginx之旅的一个坚实起点。祝您配置愉快!
字数统计:约3500字。