Nginx 实战教程
什么是Nginx?
Nginx(发音为 "engine-x")是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。它以高稳定性、丰富的功能、低系统资源消耗而闻名,是现代Web架构中不可或缺的组件。
Nginx的主要特点:
- 高性能:使用异步事件驱动架构,能够高效处理大量并发连接
- 低内存消耗:相比传统Apache服务器,内存占用大幅降低
- 高稳定性:运行稳定,极少出现故障
- 热部署:支持在不停机的情况下升级配置
- 模块化设计:拥有丰富的第三方模块生态
- 反向代理:提供强大的负载均衡和代理功能
1. Nginx安装与配置
1.1 Ubuntu/Debian系统安装
# 更新包列表
sudo apt update
# 安装Nginx
sudo apt install nginx
# 检查Nginx状态
sudo systemctl status nginx
# 启动Nginx
sudo systemctl start nginx
# 设置开机自启
sudo systemctl enable nginx
1.2 Docker方式安装
使用Docker安装Nginx是快速开始的好方法,特别是在开发环境中:
# 拉取Nginx镜像
docker pull nginx:latest
# 运行Nginx容器
docker run -d \
--name my-nginx \
-p 80:80 \
-v $(pwd)/nginx.conf:/etc/nginx/nginx.conf \
-v $(pwd)/html:/usr/share/nginx/html \
nginx:latest
2. Nginx基础配置
2.1 主配置文件结构
Nginx的主要配置文件位于/etc/nginx/nginx.conf,它控制着Nginx的全局行为:
# /etc/nginx/nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
events {
worker_connections 1024;
}
http {
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/mime.types;
default_type application/octet-stream;
# 包含其他配置文件
include /etc/nginx/conf.d/*.conf;
}
2.2 服务器块配置
服务器块(Server Blocks)是Nginx中配置虚拟主机的方式,允许在一台服务器上托管多个网站:
# /etc/nginx/conf.d/default.conf
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
root /usr/share/nginx/html;
index index.html index.htm;
# 字符编码
charset utf-8;
# 主要位置配置
location / {
try_files $uri $uri/ =404;
}
# 静态资源缓存
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
}
3. 反向代理配置
3.1 基本反向代理
反向代理是Nginx最常用的功能之一,它可以将请求转发到后端应用服务器:
# 反向代理到后端应用服务器
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://localhost:3000; # 转发到本地运行的应用
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 30s;
proxy_read_timeout 30s;
}
}
3.2 负载均衡配置
当你有多个后端服务器时,Nginx可以作为负载均衡器分发请求:
# 定义上游服务器组
upstream backend_app {
# 轮询(默认),可以添加权重
server 192.168.1.10:3000 weight=3;
server 192.168.1.11:3000 weight=2;
server 192.168.1.12:3000 weight=1;
# 也可以使用其他策略
# least_conn; # 最少连接
# ip_hash; # IP哈希,确保同一用户总是访问同一服务器
}
server {
listen 80;
server_name app.example.com;
location / {
proxy_pass http://backend_app;
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;
}
}
4. SSL/TLS配置
4.1 Let's Encrypt SSL证书配置
为网站启用HTTPS是现代Web应用的基本要求,Let's Encrypt提供免费的SSL证书:
# 安装Certbot
sudo apt install certbot python3-certbot-nginx
# 获取SSL证书
sudo certbot --nginx -d example.com -d www.example.com
# 自动续期
sudo crontab -e
# 添加以下行
0 12 * * * /usr/bin/certbot renew --quiet
4.2 SSL配置示例
获取证书后,Certbot通常会自动配置Nginx,但以下是一个手动配置的示例:
server {
listen 80;
server_name example.com www.example.com;
# 重定向HTTP到HTTPS
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name example.com www.example.com;
# SSL证书配置
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# SSL安全配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# HSTS安全头部
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
root /usr/share/nginx/html;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
}
5. 缓存配置
5.1 静态资源缓存
合理配置缓存可以显著提升网站性能,减少服务器负载:
# 静态资源缓存配置
server {
listen 80;
server_name static.example.com;
root /var/www/static;
# 图片、视频、音频文件
location ~* \.(jpg|jpeg|png|gif|ico|webp|svg|mp4|webm|ogg|mp3|wav)$ {
expires 1M;
add_header Cache-Control "public, immutable";
access_log off;
}
# CSS、JS文件
location ~* \.(css|js)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
# 压缩
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types
text/plain
text/css
text/xml
text/javascript
application/javascript
application/json;
}
6. 安全配置
6.1 基本安全配置
保障Nginx安全是运维工作的重要部分,以下是一些基本的安全配置:
# 安全相关的头部设置
server {
listen 80;
server_name secure.example.com;
# 防止点击劫持
add_header X-Frame-Options "SAMEORIGIN" always;
# 防止MIME类型嗅探
add_header X-Content-Type-Options "nosniff" always;
# XSS防护
add_header X-XSS-Protection "1; mode=block" always;
# 隐藏Nginx版本
server_tokens off;
location / {
root /usr/share/nginx/html;
try_files $uri $uri/ =404;
}
# 限制请求方法
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 405;
}
}
7. 最佳实践
7.1 性能优化配置
以下是一些Nginx性能优化的关键配置:
# 性能优化配置
worker_processes auto; # 自动设置为CPU核心数
worker_rlimit_nofile 65535; # 增加文件描述符限制
events {
worker_connections 4096; # 增加每个worker的连接数
use epoll; # 使用高效的事件模型
multi_accept on;
}
http {
# 基本性能设置
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 30;
# 压缩
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_comp_level 6;
gzip_types
text/plain
text/css
text/javascript
application/javascript
application/json;
}
7.2 部署最佳实践
在生产环境中部署Nginx时,应遵循以下最佳实践:
- 配置备份:修改配置前先备份
- 配置测试:使用
nginx -t测试配置是否正确
- 平滑重启:使用
nginx -s reload平滑重启,避免服务中断
- 监控日志:定期检查访问日志和错误日志
- 更新维护:保持Nginx版本更新,修复安全漏洞
一个简单的部署脚本示例:
#!/bin/bash
# nginx_deployment.sh - Nginx部署脚本
# 配置备份
BACKUP_DIR="/etc/nginx/backups"
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p $BACKUP_DIR
echo "Backing up current configuration..."
cp -r /etc/nginx/nginx.conf $BACKUP_DIR/nginx.conf_$DATE
cp -r /etc/nginx/conf.d $BACKUP_DIR/conf.d_$DATE
# 验证配置
echo "Testing configuration..."
if nginx -t; then
echo "Configuration test passed"
# 平滑重启
echo "Reloading Nginx..."
nginx -s reload
echo "Deployment completed successfully"
else
echo "Configuration test failed"
exit 1
fi
总结
Nginx是一个功能强大、高性能的Web服务器和反向代理服务器,在现代Web架构中扮演着重要角色。通过本文介绍的安装、配置、反向代理、负载均衡、SSL配置等内容,你应该能够快速上手Nginx,并将其应用到实际项目中。
在实际使用中,记得根据你的具体需求调整配置,并遵循最佳实践确保系统的安全性和性能。随着经验的积累,你可以进一步探索Nginx的高级功能,如更复杂的缓存策略、高级安全配置等,以构建更强大的Web应用架构。