文章目录
- 1. 什么是 Nginx?
- 2. Nginx 配置文件的基础结构
- 3. 主要配置指令详解
- 3.1. 全局指令
- 3.2. events 块
- 3.3. http 块
- 3.4. server 块
- 3.5. location 块
- 4. 创建一个简单的 Nginx 服务器
- 步骤一:安装 Nginx
- 步骤二:启动并启用 Nginx
- 步骤三:配置站点
- 步骤四:访问网站
- 5. 配置静态资源的服务
- 步骤一:组织静态资源目录
- 步骤二:更新站点配置
- 步骤三:重新测试和重启 Nginx
- 步骤四:验证静态资源
- 6. 设置反向代理
- 步骤一:假设后端应用运行在 `localhost:3000`
- 步骤二:更新站点配置
- 步骤三:重新测试和重启 Nginx
- 步骤四:验证反向代理
- 7. 管理多个站点
- 步骤一:创建多个站点目录
- 步骤二:创建站点配置文件
- 步骤三:启用站点
- 步骤四:测试和重启 Nginx
- 步骤五:DNS 配置
- 8. 常用配置技巧
- 8.1. 使用 `include` 指令
- 8.2. 配置 Gzip 压缩
- 8.3. 配置错误页面
- 9. 测试和重启 Nginx
- 步骤一:测试配置文件
- 步骤二:重启或重新加载 Nginx
- 10. 安全性最佳实践
- 10.1. 使用 HTTPS
- 10.2. 限制访问权限
- 10.3. 防止 DDoS 攻击
- 11. 实战示例
- 项目目录结构:
- 步骤一:创建静态资源和错误页面
- 步骤二:配置站点
- 步骤三:启用站点配置并配置 SSL
- 步骤四:验证配置
1. 什么是 Nginx?
Nginx(发音为 “Engine X”)是一款高性能的开源 HTTP 服务器和反向代理服务器,同时也支持 IMAP/POP3 代理。由于其高并发处理能力、低资源消耗和灵活的配置选项,Nginx 成为了许多大型网站和应用的首选服务器。
主要功能:
- Web 服务器:提供静态和动态内容。
- 反向代理:代理请求到后端应用服务器,实现负载均衡。
- 负载均衡:分配流量到多台服务器,提高可用性和扩展性。
- 缓存:缓存响应内容,提升性能。
- 安全性:支持 SSL/TLS,加固服务器安全。
2. Nginx 配置文件的基础结构
Nginx 的配置文件通常位于 /etc/nginx/nginx.conf
。为了更好地组织和管理站点配置,Nginx 支持将配置文件拆分成多个部分,常见的目录结构如下:
- 主配置文件:
/etc/nginx/nginx.conf
- 站点配置目录:
/etc/nginx/sites-available/
:存放所有站点的配置文件。/etc/nginx/sites-enabled/
:存放已启用站点的符号链接。
- 其他配置:
/etc/nginx/conf.d/
:存放额外的配置文件,如模块配置。/etc/nginx/snippets/
:存放可复用的配置片段,如 SSL 配置。
主配置文件示例:
user www-data;
worker_processes auto;
pid /run/nginx.pid;
events {
worker_connections 768;
}
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/*;
}
配置块层级:
- 全局块:定义全局指令,适用于所有配置。
- events 块:配置与连接相关的指令。
- http 块:包含 HTTP 服务器相关配置,可以嵌套多个
server
块。 - server 块:定义一个虚拟主机,包含多个
location
块。 - location 块:指定如何处理特定的请求 URI。
3. 主要配置指令详解
3.1. 全局指令
这些指令位于配置文件的最外层,对整个 Nginx 服务生效。
user
:指定 Nginx 工作进程运行的用户和用户组。user www-data;
worker_processes
:指定工作进程的数量,通常设置为auto
以自动匹配 CPU 核心数。worker_processes auto;
pid
:指定存储 Nginx 主进程 PID 的文件路径。pid /run/nginx.pid;
3.2. events 块
配置与连接处理相关的指令。
worker_connections
:每个工作进程允许的最大连接数。events { worker_connections 768; }
3.3. http 块
包含 HTTP 服务器相关配置,可以嵌套多个 server
块。
include
:包含其他配置文件。http { include /etc/nginx/mime.types; ... }
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;
sendfile
:启用高效文件传输。sendfile on;
keepalive_timeout
:保持连接的超时时间。keepalive_timeout 65;
3.4. server 块
定义一个虚拟主机,包含多个 location
块。
listen
:指定监听的端口和协议。server { listen 80; ... }
server_name
:定义服务器的域名或 IP 地址。server_name example.com www.example.com;
root
:指定站点根目录。root /var/www/myapp;
index
:指定默认首页文件。index index.html;
3.5. location 块
指定如何处理特定的请求 URI。
- 基本语法:
location [modifier] [URI] { # 指令 }
- 常用修饰符:
=
:精确匹配。~
:区分大小写的正则表达式匹配。~*
:不区分大小写的正则表达式匹配。^~
:前缀匹配,一旦匹配则不进行正则匹配。
示例:
location /images/ {
# 配置静态资源
}
location /api/ {
# 配置反向代理
}
location / {
# 默认配置
}
4. 创建一个简单的 Nginx 服务器
让我们通过一个具体的示例,创建一个简单的 Nginx 服务器,提供静态内容。
步骤一:安装 Nginx
在大多数 Linux 发行版上,可以通过包管理器安装 Nginx。
Ubuntu/Debian:
sudo apt update
sudo apt install nginx
CentOS/RHEL:
sudo yum install epel-release
sudo yum install nginx
步骤二:启动并启用 Nginx
启动 Nginx 服务,并设置为开机自启。
sudo systemctl start nginx
sudo systemctl enable nginx
步骤三:配置站点
- 创建站点目录
假设你的网站文件位于 /var/www/myapp
。
sudo mkdir -p /var/www/myapp
- 设置文件权限
确保 Nginx 用户(通常为 www-data
或 nginx
)有权限访问该目录。
sudo chown -R www-data:www-data /var/www/myapp
sudo chmod -R 755 /var/www/myapp
- 创建示例首页
创建一个简单的 index.html
文件。
sudo nano /var/www/myapp/index.html
内容示例:
<!DOCTYPE html>
<html>
<head>
<title>Welcome to MyApp!</title>
</head>
<body>
<h1>成功部署 Nginx 服务器!</h1>
<p>这是一个示例页面。</p>
</body>
</html>
- 创建站点配置文件
在 /etc/nginx/sites-available/
目录下创建一个新的配置文件。
sudo nano /etc/nginx/sites-available/myapp
示例配置:
server {
listen 80;
server_name yourdomain.com www.yourdomain.com;
root /var/www/myapp;
index index.html;
location / {
try_files $uri $uri/ =404;
}
# 可选:设置日志文件
access_log /var/log/nginx/myapp.access.log;
error_log /var/log/nginx/myapp.error.log;
}
配置说明:
listen 80;
:监听 80 端口(HTTP)。server_name
:指定服务器的域名,多个域名之间用空格分隔。root
:指定站点根目录。index
:指定默认首页文件。location /
:处理所有以/
开头的请求,尝试找到对应的文件或目录,未找到则返回 404 错误。access_log
和error_log
:可选,定义日志文件路径。
- 启用站点配置
创建符号链接,将站点配置启用。
sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/
- 测试配置
确保配置文件语法正确。
sudo nginx -t
输出示例:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
- 重启 Nginx
使配置生效。
sudo systemctl restart nginx
步骤四:访问网站
在浏览器中访问 http://yourdomain.com
,应能看到你创建的示例页面。
5. 配置静态资源的服务
为了高效地提供静态资源(如图片、CSS、JavaScript),可以进一步优化 Nginx 的配置。
步骤一:组织静态资源目录
假设你的项目目录结构如下:
/var/www/myapp/
├── index.html
├── css/
│ └── styles.css
├── js/
│ └── app.js
└── images/
└── logo.png
步骤二:更新站点配置
编辑站点配置文件 /etc/nginx/sites-available/myapp
,添加对静态资源的处理。
示例配置:
server {
listen 80;
server_name yourdomain.com www.yourdomain.com;
root /var/www/myapp;
index index.html;
# 处理静态资源请求
location /css/ {
alias /var/www/myapp/css/;
try_files $uri $uri/ =404;
expires 30d;
add_header Cache-Control "public, no-transform";
}
location /js/ {
alias /var/www/myapp/js/;
try_files $uri $uri/ =404;
expires 30d;
add_header Cache-Control "public, no-transform";
}
location /images/ {
alias /var/www/myapp/images/;
try_files $uri $uri/ =404;
expires 30d;
add_header Cache-Control "public, no-transform";
}
# 处理根目录请求
location / {
try_files $uri $uri/ =404;
}
access_log /var/log/nginx/myapp.access.log;
error_log /var/log/nginx/myapp.error.log;
}
配置说明:
location /css/
、location /js/
、location /images/
:alias
:将 URL 路径映射到文件系统路径。try_files
:尝试找到对应的文件,未找到则返回 404 错误。expires
:设置浏览器缓存过期时间(如 30 天)。add_header
:添加 HTTP 头部,设置缓存控制策略。
注意:
- 使用
alias
时,路径末尾需要带斜杠/
,确保正确映射文件路径。 try_files
指令确保如果文件不存在,服务器会返回 404 错误,而不是默认的目录列表。
步骤三:重新测试和重启 Nginx
sudo nginx -t
sudo systemctl restart nginx
步骤四:验证静态资源
在浏览器中访问 http://yourdomain.com/css/styles.css
、http://yourdomain.com/js/app.js
、http://yourdomain.com/images/logo.png
,应能正确加载相应的资源。
6. 设置反向代理
反向代理允许 Nginx 将客户端请求转发到后端应用服务器(如 Node.js、Django、Ruby on Rails),同时 Nginx 负责处理客户端的连接,提高性能和安全性。
步骤一:假设后端应用运行在 localhost:3000
你的后端应用监听在本地的 3000 端口。
步骤二:更新站点配置
编辑 /etc/nginx/sites-available/myapp
,添加反向代理配置。
示例配置:
server {
listen 80;
server_name yourdomain.com www.yourdomain.com;
root /var/www/myapp;
index index.html;
# 处理静态资源
location /static/ {
alias /var/www/myapp/static/;
try_files $uri $uri/ =404;
expires 30d;
add_header Cache-Control "public, no-transform";
}
# 反向代理 API 请求
location /api/ {
proxy_pass http://localhost:3000/api/;
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;
}
# 处理根目录请求
location / {
try_files $uri $uri/ /index.html;
}
access_log /var/log/nginx/myapp.access.log;
error_log /var/log/nginx/myapp.error.log;
}
配置说明:
-
location /api/
:proxy_pass
:将以/api/
开头的请求转发到http://localhost:3000/api/
。proxy_set_header
:设置 HTTP 头部,传递原始请求的信息给后端应用。Host
:保持原始请求的 Host 头部。X-Real-IP
:传递客户端的真实 IP 地址。X-Forwarded-For
:记录代理链中的客户端 IP 地址。X-Forwarded-Proto
:记录客户端请求的协议(HTTP 或 HTTPS)。
-
location /
:try_files $uri $uri/ /index.html;
:尝试找到对应的文件或目录,未找到则返回index.html
。这对于单页应用(如 React、Vue)非常有用。
步骤三:重新测试和重启 Nginx
sudo nginx -t
sudo systemctl restart nginx
步骤四:验证反向代理
确保你的后端应用正在运行,并通过 Nginx 转发请求。例如,访问 http://yourdomain.com/api/users
,应能通过 Nginx 访问后端应用的 /api/users
接口。
7. 管理多个站点
Nginx 允许在同一服务器上托管多个站点,通过虚拟主机(server blocks)实现。
步骤一:创建多个站点目录
假设你有两个站点:example1.com
和 example2.com
。
sudo mkdir -p /var/www/example1.com/html
sudo mkdir -p /var/www/example2.com/html
sudo chown -R www-data:www-data /var/www/example1.com
sudo chown -R www-data:www-data /var/www/example2.com
sudo chmod -R 755 /var/www/example1.com
sudo chmod -R 755 /var/www/example2.com
步骤二:创建站点配置文件
- 站点 1:example1.com
sudo nano /etc/nginx/sites-available/example1.com
内容示例:
server {
listen 80;
server_name example1.com www.example1.com;
root /var/www/example1.com/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
access_log /var/log/nginx/example1.com.access.log;
error_log /var/log/nginx/example1.com.error.log;
}
- 站点 2:example2.com
sudo nano /etc/nginx/sites-available/example2.com
内容示例:
server {
listen 80;
server_name example2.com www.example2.com;
root /var/www/example2.com/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
access_log /var/log/nginx/example2.com.access.log;
error_log /var/log/nginx/example2.com.error.log;
}
步骤三:启用站点
创建符号链接,将站点配置启用。
sudo ln -s /etc/nginx/sites-available/example1.com /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/example2.com /etc/nginx/sites-enabled/
步骤四:测试和重启 Nginx
sudo nginx -t
sudo systemctl restart nginx
步骤五:DNS 配置
确保 example1.com
和 example2.com
的 DNS 记录指向你的服务器 IP 地址。可以通过修改域名注册商的 DNS 设置实现。
8. 常用配置技巧
8.1. 使用 include
指令
为了保持配置文件的整洁,可以将常用配置片段存放在 snippets
目录中,并在需要的地方引用。
创建一个通用的 SSL 配置片段:
sudo nano /etc/nginx/snippets/ssl-params.conf
内容示例:
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers "ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384";
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
在站点配置中引用:
server {
listen 443 ssl;
server_name yourdomain.com www.yourdomain.com;
include snippets/ssl-params.conf;
...
}
8.2. 配置 Gzip 压缩
启用 Gzip 压缩可以减少传输的数据量,提高页面加载速度。
在 http
块中添加:
http {
...
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_min_length 256;
gzip_proxied any;
gzip_vary on;
...
}
说明:
gzip on;
:启用 Gzip 压缩。gzip_types
:指定需要压缩的 MIME 类型。gzip_min_length
:设置压缩的最小文件大小(字节)。gzip_proxied
:启用代理请求的压缩。gzip_vary
:添加Vary: Accept-Encoding
头部,支持缓存。
8.3. 配置错误页面
自定义错误页面可以提升用户体验。
示例配置:
server {
...
error_page 404 /custom_404.html;
location = /custom_404.html {
root /var/www/myapp/errors;
internal;
}
error_page 500 502 503 504 /custom_50x.html;
location = /custom_50x.html {
root /var/www/myapp/errors;
internal;
}
...
}
说明:
error_page
:定义错误页面的路径。location = /custom_404.html
:指定错误页面的位置,并设置为内部请求,不允许直接访问。
9. 测试和重启 Nginx
每次修改配置文件后,务必测试配置文件的语法是否正确,并重启或重新加载 Nginx 服务以应用更改。
步骤一:测试配置文件
sudo nginx -t
输出示例:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
步骤二:重启或重新加载 Nginx
- 重新加载配置(不间断服务):
sudo systemctl reload nginx
- 重启 Nginx:
sudo systemctl restart nginx
推荐使用重新加载配置,以避免中断服务。
10. 安全性最佳实践
确保 Nginx 服务器的安全性,是保护网站和用户数据的重要环节。
10.1. 使用 HTTPS
加密数据传输,保护用户隐私。推荐使用 Let’s Encrypt 获取免费的 SSL 证书。
步骤:
-
安装 Certbot
Ubuntu/Debian:
sudo apt install certbot python3-certbot-nginx
CentOS/RHEL:
sudo yum install certbot python3-certbot-nginx
-
获取并安装证书
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com
跟随提示完成配置,Certbot 会自动修改 Nginx 配置文件以启用 HTTPS。
-
自动续期
Certbot 会自动配置定时任务(cron)进行证书续期,无需手动干预。
10.2. 限制访问权限
防止未经授权的访问和潜在的攻击。
示例配置:
server {
...
# 禁止访问 .ht 文件
location ~ /\.ht {
deny all;
}
# 禁止访问敏感文件
location ~* \.(env|config|ini)$ {
deny all;
}
...
}
10.3. 防止 DDoS 攻击
通过限制请求速率,防止恶意攻击。
示例配置:
http {
...
# 定义限制
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;
server {
...
# 应用限制
location /api/ {
limit_req zone=mylimit burst=20 nodelay;
proxy_pass http://localhost:3000/api/;
...
}
...
}
}
说明:
limit_req_zone
:定义限制区域,基于客户端 IP 地址,限制速率为每秒 10 次请求。limit_req
:在特定location
块中应用限制,burst
允许的突发请求数,nodelay
表示不延迟处理突发请求,超过限制的请求将被拒绝。
11. 实战示例
让我们通过一个完整的实战示例,整合上述内容,配置一个既能提供静态资源,又能作为反向代理的 Nginx 服务器,并启用 HTTPS。
项目目录结构:
/var/www/myapp/
├── static/
│ ├── index.html
│ ├── css/
│ │ └── styles.css
│ ├── js/
│ │ └── app.js
│ └── images/
│ └── logo.png
├── errors/
│ ├── custom_404.html
│ └── custom_50x.html
步骤一:创建静态资源和错误页面
- 创建静态资源
sudo mkdir -p /var/www/myapp/static/css
sudo mkdir -p /var/www/myapp/static/js
sudo mkdir -p /var/www/myapp/static/images
- 创建错误页面
sudo mkdir -p /var/www/myapp/errors
sudo nano /var/www/myapp/errors/custom_404.html
内容示例:
<!DOCTYPE html>
<html>
<head>
<title>404 Not Found</title>
</head>
<body>
<h1>页面未找到</h1>
<p>抱歉,你访问的页面不存在。</p>
</body>
</html>
- 创建默认首页
sudo nano /var/www/myapp/static/index.html
内容示例:
<!DOCTYPE html>
<html>
<head>
<title>MyApp Home</title>
<link rel="stylesheet" href="/css/styles.css">
</head>
<body>
<h1>欢迎来到 MyApp!</h1>
<img src="/images/logo.png" alt="Logo">
<script src="/js/app.js"></script>
</body>
</html>
步骤二:配置站点
编辑 /etc/nginx/sites-available/myapp
,整合静态资源服务、反向代理和错误页面配置。
示例配置:
server {
listen 80;
server_name yourdomain.com www.yourdomain.com;
# 重定向所有 HTTP 请求到 HTTPS
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name yourdomain.com www.yourdomain.com;
# SSL 配置
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
include snippets/ssl-params.conf;
root /var/www/myapp/static;
index index.html;
# Gzip 压缩
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_min_length 256;
gzip_proxied any;
gzip_vary on;
# 处理静态资源
location /css/ {
alias /var/www/myapp/static/css/;
try_files $uri $uri/ =404;
expires 30d;
add_header Cache-Control "public, no-transform";
}
location /js/ {
alias /var/www/myapp/static/js/;
try_files $uri $uri/ =404;
expires 30d;
add_header Cache-Control "public, no-transform";
}
location /images/ {
alias /var/www/myapp/static/images/;
try_files $uri $uri/ =404;
expires 30d;
add_header Cache-Control "public, no-transform";
}
# 反向代理 API 请求
location /api/ {
proxy_pass http://localhost:3000/api/;
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;
# 限制请求速率
limit_req zone=mylimit burst=20 nodelay;
}
# 处理根目录请求
location / {
try_files $uri $uri/ /index.html;
}
# 自定义错误页面
error_page 404 /custom_404.html;
location = /custom_404.html {
root /var/www/myapp/errors;
internal;
}
access_log /var/log/nginx/myapp.access.log;
error_log /var/log/nginx/myapp.error.log;
}
配置说明:
- HTTP 到 HTTPS 重定向:所有 HTTP 请求重定向到 HTTPS,确保数据传输加密。
- SSL 配置:引用已获取的 SSL 证书,并包含通用的 SSL 参数。
- Gzip 压缩:启用 Gzip,优化资源传输。
- 静态资源处理:分别处理 CSS、JS 和图片资源,设置缓存策略。
- 反向代理:将
/api/
请求转发到后端应用服务器,并限制请求速率,防止 DDoS 攻击。 - 错误页面:自定义 404 错误页面。
步骤三:启用站点配置并配置 SSL
- 启用站点
sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/
- 获取 SSL 证书
确保你已经安装了 Certbot,并获取了 SSL 证书。
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com
- 重启 Nginx
sudo nginx -t
sudo systemctl reload nginx
步骤四:验证配置
- 访问网站:访问
https://yourdomain.com
,应能看到首页并通过 HTTPS 加密连接。 - 访问 API:访问
https://yourdomain.com/api/
,应通过反向代理访问后端应用。 - 测试静态资源:访问
https://yourdomain.com/css/styles.css
、https://yourdomain.com/js/app.js
等,应能正确加载资源。 - 测试错误页面:访问不存在的页面,如
https://yourdomain.com/nonexistent
,应显示自定义的 404 页面。