← 返回首页
🔧

Nginx 入门基础

📂 devops ⏱ 3 min 492 words

Nginx 入门基础

什么是 Nginx

Nginx 是一个高性能的 HTTP 和反向代理服务器,也是一款 IMAP/POP3/Proxy 服务器。它以高并发、低内存消耗和模块化架构著称,广泛用于 Web 服务、负载均衡、缓存和 SSL 终端。

安装 Nginx

Ubuntu/Debian

sudo apt update
sudo apt install nginx

# 启动并设置开机自启
sudo systemctl start nginx
sudo systemctl enable nginx

CentOS/RHEL

sudo yum install epel-release
sudo yum install nginx

sudo systemctl start nginx
sudo systemctl enable nginx

验证安装

# 检查版本
nginx -v

# 检查状态
sudo systemctl status nginx

# 测试访问
curl http://localhost

目录结构

/etc/nginx/
├── nginx.conf           # 主配置文件
├── conf.d/              # 额外配置文件
├── sites-available/     # 可用站点配置
├── sites-enabled/       # 启用的站点配置
├── mime.types           # MIME 类型映射
└── fastcgi_params       # FastCGI 参数

配置文件结构

# 全局配置
user www-data;
worker_processes auto;
pid /run/nginx.pid;

events {
    worker_connections 1024;
}

http {
    # 基本设置
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    
    # MIME 类型
    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;
    error_log /var/log/nginx/error.log;
    
    # Gzip 压缩
    gzip on;
    gzip_types text/plain text/css application/json application/javascript;
    
    # 虚拟主机配置
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

虚拟主机配置

基本站点配置

# /etc/nginx/sites-available/mysite
server {
    listen 80;
    listen [::]:80;
    
    server_name mysite.example.com;
    root /var/www/mysite;
    index index.html index.htm;
    
    location / {
        try_files $uri $uri/ =404;
    }
    
    # 静态文件缓存
    location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
        expires 30d;
        add_header Cache-Control "public, no-transform";
    }
}

启用站点

# 创建符号链接
sudo ln -s /etc/nginx/sites-available/mysite /etc/nginx/sites-enabled/

# 测试配置
sudo nginx -t

# 重新加载
sudo systemctl reload nginx

常用命令

# 测试配置文件
nginx -t

# 重新加载配置(不中断连接)
nginx -s reload

# 停止 Nginx
nginx -s stop

# 优雅停止(处理完当前请求)
nginx -s quit

# 重新打开日志文件
nginx -s reopen

反向代理

基本反向代理

server {
    listen 80;
    server_name api.example.com;
    
    location / {
        proxy_pass http://127.0.0.1:8080;
        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;
    }
}

WebSocket 代理

location /ws {
    proxy_pass http://127.0.0.1:8080;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
}

静态文件服务

server {
    listen 80;
    server_name static.example.com;
    
    # 静态文件根目录
    root /var/www/static;
    
    # 目录列表(可选)
    autoindex on;
    autoindex_exact_size off;
    autoindex_localtime on;
    
    # 图片缓存
    location ~* \.(jpg|jpeg|png|gif|ico)$ {
        expires 30d;
        add_header Cache-Control "public, no-transform";
    }
    
    # CSS/JS 缓存
    location ~* \.(css|js)$ {
        expires 7d;
        add_header Cache-Control "public, no-transform";
    }
}

实践案例

部署静态网站

# 创建网站目录
sudo mkdir -p /var/www/mysite

# 设置权限
sudo chown -R www-data:www-data /var/www/mysite
sudo chmod -R 755 /var/www/mysite

# 部署文件
sudo cp -r * /var/www/mysite/
# /etc/nginx/sites-available/mysite
server {
    listen 80;
    server_name mysite.example.com;
    root /var/www/mysite;
    index index.html;
    
    location / {
        try_files $uri $uri/ /index.html;
    }
    
    # SPA 路由支持
    location /api/ {
        proxy_pass http://127.0.0.1:3000;
    }
}

配置 PHP-FPM

server {
    listen 80;
    server_name php.example.com;
    root /var/www/php;
    index index.php index.html;
    
    location / {
        try_files $uri $uri/ =404;
    }
    
    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

性能优化

http {
    # 连接超时
    keepalive_timeout 65;
    
    # 客户端请求缓冲
    client_body_buffer_size 16k;
    client_header_buffer_size 1k;
    client_max_body_size 8m;
    
    # 缓冲区
    large_client_header_buffers 4 8k;
    
    # Gzip 压缩
    gzip on;
    gzip_min_length 1000;
    gzip_types text/plain text/css application/json;
}

常见问题

502 Bad Gateway

# 检查后端服务
sudo systemctl status php7.4-fpm

# 检查 FastCGI 配置
sudo nginx -t

# 查看错误日志
sudo tail -f /var/log/nginx/error.log

403 Forbidden

# 检查目录权限
ls -la /var/www/mysite

# 检查 nginx.conf 中的 user 配置
grep "^user" /etc/nginx/nginx.conf

最佳实践

总结

Nginx 是一个功能强大的 Web 服务器和反向代理。掌握基本配置可以帮助你搭建高性能、高可用的 Web 服务架构。