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时,应遵循以下最佳实践:

  1. 配置备份:修改配置前先备份
  2. 配置测试:使用nginx -t测试配置是否正确
  3. 平滑重启:使用nginx -s reload平滑重启,避免服务中断
  4. 监控日志:定期检查访问日志和错误日志
  5. 更新维护:保持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应用架构。