Nginx必备操作

789 阅读7分钟

一、 nginx常用命令

    cd usr/local/nginx/sbin  启动  或者./nginx
    nginx -s quit         优雅停止nginx,有连接时会等连接请求完成再杀死worker进程  
    nginx -s reload     优雅重启,并重新载入配置文件nginx.conf
    nginx -s reopen     重新打开日志文件,一般用于切割日志
    nginx -v            查看版本  
    nginx -t            检查nginx的配置文件
    nginx -h            查看帮助信息
   nginx -V       详细版本信息,包括编译参数 
    nginx  -c filename  指定配置文件
    ps -ef|grep nginx  查看进程
    nginx -t -c /etc/nginx/nginx.conf 或者 nginx -t  检查对nginx.conf文件的修改是否正确

二、 nginx defalut.conf跨域配置

worker_processes  1;
 client_max_body_size  600m;
events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
   server {
           listen       9292;  
           server_name   localhost;
     add_header Access-Control-Allow-Credentials true;
     add_header Access-Control-Allow-Origin  http://101.200.198.179:8106;
     add_header Access-Control-Allow-Methods 'POST,GET,OPTIONS,PUT,DELETE';
     add_header Access-Control-Max-Age 3600;
     
     #获取客户端ip
    proxy_set_header X-Real-IP      $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        
     #允许脚本访问的返回头
     add_header Access-Control-Allow-Headers 'x-requested-with,content-type,Cache-Control,Pragma,Date,x-timestamp'; 
     #允许自定义的头部,以逗号隔开,大小写不敏感
     add_header Access-Control-Expose-Headers 'WWW-Authenticate,Server-Authorization';
        location / {
               root   html; # 本地文件的路径
               index  index.html index.htm; # 访问index首页的文件
               try_files $uri $uri/ /index.html #防止页面刷新404
               #limit_rate 1280k; #限制速度
              }
      location web1/apis { 
        rewrite  ^.+apis/?(.*)$ /$1 break;     
        proxy_pass http://101.200.198.179:8106;   
           }
       location web2/apis { 
        rewrite  ^.+apis/?(.*)$ /$1 break;     
        proxy_pass http://101.200.198.179:8106;   
           }
           error_page   500 502 503 504  /50x.html;
           location = /50x.html {
               root   html;
           }
       }
}

ps:
配置文件:
装的nginx配置文件在/etc/nginx/conf.d/dafalut.conf
可在 location / {
               root   /root/zg; # 本地文件的路径
               index  index.html index.htm; # 访问index首页的文件
              }
              中自定义首页面路劲

www.zhihu.com/tardis/sogo…

三、 常见问题

1. 端口被占用解决:

2.解决413 Request Entity Too Large(文件传输限制):

修改nginx.conf

在http中加入 upload_max_filesize = 50M
nginx -s reload 重新加载即可解决

3.解决静态资源加载失败问题

浏览器报错:
net::ERR_CONTENT_LENGTH_MISMATCH 200 (OK)

解决:

1.  先切换到指定目录,在终端输入以下命令
    cd /usr/local/var/run/nginx
2.  更改下权限,输入以下命令
    sudo chmod -R 777 proxy_temp
3.  重启nginx,输入
    sudo nginx -s relaod

四、 配置访问本地目录文件

 location / {
            charset utf-8;
            root   E:\l\vu3\dist\production; # 根目录地址
            autoindex on; # 自动索引
            index  index.html index.htm; # 访问文件名称
        }

五、解决刷新网页404问题

location 中配置

try_files $uri $uri/ /index.html #防止页面刷新404

六、配置解析压缩文件

     # 开启gzip
     gzip on;
     # 开启gzip_static
     # gzip_static 开启后可能会报错,需要安装相应的模块, 具体安装方式可以自行查询
     # 只有这个开启,vue文件打包的.gz文件才会有效果,否则不需要开启gzip进行打包
     gzip_static on;
     gzip_proxied any;
     gzip_min_length 1k;
     gzip_buffers 4 16k;
     #如果nginx中使用了多层代理 必须设置这个才可以开启gzip。
     gzip_http_version 1.0;
     gzip_comp_level 2;
     gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
     gzip_vary off;
     gzip_disable "MSIE [1-6]\.";
     # 开启 brotli压缩
     # 需要安装对应的nginx模块,具体安装方式可以自行查询
     # 可以与gzip共存不会冲突
     brotli on;
     brotli_comp_level 6;
     brotli_buffers 16 8k;
     brotli_min_length 20;
     brotli_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript image/svg+xml;

