nginxconf_1">nginx.conf配置文件说明
基本结构
- 全局块:位于最外层,定义影响整个Nginx服务器的设置。
- 事件块:配置网络连接相关的设置。
- HTTP块:定义HTTP服务器以及反向代理、负载均衡等特性。
- Server块:定义虚拟主机,即响应哪些请求及如何响应。
- Location块:更精确地控制对特定URL路径的请求。
1. 全局配置
全局配置影响 Nginx 的整体运行,通常位于文件顶部。
nginx">user nginx; # 运行 Nginx 的用户和组
worker_processes auto; # 工作进程数,通常设为 CPU 核心数
error_log /var/log/nginx/error.log warn; # 错误日志路径和级别
pid /var/run/nginx.pid; # 主进程 PID 文件路径
2. 事件配置
事件配置控制 Nginx 处理连接的方式。
nginx">events {
worker_connections 1024; # 每个工作进程的最大连接数
use epoll; # 使用 epoll 事件模型(Linux)
multi_accept on; # 允许同时接受多个连接
}
3. HTTP 配置
HTTP 配置块包含所有与 HTTP 相关的配置。
nginx">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; # 优化数据包发送
tcp_nodelay on; # 禁用 Nagle 算法
keepalive_timeout 65; # 保持连接的超时时间
gzip on; # 启用 gzip 压缩
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; # 包含其他配置文件
include /etc/nginx/sites-enabled/*; # 包含虚拟主机配置
}
4. Server 配置
Server 配置块定义虚拟主机,每个块对应一个域名或 IP 地址。
nginx">server {
listen 80; # 监听端口
server_name example.com; # 服务器名称(域名)
location / {
root /usr/share/nginx/html; # 根目录
index index.html index.htm; # 默认索引文件
}
error_page 404 /404.html; # 404 错误页面
location = /404.html {
root /usr/share/nginx/html;
}
error_page 500 502 503 504 /50x.html; # 50x 错误页面
location = /50x.html {
root /usr/share/nginx/html;
}
}
5. Location 配置
Location 配置块定义如何处理特定 URL 路径的请求。
nginx">location /images/ {
root /data; # 文件根目录
index index.html;
}
location ~ \.php$ {
proxy_pass http://php_backend; # 反向代理到 PHP 后端
include fastcgi_params; # 包含 FastCGI 参数
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
6. 反向代理配置
Nginx 常用作反向代理,将请求转发到后端服务器。
nginx">http {
upstream backend {
# 负载均衡算法: round-robin (默认), least_conn, ip_hash, 或者其他
# 使用ip_hash实现简单的会话保持
ip_hash;
# 后端服务器列表
server 192.168.1.101:8080 max_fails=3 fail_timeout=30s; # 后端服务器 1
server 192.168.1.102:8080 max_fails=3 fail_timeout=30s; # 后端服务器 2
# 备用服务器,在所有主服务器都不可用时启用
server 192.168.1.103:8080 backup;
# 健康检查(需要第三方模块或使用商业版)
# check interval=3000 rise=2 fall=5 timeout=1000 type=http;
# check_http_send "HEAD /health HTTP/1.0\r\n\r\n";
# check_http_expect_alive http_2xx http_3xx;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend; # 反向代理到后端服务器
# 设置HTTP头部信息
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 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
send_timeout 60s;
# 缓冲区大小设置
proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
proxy_temp_file_write_size 256k;
# 如果后端响应头中没有指定Content-Length,则允许流式传输
proxy_buffering off;
}
# 错误页面处理
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
}
7. SSL/TLS 配置
Nginx 支持 SSL/TLS,用于加密 HTTPS 流量。
nginx">server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/nginx/ssl/example.com.crt; # SSL 证书
ssl_certificate_key /etc/nginx/ssl/example.com.key; # SSL 私钥
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
主要的负载算法
1. 轮询(Round Robin)
- 默认策略:如果没有指定其他策略,Nginx会使用轮询作为默认的负载均衡方法。
- 工作原理:按照顺序依次将请求分配给每个后端服务器。当到达列表末尾时,重新从头开始。
- 适用场景:适合所有后端服务器性能相近的情况。
nginx">upstream backend {
server backend1.example.com;
server backend2.example.com;
}
2. 最少连接(Least Connections)
- 策略描述:将新请求分配给当前连接数最少的服务器。
- 配置方式:通过
least_conn
指令启用。 - 适用场景:适用于长连接或请求处理时间差异较大的情况,可以更均匀地分布负载。
nginx">upstream backend {
least_conn;
server backend1.example.com;
server backend2.example.com;
}
3. IP哈希(IP Hash)
- 策略描述:基于客户端IP地址的哈希值来选择服务器,确保来自同一IP的请求总是被发送到相同的服务器上(除非该服务器不可用)。
- 配置方式:通过
ip_hash
指令启用。 - 适用场景:需要会话保持(sticky sessions)的情况下非常有用,例如用户登录状态需要在多个请求间保持一致。
nginx">upstream backend {
ip_hash;
server backend1.example.com;
server backend2.example.com;
}
4. 加权轮询(Weighted Round Robin)
- 策略描述:允许为每个服务器设置权重,权重越高的服务器接收更多的请求。
- 配置方式:直接在
server
指令中添加weight
参数。 - 适用场景:可以根据服务器性能或容量调整流量分配比例。
nginx">upstream backend {
server backend1.example.com weight=3;
server backend2.example.com;
}
5. 通用Hash(Generic Hash)
- 策略描述:允许你定义一个自定义键(可以是文本、变量等),并根据这个键的哈希值来选择服务器。
- 配置方式:通过
hash
指令和指定的键启用。 - 适用场景:对于某些特定应用可能需要固定某类请求到特定服务器的情况。
nginx">upstream backend {
hash $request_uri consistent;
server backend1.example.com;
server backend2.example.com;
}
注意这里的consistent
关键字用于启用一致性哈希,这有助于减少缓存丢失问题。
6. 最少时间(Least Time,仅限Nginx Plus)
- 策略描述:综合考虑平均响应时间和活跃连接数,选择最佳服务器。
- 配置方式:这是Nginx Plus特有的功能,通过
least_time
指令启用。 - 适用场景:优化响应速度的关键场景。
nginx">upstream backend {
least_time header; # 或者 last_byte
server backend1.example.com;
server backend2.example.com;
}
7. 随机选择(Random,仅限Nginx Plus)
- 策略描述:随机选择一台服务器,可以选择是否结合最小连接数或加权机制。
- 配置方式:这也是Nginx Plus的功能之一。
nginx">upstream backend {
random two least_conn;
server backend1.example.com;
server backend2.example.com;
}
上传or下载
Nginx本身是一个高性能的HTTP和反向代理服务器,主要用于处理静态文件服务、反向代理、负载均衡等任务。虽然Nginx的核心功能并不直接包括复杂的文件上传下载管理,但它可以通过一些配置和技术实现基本的文件上传和下载支持。
文件下载
对于文件下载,Nginx可以非常高效地提供静态文件服务。你只需要将文件存储在Nginx能够访问的目录中,并通过适当的配置来允许客户端访问这些文件即可。
nginx深色版本
nginx">server {
listen 80;
server_name example.com;
location /downloads/ {
alias /path/to/your/files/;
auto_index on; # 可选,开启目录浏览功能
}
}
在这个例子中,当用户访问http://example.com/downloads/
时,Nginx会从服务器上的/path/to/your/files/
目录下查找对应的文件并返回给客户端。如果启用了auto_index on;
,则还会显示该目录下的文件列表。(风险: 使用 Nginx 的 X-Accel-Redirect
实现安全下载)
nginx">location /protected-downloads/ {
internal;
alias /secure/path/to/files/;
}
文件上传
Nginx本身不直接支持文件上传处理,因为这是一个需要后台逻辑处理的操作(如验证文件类型、大小限制、保存文件到服务器等)。然而,你可以结合其他后端技术(如PHP、Python、Node.js等)来实现文件上传的功能,而Nginx作为前端反向代理来转发请求。
其他
server_name
的基本使用
- 精确匹配:
- 直接写入完整的域名。
- 示例:
server_name example.com;
- 影响:只有当请求的Host头完全匹配
example.com
时,此配置块才会处理该请求。
- 通配符匹配:
- 使用
*
来匹配任意数量的字符。 - 前缀通配符:
*.example.com
,匹配所有子域名。 - 后缀通配符:
example.*
,匹配所有顶级域下的example域名。 - 示例:
server_name *.example.com;
- 影响:适用于任何以
.example.com
结尾的子域名请求。
- 使用
- 正则表达式匹配:
- 使用
~
开头表示正则表达式匹配。 - 示例:
server_name ~^(www\.)?(.+)$;
- 影响:可以灵活地定义复杂的匹配规则,比如忽略
www.
前缀等。
- 使用