Nginx配置 备忘录

361 阅读2分钟

Nginx安装

安装与验证

# 安装依赖
sudo apt install -y curl gnupg2 ca-certificates lsb-release

# 安装Nginx
sudo apt install -y nginx  # -y: 自动确认安装

# 验证安装
nginx -v                  # 查看版本
sudo systemctl status nginx  # 检查运行状态

服务管理

sudo systemctl start nginx    # 启动
sudo systemctl stop nginx     # 停止
sudo systemctl restart nginx  # 重启
sudo systemctl enable nginx   # 开机自启

配置文件结构

cd /etc/nginx
mv nginx.conf nginx.conf.bak  # 备份配置
touch nginx.conf              # 创建新配置
nginx -t                      # 检查配置语法
vi nginx.conf                 # 编辑配置
基础配置模板
events {}  # 事件模块必填

http {
  include /etc/nginx/mime.types;  # 引入MIME类型
  include /etc/nginx/conf.d/*.conf; # 加载子配置
}

虚拟服务器配置 (conf.d/default.conf)

server {
  listen 80;                # 监听端口
  server_name localhost;    # 域名/IP
  root /var/www/localhost;  # 网站根目录
  index app.html;           # 默认文件(可省略默认index.html)
}

核心指令

1. 直接返回响应
server {
  listen 80;
  return 200 "Hello World";  # 返回状态码+文本
}
2. 静态文件服务
server {
  listen 80;
  root /var/www/localhost;
  index app.html;  # 指定默认文件
}
3. Location 路径匹配
location /images/ {  # 匹配/images/路径
  root /var/www/media;  # 实际路径: /var/www/media/images/
}

location = /exact {   # 精确匹配(优先级最高)
  root /var/www/exact;
}

location ~* \.(jpg|png)$ {  # 不区分大小写的正则匹配
  root /var/www/images;
}

匹配优先级= > ^~ > ~/~* > 普通路径


高级控制

1. 重定向与重写
# 临时重定向(浏览器URL变化)
location /old {
  return 307 /new/index.html; 
  # 访问http://localhost/old  >>> http://localhost/new/index.html
}

# 内部重写(URL不变)
rewrite ^/temp /app/index.html;
2. 错误处理与备用路径
server {
  error_page 404 /404.html;  # 自定义404页面
  
  location / {
    try_files $uri $uri/ /index.html =404;
    # 尝试顺序: 文件→目录→备用文件→返回404
  }
}
3. 调试响应头
location /debug {
  add_header X-Request-Uri "$uri";  # 添加调试头
}

关键技巧

  1. 配置检查流程
    sudo nginx -t  # 验证配置 → sudo systemctl restart nginx  # 重启生效
    
  2. 路径匹配陷阱
    • location /app 可能匹配 /apple(避免:用/app/=精确匹配)
    • 正则匹配需文件实际存在
  3. 安全建议
    • 避免暴露目录结构:关闭自动索引 autoindex off
    • 敏感路径限制访问:location /admin { deny all; }

反向代理配置

server {
  listen 80;
  server_name localhost;
  
  root /var/www/localhost;
  index index.html;
  
  # 代理到3001端口的服务
  location /app_1 {
    proxy_pass http://localhost:3001;  # 关键指令
    proxy_set_header Host $host;       # 传递原始域名
    proxy_set_header X-Real-IP $remote_addr;  # 传递客户端真实IP
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }
  
  # 代理到3002端口的服务
  location /app_2 {
    proxy_pass http://localhost:3002;
    # 可添加缓存配置(示例):
    # proxy_cache my_cache;
    # proxy_cache_valid 200 1h;
  }
}

关键参数说明

  • proxy_pass:核心代理指令,结尾加/会修改URI路径(如http://backend/会移除/app_1前缀)
  • proxy_set_header:传递原始请求信息,避免后端服务丢失客户端数据
  • proxy_cache:启用响应缓存(需提前定义缓存区)

负载均衡配置

# 定义上游服务器组(负载均衡池)
upstream backend-servers {
  server localhost:3001 weight=6;  # 权重60%
  server localhost:3002 weight=4;  # 权重40%
  server localhost:3003 backup;    # 备用节点(仅当主节点全宕机时启用)
  
  # 可选负载策略(默认轮询):
  # least_conn;   # 最少连接数
  # ip_hash;      # IP哈希会话保持
}

server {
  listen 80;
  server_name localhost;
  
  location / {
    proxy_pass http://backend-servers;  # 指向upstream名称
    
    # 健康检查配置
    proxy_next_upstream error timeout http_500;  # 故障时切换节点
    proxy_connect_timeout 2s;  # 后端连接超时
  }
}
负载均衡策略对比
策略配置指令适用场景
加权轮询weight默认策略,按权重分配流量
最少连接least_conn长连接服务(如数据库代理)
IP哈希ip_hash会话保持需求(无状态慎用)
备份节点backup高可用灾备

高级配置技巧

1. 动静分离
location /static {
  root /var/www/assets;  # 直接提供静态文件
}

location /api {
  proxy_pass http://backend-servers;  # 动态请求转后端
}
2. 故障转移配置
upstream backend {
  server 192.168.1.10:80 max_fails=3 fail_timeout=30s;
  server 192.168.1.11:80;
}

# 参数说明:
# max_fails=3    → 允许的最大失败次数
# fail_timeout=30s → 节点被标记为不可用的时间
3. 长连接优化
upstream backend {
  server 10.0.0.1;
  keepalive 32;  # 保持的长连接数量
}

location / {
  proxy_pass http://backend;
  proxy_http_version 1.1;
  proxy_set_header Connection "";
}

调试与监控

# 实时查看负载状态
tail -f /var/log/nginx/access.log

# 监控上游节点状态
nginx -T | grep -A 10 upstream  # 查看配置
curl http://localhost/nginx_status  # 需启用stub_status模块

最佳实践

  1. 始终配置proxy_set_header保证后端获取真实客户端信息
  2. 生产环境启用健康检查(max_fails + fail_timeout
  3. 高并发场景开启keepalive减少TCP握手开销
  4. 静态资源分离处理,减轻后端压力

配置ssl证书

server {
  listen 443 ssl default_server;
  listen [::]:443 ssl default_server;
  
  ssl_certificate "etc/nginx/cert/server.pem";
  ssl_certificate_key "etc/nginx/cert/server.key";
  
  server_name example.com;
}


server { 
  listen 80; 
  listen [::]:80; 
  
  server_name example.com www.example.com; 
  
  # 301 永久重定向 
  return 301 https://$host$request_uri;
}

实验一 访问控制与传输优化

拒绝内网用户访问,只允许域名访问。 并且优化文件传输

events{}

http{
  include /etc/nginx/mime.types;
  server_tokens off;                       # 隐藏nginx版本号

  server {
     listen 3000 ssl;
     
     ssl_protocols TLSv1.2 TLSv1.3;
     ssl_certificate "/etc/nginx/cert/share.euyan.cloud/server.pem";
     ssl_certificate_key "/etc/nginx/cert/share.euyan.cloud/server.key";
     server_name xxx.euyan.cloud;
     location / {
        deny 192.168.0.0/24;                # 拒绝内网网段
        deny 172.16.0.0/16;
        allow all;
        proxy_pass http://localhost:3010;
        proxy_cache off;                    # 关闭缓存
        proxy_buffering off;                # 关闭代理缓冲
        chunked_transfer_encoding on;       # 开启分块传输
        sendfile on;
        tcp_nopush on;                      # 开启TCP NOPUSH选项,禁止Nagle算法
        tcp_nodelay on;                     # 开启TCP NODELAY选项,禁止延迟ACK算法
        keepalive_timeout 300;              # 设定keep-alive超时时间为300秒 长连接情况
        client_max_body_size  64m;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;  # 设置真实客户端IP
        proxy_cache_bypass $http_upgrade;
        proxy_set_header Accept-Encoding gzip;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
     }
  }

  server {
    listen 3000 default_server;
    ssl_certificate "/etc/nginx/cert/server.pem";
    ssl_certificate_key "/etc/nginx/cert/server.key";
    server_name _;                          # 匹配IP地址访问 返回444

    return 444;
  }
}

实验二 常规网站部署

events{}

http{
  include /etc/nginx/mime.types;
  server_tokens off;                       # 隐藏nginx版本号
  
  server {
    listen 80;
    server_name xxx.euyan.cloud;
    # http重定向
    return 301 https://$server_name$request_uri;
  }

  server {
     listen 443 ssl;
     
     ssl_protocols TLSv1.2 TLSv1.3;
     ssl_certificate "/etc/nginx/cert/xxx.euyan.cloud.crt";
     ssl_certificate_key "/etc/nginx/cert/xxx.euyan.cloud.key";
     
     server_name xxx.euyan.cloud;
     
     location / {
        root /var/www/localhost;
        
        # 图片资源缓存
        location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf|eot)$ {
            expires 1y;
            add_header Cache-Control "public, immutable";
            add_header Vary Accept-Encoding;

            # 开启 gzip 压缩
            gzip_static on;
            gzip_vary on;
        }
     }
     
     # 反向代理
     location =  /submit {
        proxy_pass http://127.0.0.1:5000;
        proxy_set_header X-Real-IP $remote_addr;
     }

     location = /visit {
        proxy_pass http://127.0.0.1:5000;
        proxy_set_header X-Real-IP $remote_addr;
     }
     
     # json文件访问控制
     location = /rsvp_data.json {
        allow 111.33.37.xxx/32;
        deny all;
     }
  }

}