七、配置流式数据吞吐(sse、视频流、实时监控、socket等)

如果本地和线上的数据流不一致,线上的慢或中断,那大概率是没配置proxy_buffering(禁用缓冲)和proxy_cache(禁用缓存)

proxy_buffering 指令用于控制 Nginx 是否将从后端服务器接收到的响应缓冲到内存或磁盘中。当 proxy_buffering 设置为 off 时,Nginx 不会缓冲后端服务器的响应,而是直接将响应传递给客户端。这对于需要实时传输数据的场景非常有用,例如视频流、实时日志等。

详细配置如下:

  • 关闭缓存:为了确保SSE正常工作,需要禁用Nginx的缓存功能。通过 proxy_buffering off; 和 proxy_cache off;设置来关闭缓存。
  • 设置连接升级:SSE需要使用持续连接,因此需要设置UpgradeConnection请求头。确保配置中包含 Upgrade $http_upgrade; 和 Connection 'upgrade';
  • 调整超时设置:确保设置适当的超时时长,以避免SSE连接时间过短导致异常。您可以根据需要调整 proxy_connect_timeout 和 proxy_read_timeout 等设置。
location / {  
proxy_pass <http://127.0.0.1:8100>;  
proxy_set_header Host $http_host;  
proxy_set_header X-Real-IP $remote_addr;  
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  
proxy_set_header Connection '';  
proxy_http_version 1.1; # 重要:确保使用HTTP/1.1协议  
proxy_set_header Upgrade $http_upgrade;  
proxy_set_header Connection 'upgrade';  
# 添加以下配置以处理SSE  
proxy_buffering off;  
proxy_cache off;  
}

如果你只需为单独数据流接口配置,如下:

    # sse配置
      location /代理的接口标识(proxy)/aiAssistant/chat {
        proxy_buffering off;
        proxy_cache off;
        proxy_pass 你的接口地址/aiAssistant/chat;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Cache-Control 'no-cache';
        proxy_set_header Connection 'keep-alive';
        proxy_read_timeout 86400s;
        proxy_send_timeout 86400s;
       }

Nginx 的安全配置是确保网站和应用程序安全的重要步骤。以下是一些常见的 Nginx 安全配置项及其详细解释,帮助你提升 Nginx 服务器的安全性。

八. nginx安全配置

1 限制访问

限制对敏感文件和目录的访问,防止未授权用户访问。

nginx
location ~ /.ht {
    deny all;
}

location ~ /.git {
    deny all;
}

2. 隐藏 Nginx 版本号

隐藏 Nginx 版本号可以减少被攻击的风险。

nginx
server_tokens off;

3. SSL/TLS 配置

3.1 启用 HTTPS

使用 SSL/TLS 加密通信,确保数据传输的安全性。

nginx
server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /path/to/certificate.pem;
    ssl_certificate_key /path/to/certificate.key;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
    ssl_prefer_server_ciphers on;
}

3.2 HSTS(HTTP Strict Transport Security)

启用 HSTS,强制浏览器仅通过 HTTPS 访问网站。

nginx
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";

3.3 OCSP Stapling

启用 OCSP Stapling,提高 SSL 握手的效率和安全性。

nginx
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;

4. 防止点击劫持

防止点击劫持攻击,确保用户不会在不知情的情况下被重定向到恶意网站。

nginx
add_header X-Frame-Options SAMEORIGIN;

5. 防止 MIME 类型嗅探

防止浏览器对响应内容进行 MIME 类型嗅探,避免潜在的安全风险。

nginx
add_header X-Content-Type-Options nosniff;

6. 防止 XSS 攻击

启用 XSS 保护,防止跨站脚本攻击。

nginx
add_header X-XSS-Protection "1; mode=block";

7. 防止 CSRF 攻击

虽然 Nginx 本身不直接提供 CSRF 保护,但可以通过设置适当的头部来增强安全性。

nginx
add_header Referrer-Policy "same-origin";

8. 防止缓存敏感数据

防止浏览器缓存敏感数据,确保用户隐私。

nginx
location /sensitive-data {
    add_header Cache-Control "no-store, no-cache, must-revalidate, max-age=0";
    add_header Pragma "no-cache";
}

9. 限制请求速率

限制请求速率,防止 DDoS 攻击。

nginx
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

server {
    location / {
        limit_req zone=one burst=5 nodelay;
    }
}

10. 日志记录

启用详细的日志记录,便于监控和审计。

nginx
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;

11. 文件上传限制

限制文件上传的大小,防止大文件上传导致服务器资源耗尽。

