Nginx 是一个高性能的 HTTP 服务器和反向代理服务器,也是一个电子邮件(IMAP/POP3)代理服务器。由于其高效性和灵活性,Nginx 被广泛应用于各种 web 服务中。本文将详细介绍 Nginx 配置文件的结构和主要配置项,帮助你深入理解并灵活运用 Nginx 配置文件。
一、Nginx 配置文件结构概述
Nginx 的配置文件通常位于 /etc/nginx/nginx.conf
,它采用模块化的方式,配置由指令和上下文(context)组成。主要的上下文包括:
- main:全局配置,作用于 Nginx 的整体行为。
- events:影响 Nginx 如何处理连接的配置。
- http:配置 HTTP 服务器的行为,包含多个服务器配置。
- server:定义虚拟主机,处理具体域名请求。
- location:匹配 URI 的配置。
Nginx 配置文件采用层级结构,不同的上下文可以嵌套。一个基本的配置文件结构如下:
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
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;
types_hash_max_size 2048;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
二、主要配置指令详解
1. user
指令
指定 Nginx 运行的用户和用户组。默认情况下,Nginx 以 nobody
或 nginx
用户运行:
user nginx;
2. worker_processes
指令
定义 Nginx 的工作进程数。可以设置为具体数值或 auto
,让 Nginx 自动决定进程数:
worker_processes auto;
3. error_log
指令
指定错误日志文件及日志级别:
error_log /var/log/nginx/error.log warn;
日志级别从低到高依次为:debug
、info
、notice
、warn
、error
、crit
、alert
、emerg
。
4. pid
指令
指定存放 Nginx 进程 ID 的文件路径:
pid /var/run/nginx.pid;
5. worker_connections
指令
设置每个工作进程允许的最大连接数:
events {
worker_connections 1024;
}
6. include
指令
包含其他配置文件,支持通配符。常用于将配置分离成多个文件,便于管理:
include /etc/nginx/mime.types;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
7. log_format
和 access_log
指令
定义日志格式和访问日志文件位置:
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;
8. sendfile
指令
启用高效文件传输功能:
sendfile on;
9. keepalive_timeout
指令
设置客户端连接保持活动状态的超时时间:
keepalive_timeout 65;
三、HTTP 上下文配置
HTTP 上下文内包含服务器配置及全局 HTTP 服务器参数:
1. server
指令
定义虚拟主机:
http {
server {
listen 80;
server_name example.com www.example.com;
location / {
root /var/www/html;
index index.html index.htm;
}
error_page 404 /404.html;
location = /404.html {
internal;
}
}
}
2. listen
指令
指定服务器监听的端口和地址:
listen 80;
3. server_name
指令
定义匹配请求的域名:
server_name example.com www.example.com;
4. location
指令
定义如何处理特定 URI:
location / {
root /var/www/html;
index index.html index.htm;
}
5. root
和 index
指令
指定请求的文档根目录和默认索引文件:
root /var/www/html;
index index.html index.htm;
6. error_page
指令
定义自定义错误页面:
error_page 404 /404.html;
location = /404.html {
internal;
}
四、其他常用配置
1. 反向代理
Nginx 常用作反向代理服务器,将请求转发到后端服务器:
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend_server;
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;
}
}
2. 负载均衡
Nginx 还支持负载均衡,将流量分配到多个后端服务器:
http {
upstream backend {
server backend1.example.com;
server backend2.example.com;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
}
}
}
3. SSL/TLS 配置
为了安全性,许多站点都需要启用 SSL/TLS:
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
root /var/www/html;
index index.html index.htm;
}
}
4. 重定向
Nginx 可以实现 URL 重定向:
server {
listen 80;
server_name old.example.com;
return 301 http://new.example.com$request_uri;
}
五、优化与安全配置
1. Gzip 压缩
启用 Gzip 压缩以减少传输数据量:
http {
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
}
2. 限制请求速率
防止恶意请求,限制请求速率:
http {
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s;
server {
location / {
limit_req zone=mylimit burst=5;
}
}
}
3. 防止点击劫持
使用 X-Frame-Options
头防止点击劫持:
http {
add_header X-Frame-Options "SAMEORIGIN";
}
4. 防止跨站脚本攻击 (XSS)
使用 Content-Security-Policy
头防止 XSS 攻击:
http {
add_header Content-Security-Policy "default-src 'self'";
}
六、结语
Nginx 的配置文件虽然看似复杂,但掌握其基本结构和常用指令后,你将发现其强大的灵活性和扩展性。无论是作为 Web 服务器、反向代理还是负载均衡器,Nginx 都能胜任其职。希望本文能帮助你更好地理解和使用 Nginx 配置文件,充分发挥 Nginx 的优势。