Skip to content

Nginx

介绍

Nginx(发音为“engine-x”)是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。它最初由俄罗斯的伊戈尔·赛索耶夫(Igor Sysoev)开发,并于2004年首次公开发布。Nginx以其稳定性、丰富的功能集、简单的配置和低资源消耗而闻名。

nginx

反向代理

反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时,用户不需要知道目标服务器的地址,也无须在用户端作任何设定。反向代理服务器通常可用来作为Web加速,即使用反向代理作为Web服务器的前置机来降低网络和服务器的负载,提高访问效率。

具有以下优点:

  • 提高了内部服务器的安全

外部网络用户通过反向代理访向内部服务器,只能看到反向代理服务器的IP地址和端口号,内部服务器对于外部网络来说是完全不可见。而且反向代理服务器上没有保存任何的信息资源,所有的网页程序都保存在内部服务器上,对反向代理服务器的攻击并不能使真的网页信息系统受到破坏,这样就提高了内部服务器的安全性。

  • 加快了对内部服务器的访问速度

在内部服务器前放置两台反向代理服务器,分别连接到教育网和公网,这样公网用户就可以直接通过公网线路访问学校服务器,从而避开了公网和教育网之间拥挤的链路。同时反向代理服务器的缓存功能也加快了用户的访问速度。

  • 节约了有限的IP资源

校园网内部服务器除使用教育网地址外,也会采用公网的IP地址对外提供服务,公网分配的IP地址数目是有限的,如果每个服务器有分配-个公网地址,那是不可能的,通过反向代理技术很好的解决了IP地址不足的问题。

nginx

nginx搭建

直接安装在宿主机上

sh
yum -y install nginx
yum -y install nginx-all-modules.noarch
systemctl enable nginx && systemctl start nginx

使用docker安装

小技巧 : 运行一个临时容器并复制默认配置文件, 然后删除这个临时镜像, 这样就可以获取到默认的配置文件

sh
docker run --name temp-nginx -d nginx:latest
docker cp temp-nginx:/etc/nginx /data
docker stop temp-nginx && docker rm temp-nginx

安装并开放端口80和443

sh
docker run --name nginx --restart=always -v /data/nginx:/etc/nginx -p 80:80 -p 443:443 -d nginx:latest

如果不确定以后有多少个端口需要开放, 也可以使用--network=host所有端口和主机互通

sh
docker run --name nginx --restart=always -v /data/nginx:/etc/nginx --network=host -d nginx:latest

配置详解

日志配置

改为json格式, 这种格式比起字符串拼接更容易理解日志里各个参数, 打印各个重要参数如下

nginx
http {
    log_format main escape=json '{'
        '"time_local":"$time_iso8601",'  # 记录请求的本地时间(ISO 8601格式)
        '"ip":"$remote_addr",'  # 记录客户端的IP地址
        '"request":"$request",'  # 记录完整的HTTP请求行
        '"status":$status,'  # 记录响应的HTTP状态码
        '"request_time":$request_time,'  # 记录请求处理的时间
        '"params":"$args",'  # 记录请求的参数
        '"bytes":$body_bytes_sent,'  # 记录响应体发送的字节数
        '"body":"$request_body"'  # 记录请求体
    '}';


    access_log /var/log/nginx/access.log main;

    .......
}

https配置

如果你有多个域名需要在同一个 443 端口上使用 HTTPS,可以通过复制并修改现有的 server 配置来实现。每个 server 配置块可以独立设置不同的 server_name 和相应的 SSL 证书信息。

nginx
http {
    server {
        listen 443 ssl;  # 监听 HTTPS 的 443 端口
        server_name www.hezhiwenda.info;  # 服务器名
        
        root /data/web;  # 设置网站根目录
        
        ssl_certificate /etc/nginx/cert/www.hezhiwenda.info_bundle.crt;  # SSL 证书路径
        ssl_certificate_key /etc/nginx/cert/www.hezhiwenda.info.key;  # SSL 证书私钥路径
        ssl_session_cache shared:SSL:1m;  # SSL 会话缓存配置
        ssl_session_timeout 5m;  # SSL 会话超时时间
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;  # SSL 加密算法配置
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;  # SSL 协议配置
        ssl_prefer_server_ciphers on;  # 优先使用服务器端配置的加密算法
        
        proxy_set_header X-Real-IP $remote_addr;  # 设置代理头 X-Real-IP,传递客户端真实IP地址
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  # 设置代理头 X-Forwarded-For,传递客户端原始IP地址
        proxy_set_header X-Forwarded-Proto $scheme;  # 设置代理头 X-Forwarded-Proto,传递协议类型(http/https)
        
        .......
    }
}