nginx
client_max_body_size 10M;

12. 防火墙规则

使用防火墙规则进一步增强安全性,例如使用 fail2ban 来阻止恶意 IP 地址。

sh
sudo apt-get install fail2ban
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local

在 jail.local 文件中添加或修改以下内容:

ini
[nginx-http-auth]
enabled  = true
port     = http,https
filter   = nginx-http-auth
logpath  = /var/log/nginx/error.log
maxretry = 3
bantime  = 3600

在 Nginx 中配置静态文件缓存可以显著提高网站的性能,减少服务器的负载,并加快用户的页面加载速度。以下是一些常见的 Nginx 配置示例,用于设置静态文件缓存。

九. nginx静态文件缓存配置

假设你希望为常见的静态文件(如图片、CSS、JavaScript 文件)设置缓存。

1. 基本配置

nginx
server {
    listen 80;
    server_name example.com;

    root /var/www/html;
    index index.html;

    # 静态文件缓存配置
    location ~* .(jpg|jpeg|png|gif|ico|css|js)$ {
        expires 30d;  # 设置缓存时间为 30 天
        add_header Cache-Control "public, no-transform";
    }

    # 其他 location 块
    location / {
        try_files $uri $uri/ =404;
    }
}

2. 详细的静态文件缓存配置

你可以为不同类型的静态文件设置不同的缓存时间。

nginx
server {
    listen 80;
    server_name example.com;

    root /var/www/html;
    index index.html;

    # 图片文件缓存
    location ~* .(jpg|jpeg|png|gif|ico)$ {
        expires 30d;  # 设置缓存时间为 30 天
        add_header Cache-Control "public, no-transform";
    }

    # CSS 文件缓存
    location ~* .css$ {
        expires 14d;  # 设置缓存时间为 14 天
        add_header Cache-Control "public, no-transform";
    }

    # JavaScript 文件缓存
    location ~* .js$ {
        expires 14d;  # 设置缓存时间为 14 天
        add_header Cache-Control "public, no-transform";
    }

    # 其他 location 块
    location / {
        try_files $uri $uri/ =404;
    }
}

3. 使用 map 指令优化缓存配置

使用 map 指令可以更灵活地设置缓存时间。

nginx
http {
    # 定义缓存时间
    map $sent_http_content_type $expires {
        default                    30d;
        text/html                  1h;
        text/css                   14d;
        application/javascript     14d;
        ~image/                    30d;
    }

    server {
        listen 80;
        server_name example.com;

        root /var/www/html;
        index index.html;

        # 静态文件缓存配置
        location ~* .(jpg|jpeg|png|gif|ico|css|js)$ {
            expires $expires;
            add_header Cache-Control "public, no-transform";
        }

        # 其他 location 块
        location / {
            try_files $uri $uri/ =404;
        }
    }
}

4. 防止缓存敏感数据

对于敏感数据,可以设置不缓存。

nginx
server {
    listen 80;
    server_name example.com;

    root /var/www/html;
    index index.html;

    # 静态文件缓存配置
    location ~* .(jpg|jpeg|png|gif|ico|css|js)$ {
        expires 30d;  # 设置缓存时间为 30 天
        add_header Cache-Control "public, no-transform";
    }

    # 敏感数据不缓存
    location /sensitive-data {
        add_header Cache-Control "no-store, no-cache, must-revalidate, max-age=0";
        add_header Pragma "no-cache";
    }

    # 其他 location 块
    location / {
        try_files $uri $uri/ =404;
    }
}

5. 504网关超时错误

如果前端配置xhr请求超齿没问题,再看后端网关服务,如果都没问题,那大概率就是nginx配置问题了; nginx如果没设置超时时间,读取的是默认的超时时间是60s;

  1. Nginx负载均衡超时配置改为6分钟
upstream uc_gateway{
   server xxx;
   server xxx;
   server xxx;
   
   # 超时配置
   keepalive_timeout 360s;      # 6分钟 = 360秒
   keepalive_requests 1000;     # 每个连接最大请求数
    keepalive 32;              # 保持连接数
   keepalive_requests 100;    # 每个连接最大请求数
   keepalive_timeout 60s;     # 连接超时时间
}
  1. 在location中添加代理超时配置
location / {
    proxy_pass http://uc_gateway;
    
    # 超时设置(6分钟)
    proxy_connect_timeout 60s;      # 连接超时:1分钟
    proxy_send_timeout 360s;        # 发送超时:6分钟
    proxy_read_timeout 360s;        # 读取超时:6分钟
    
    # 其他代理配置
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}