Nginx 服务器常用操作

发布于:2025-08-16 ⋅ 阅读:(40) ⋅ 点赞:(0)

一. Nginx 常用配置

1. Nginx 总配置文件

nginx 安装目录下的 nginx.conf 文件:

# 指定 Nginx worker 进程运行的系统用户
user  nginx;
# 自动根据 CPU 核心数启动相应数量的 worker 进程,充分利用多核。
worker_processes  auto;
# 自动将 worker 进程绑定到特定 CPU 核心,减少 CPU 缓存失效,提高性能。
worker_cpu_affinity auto;

# 错误日志路径和日志级别
error_log  /var/log/nginx/error.log warn;
# 保存 Nginx 主进程 PID 文件的位置,方便管理。
pid        /var/run/nginx.pid;

# 事件段
events {
    # 每个 worker 进程允许同时处理的最大连接数
    worker_connections  4096;
    # 避免多个 worker 同时争抢新连接,减少惊群效应(适合高并发)
    accept_mutex on;
    # worker 一次尽量多接收连接,而不是一次只接一个,提高吞吐量
    multi_accept on;
}

# HTTP 段
http {
    # 加载文件类型与 MIME 类型的映射表。
    include       /etc/nginx/mime.types;
    # 默认 MIME 类型(找不到类型时按二进制流处理)。
    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;

    # 关闭响应头中 Nginx 版本号,防止暴露版本信息
    server_tokens  off; 
    
    # 开启零拷贝机制,提高静态文件传输性能。
    sendfile        on;
    #tcp_nopush     on;

    # 限制客户端请求体大小(主要影响文件上传)
    client_max_body_size 50m;
    # 接保持时间(秒),超过这个时间空闲连接会关闭。
    keepalive_timeout  65;

    # 启用 Gzip 压缩,减少传输体积。
    gzip on;
    # 小于 1KB 的响应不压缩。
    gzip_min_length 1k;
    # 压缩级别(1~9,数字越大压缩比越高但 CPU 开销越大,6 是平衡值)。
    gzip_comp_level 6;
    # 让代理缓存知道有压缩版本。
    gzip_vary on;
    # 压缩数据的缓冲区数量和大小。
    gzip_buffers 16 8k;
    # 定义要压缩的内容类型(文本类、JSON、JS、XML、部分图片等)。
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript image/jpeg image/gif  application/x-protobuf application/octet-stream;

    # 载入 /etc/nginx/conf.d/ 目录下的所有 .conf 文件,通常这里会放各个站点或服务的具体 server 配置。
    include /etc/nginx/conf.d/*.conf;

}

2. Nginx 子文件

nginx 安装目录下的 conf.d 文件夹下可以放置多个子配置文件

如: default.conf:

# 定义一个名字叫 ashen_servers 的上游服务器组
upstream ashen_servers {
    # 每个 ashen00x 是一个后端服务(IP 或主机名),端口是 8091。
    # 负载均衡权重(这里都是 1,表示均匀分配请求)。
    server ashen001:8091  weight=1;
    server ashen002:8091  weight=1;
    server ashen003:8091  weight=1;
}


server {
    # 开启 443 端口,支持 HTTP/2 + SSL。
    listen 443 http2 ssl;
    # IPv6 支持。
    listen [::]:443 http2 ssl;
    # 该虚拟主机匹配 www.ashentest.com 域名请求
    server_name www.ashentest.com;

    # 指定 SSL 证书和私钥路径
    ssl_certificate /etc/nginx/ssl/www.ashentest.com.pem;
    ssl_certificate_key /etc/nginx/ssl/www.ashentest.com.key;

    # ssl验证相关配置
    # SSL 会话缓存有效期 5 分钟。
    ssl_session_timeout  5m;
    # 加密套件,禁止弱加密算法(!开头的表示禁用)。
    # 首选套件:椭圆曲线 Diffie-Hellman 临时密钥交换(ECDHE)、RSA 身份认证、AES128 位加密(GCM 模式)、SHA256 消息认证。
    # ECDHE:临时密钥交换,防止密钥被长期窃取。
    # ECDH:椭圆曲线 Diffie-Hellman(非临时密钥)。
    # AES:AES 对称加密算法。
    # HIGH:高强度加密套件(OpenSSL 内置标签)。
    # !NULL:禁用不加密的套件(纯明文传输)。
    # !aNULL:禁用匿名认证的套件(无身份验证,容易中间人攻击)。
    # !MD5:禁用基于 MD5 的套件(MD5 已被攻破)。
    # !ADH:禁用匿名 Diffie-Hellman。
    # !RC4:禁用 RC4 流加密(已不安全)。
    # !3DES:禁用 3DES(三重 DES,加密强度低且易受 Sweet32 攻击)。
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4:!3DES;
    # 安全链接可选的加密协议
    # ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    # 只允许 TLS 1.1 和 TLS 1.2(TLS 1.0 已废弃)
    # 指定允许的 TLS 协议版本。
    # TLSv1.1:比 TLSv1.0 安全,但现在已逐步弃用。
    # TLSv1.2:目前主流安全版本(支持 AES-GCM、SHA256 等现代套件)。
    ssl_protocols TLSv1.1 TLSv1.2;
    # 服务器优先使用自己选择的加密算法(增强安全)    
    ssl_prefer_server_ciphers on;

    # 最大请求体(文件上传等)300MB
    client_max_body_size 300m;
    
    # 默认首页文件优先级:index.html → index.htm → index.nginx-debian.html
    index index.html index.htm index.nginx-debian.html;

    # 根目录 
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
    
    # 前端配置
    location /webtest {
        alias /usr/share/nginx/html/webtest;
        index index.html index.htm;
    }

    # 配置跨域的前端服务
    location /yunkongzhixing{
        add_header Access-Control-Allow-Origin *;
        add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
        add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
        if ($request_method = 'OPTIONS') {
       	    return 204;
        }
        alias /usr/share/nginx/html/yunkongzhixing;
        index index.html index.htm index.nginx-debian.html;
   }

    # 后端配置
    location /api-test {
        proxy_set_header Host $host;
        proxy_set_header X-Real-Ip $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_pass http://192.168.1.111:8088/api-test;
    }

    # 配置负载均衡的服务
    location /ashen {
        proxy_set_header Host $host;
        proxy_set_header X-Real-Ip $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_pass http://ashen_servers/ashen;
    }

}


server {

    listen       80;
    server_name  localhost;

        location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
    
    # 前端配置
    location /webtest {
        alias /usr/share/nginx/html/webtest;
        index index.html index.htm;
    }

    # 后端配置
    location /api-test {
        proxy_set_header Host $host;
        proxy_set_header X-Real-Ip $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_pass http://192.168.1.111:8088/api-test;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    
    # 错误页面
    # 当返回 500/502/503/504 错误时,用 /usr/share/nginx/html/50x.html 显示自定义错误页面。
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }


}

二. Nginx 四层代理

上面的配置主要是针对HTTP的七层代理模式, Nginx 通用支持 四层代理模式:

  1. OSI 模型的 第七层:应用层(HTTP、WebSocket、SMTP 等)
  2. OSI 模型的 第四层:传输层(TCP/UDP)

两层代理的核心区别:

对比项 四层代理(L4) 七层代理(L7)
处理层级 只处理 TCP/UDP 流,不解析应用层数据 解析 HTTP/HTTPS 等应用层协议
Nginx 模块 stream {} http {}
代理方式 类似 IP:PORT 的转发,透明传输 基于 URL、Host、Header 等做路由
能否修改数据 ❌ 不能改应用层内容 ✅ 可以改请求头、响应内容
性能 高(数据包转发快,延迟低) 稍低(要解析、处理 HTTP 内容)
常用场景 数据库代理、TCP 应用、负载均衡、SSL 透传 Web 反向代理、API 网关、静态资源服务
负载均衡粒度 IP+端口级 URL、域名、Header、Cookie 级
示例 转发 MySQL 3306、Redis 6379、HTTPS 443 根据 URL 转发 /api 给后端,/static 给静态服务器

示例:


# 四层代理
stream {

   # 对 ashen_server 的代理, 需要负载均衡开起 upstream
   upstream mongodb_server {
        server ashen001:8808;
        server ashen002:8808;
   }

   server {
        listen 18808;
        proxy_pass ashen_server;
   }


# 对单个服务进去四层代理
   server {
        listen 18848;
        proxy_pass docloud003:8848;
   }

}

三.Tomcat 和 Nginx 启用 gzip 压缩

1.Nginx启用GZIP压缩

需要修改 Nginx安装目录下的conf/nginx.conf文件

添加:

     gzip on;
     gzip_vary on;
     gzip_buffers 16 8k;
     gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript image/jpeg image/gif image/png;

在这里插入图片描述

然后重启Nginx

2.Tomcat启用 gzip 压缩

需要修改tomcat安装目录下的conf/server.xml文件

<Connector port="8080"
  protocol="HTTP/1.1"
  connectionTimeout="20000"
  redirectPort="8443"    
  compression="on" 
  compressionMinSize="2048" 
  noCompressionUserAgents="gozilla, traviata"   
  compressableMimeType="text/html,text/xml,text/javascript,application/javascript,text/css,text/plain,text/json"/>

在这里插入图片描述

然后重启tomcat

3.开启压缩后的效果

在这里插入图片描述

四.Nginx报Too many open files

Linux是有文件句柄限制的(open files),一般默认是1024,当超过这个数量便会报 Too many open files错误

1.查看默认文件句柄数

ulimit -a

在这里插入图片描述

2.增大允许打开的文件数

有两种修改方式:

2.1 命令行方式:
ulimit -n 65535

立即生效,对当前用户有效,重启后失效

2.2 修改系统配置文件
vim /etc/security/limits.conf

在文件最后加入:

* soft nofile 65535  
* hard nofile 65535

3.修改Nginx配置文件

worker_rlimit_nofile 65535;

在这里插入图片描述

4.重启 nginx

nginx -s reload

五.请求链接后缀带 / 和不带 /的区别

以 http://localhost:8080/test 和 http://localhost:8080/test/ 为例

  1. 带 / 通常表示访问的是一个目录。在 RESTful 风格的 API 中,这可能代表该目录下的资源集合。
    不带 / 通常表示访问的是一个具体的资源。它可以是一个文件或一个单独的资源实体。

  2. 不同的服务器或框架(如 Flask、Django、FastAPI 等)会根据 URL 结尾的 / 处理方式不同:

如果服务器严格区分: 这种情况下 /test 和 /test/ 会被视为完全不同的两个路由,如果没有对应的路由规则,就直接返回 404。

如果服务器启用了自动重定向: 服务器会自动返回一个 301 或 308 重定向 到正确的路径。

六.静态文件断点续传

1. 添加 nginx 配置

   location /download {
        alias /mnt/file/;
        add_header Content-Disposition: 'attachment';
        add_header  Content-Type application/octet-stream;
    }

2.将可下载的文件放在 /mnt/file/ 文件夹下即可

3.请求 http:/ip:port/download/ + "文件名称"即可

七. linux上 springboot项目接收 header 为 null

原因: 可能header中带下划线 "_ " , 经过 nginx 转发后, 会过滤掉该 header, 将下划线 “_” 改为 "-"即可


网站公告

今日签到

点亮在社区的每一天
去签到