静态文件配置

重点是要在开启gzip压缩的同时,让Nginx能够在相同文件夹中查找同名的 .gz 文件,以便优先传送预先压缩好的静态文件,提高网站的传输效率和减少服务器资源消耗(减少大于60%)。 可以利用vue-cli的compression-webpack-plugin插件, 或者是vite的vite-plugin-compression插件在编译时进行自动gz压缩。

nginx
http {
    server {
        location /dist {
                    
            #开启gzip
            gzip  on;  
            #低于1kb的资源不压缩 
            gzip_min_length 1k;
            #压缩级别1-9,越大压缩率越高,同时消耗cpu资源也越多,建议设置在5左右。 
            gzip_comp_level 5; 
            #需要压缩哪些响应类型的资源,多个空格隔开。不建议压缩图片.
            gzip_types text/plain application/javascript application/x-javascript text/javascript text/xml text/css;  
            #配置禁用gzip条件,支持正则。此处表示ie6及以下不启用gzip(因为ie低版本不支持)
            gzip_disable "MSIE [1-6]\.";  
            #是否添加“Vary: Accept-Encoding”响应头
            gzip_vary on;
        
            # 设置别名,将请求映射到实际文件系统路径中的 `/data/web/manage` 目录
            alias   /data/web/manage;
            
            # 尝试查找文件,优先级依次为:当前请求的URI路径,路径加上斜杠,以及最后使用 `/manage/index.html`
            try_files $uri $uri/ /manage/index.html;
        }
        
        .......
    }
}

静态压缩: 只使用预压缩文件,而不进行动态压缩

nginx
http {
    server {
        location /dist {
            gzip_static on;  # 启用gzip_static模块
            gzip off;        # 禁用动态Gzip压缩
        }
        
        .......
    }
}
参数作用
gzip_types定义了需要压缩的文件类型。通常包括文本文件、CSS/JavaScript/XML 等。
gzip_comp_level定义压缩级别,范围是 1 到 9。1 是最低的压缩率,9 是最高的压缩率。默认值 6。
gzip_min_length定义最小压缩文件大小。小于这个大小的文件不会被压缩。
gzip_proxied定义了是否对代理请求启用压缩。any 表示对所有代理请求启用压缩。
gzip_vary添加响应,确保代理服务器能正确处理缓存。

启动静态资源缓存

对于静态资源,启用缓存可以显著减少服务器的负载:

nginx
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
    expires 30d;
    add_header Cache-Control "public, no-transform";
}
参数作用
expires定义了资源的缓存时间。30d 表示资源将缓存 30 天。
Cache-Controlpublic 表示资源可以被任何缓存「如浏览器、CDN等」缓存,no-transform 表示不允许代理服务器对资源进行转换「如压缩等」

tcp集群配置

我们将使用 Nginx 的 stream 模块来配置 TCP 代理。

nginx
# 设置工作进程数量
worker_processes auto;

events {
    # 设置每个工作进程的最大连接数
    worker_connections 1024;
}

stream {
    upstream backend {
        server 192.168.1.100:8000;
        server 192.168.1.101:8000;
        # 可以添加更多的服务器,用于负载均衡
        # server 192.168.1.102:8000;
    }

    server {
        listen 8000;  # 监听的端口号

        proxy_pass backend;  # 将请求代理到上游服务器组

        # 可以根据需要添加其他配置,如SSL、日志等
        # ssl_certificate /path/to/cert.pem;
        # ssl_certificate_key /path/to/cert.key;
        # access_log /var/log/nginx/tcp-access.log;
    }
}

WebSocket配置

Nginx配置WebSocket也比较简单,只需要在nginx.conf文件中进行相应的配置。这种方式很简单,但是很有效,能够横向扩展WebSocket服务端的服务能力。

先直接展示配置文件,如下所示(使用的话直接复制,然后改改ip和port即可)

nginx
map $http_upgrade $connection_upgrade { 
	default upgrade; 
	'' close; 
} 
upstream wsbackend{ 
	server ip1:port1; 
	server ip2:port2; 
	keepalive 1000; 
} 
 
server { 
	listen 20038; 
	location / { 
		proxy_http_version 1.1; 
		proxy_pass http://wsbackend; 
		proxy_redirect off; 
		proxy_set_header Host $host; 
		proxy_set_header X-Real-IP $remote_addr; 
		proxy_read_timeout 3600s; 
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
		proxy_set_header Upgrade $http_upgrade; 
		proxy_set_header Connection $connection_upgrade; 
	} 
}
参数作用
listen 20038指定 Nginx 监听的端口为 20038。
locations /指定监听的路径为 ,表示匹配所有路径,相当于默认配置。
proxy_http_version 1.1设置反向代理发送的 HTTP 协议版本为 1.1,支持长连接。
proxy_pass ;指定反向代理的目标 URI,可以使用负载均衡变量。
proxy_redirect off;禁止替换路径,其实这里如果是/则有没有都没关系,因为default也是将路径替换到proxy_pass的后边。
proxy_set_header Host $host;传递请求头时保持不变。
proxy_set_header X-Real-IP $remote_addr;传递请求时,来源 IP 保持为客户端的真实 IP。
proxy_read_timeout 3600s;设置两次请求之间的最大间隔为 3600 秒,超过此时间则关闭连接。
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;表示X-Forwarded-For头不发生改变
proxy_set_header Upgrade $http_upgrade;设置Upgrade不变
proxy_set_header Connection $connection_upgrade;表示如果 $http_upgrade为upgrade,则请求为upgrade(websocket),如果不是,就关闭连接

限制请求速率

为了防止恶意请求或突发流量导致服务器过载,可使用 limit_req 模块限制请求速率:

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

    server {
        location / {
            limit_req zone=one burst=5;
        }
    }
}
参数作用
limit_req_zone定义限流区域。$binary_remote_addr 表示根据客户端的 IP 地址进行限流,rate=1r/s 表每秒允许 1 个请求。
limit_req在指定的位置应用限流。burst=5 表允许突发 5 个请求。

基础配置优化

调整 worker_processes 以及 worker_connections

Nginx 使用多进程模型处理请求。worker_processes 定义 Nginx 使用的工作进程数,而 worker_connections 定义每个工作进程可以处理的最大连接数:

nginx
worker_processes auto;
events {
    worker_connections 1024;
}
参数作用
worker_processes设置为 auto 可以让 Nginx 自动根据 CPU 核心数来分配工作进程数。如服务器有 4 个 CPU 核心,Nginx 会启动 4 个工作进程。
worker_connections这个值决定了每个工作进程可以处理的最大连接数。通常,可根据服务器的内存和网络带宽来调整这个值。1024 是一个常见起点,可以调整到 2048。

启用 keepalive 长连接

HTTP 协议中的 keepalive 机制允许客户端和服务器在同一个连接上发送多个请求,减少了 TCP 连接的建立和关闭开销:

nginx
http {
    keepalive_timeout 65;
    keepalive_requests 100;
}
参数作用
keepalive_timeout定义客户端与服务器保持连接的时间。设置为 65 秒意味着如果客户端在 65 秒内没有发送新请求,连接将被关闭。
keepalive_requests定义了单个连接上允许的最大请求数。设置为 100 意味着一个连接可以处理 100 个请求后关闭。

调整 buffer 的大小

Nginx 使用缓冲区来存储请求和响应数据。如缓冲区设置过小,Nginx 可能会频繁地进行磁盘 I/O 操作,影响性能:

nginx
http {
    client_body_buffer_size 10K;
    client_header_buffer_size 1k;
    large_client_header_buffers 48k;
}
参数作用
client_body_buffer_size定义用于存储客户端请求体的缓冲区大小。如请求体超过这个大小,会将数据写入磁盘。
client_header_buffer_size定义用于存储客户端请求头的缓冲区大小。
large_client_header_buffers定义用于存储大型请求头的缓冲区数量和大小。

HTTP/2

HTTP/2 提供了多路复用、头部压缩特性,可以显著提升性能:

nginx
server {
    listen 443 ssl http2;
    ssl_certificate /path/to/cert.pem;
    ssl_certificate_key /path/to/key.pem;
}
参数作用
http2listen 指令中添加 http2 参数即可启用。

日志优化

nginx
access_log /var/log/nginx/access.log main buffer=16k;
error_log /var/log/nginx/error.log warn;

注意:调整日志级别可减少日志输出量,提升性能。这表示将访问日志的缓冲区大小设置为 16KB,并将错误日志级别设置为 warn。

粤ICP备20009776号