前言
Nginx(发音同“engine X”)是异步框架的网页服务器,也可以用作反向代理、负载平衡器和HTTP缓存。
Nginx的编写有一个明确目标就是超越Apache Web服务器的性能。Nginx提供开箱即用的静态文件,使用的内存比Apache少得多,每秒可以处理大约四倍于Apache的请求。 在低并发下Nginx的性能与Apache相当(有时候还低于),但是在高并发下Nginx能保持低资源低消耗高性能。Nginx的优点还包括:高度模块化的设计,模块编写简单,以及配置文件简洁。
本文主要介绍在 Debian 系(如 Ubuntu,Debian)操作系统上如何安装及配置 Nginx。
安装
apt install nginx
配置
配置文件在 /etc/nginx
中,按照官方的指南,配置文件目录下的 sites-available
文件夹存放网站的配置文件, sites-enabled
文件夹用来存放启用的网站配置文件(通过软连接的方式)。
比如 sites-available 文件夹下有一个 jackyu.cn 的配置文件,如果我们要将他装载到 Nginx 中,则通过
ln -s /etc/nginx/sites-available/jackyu.cn /etc/nginx/sites-enabled/jackyu.cn
重载配置文件前,通过 nginx -t
检查配置文件是否有误,再使用 nginx -s reload
重载。
HTTP
server {
listen 80;
listen [::]:80;
server_name <域名>;
}
HTTPS
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name <域名>;
ssl_certificate <证书路径>;
ssl_certificate_key <私钥路径>;
}
HTTP 与 HTTPS 共存
server {
listen 80;
listen [::]:80;
server_name <域名>;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name <域名>;
ssl_certificate <证书路径>;
ssl_certificate_key <私钥路径>;
}
HTTP 强制跳转 HTTPS
使用 307 Temporary Redirect 强制跳转,保留方法,避免 POST http 地址时 301 Moved Permanently 导致 POST 方法跳转之后变成 GET 方法。
server {
listen 80;
listen [::]:80;
return 307 https://$server_name$request_uri;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name <域名>;
ssl_certificate <证书路径>;
ssl_certificate_key <私钥路径>;
}
HTTP/2
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name <域名>;
ssl_certificate <证书路径>;
ssl_certificate_key <私钥路径>;
}
静态资源
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name <域名>;
ssl_certificate <证书路径>;
ssl_certificate_key <私钥路径>;
root <静态资源的文件夹路径>;
index <首页文件名>;
}
反向代理
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name <域名>;
ssl_certificate <证书路径>;
ssl_certificate_key <私钥路径>;
location /api/ {
proxy_pass http://127.0.0.1:9001/;
proxy_redirect off;
proxy_set_header Host $host; # 发送给后端当前 host
proxy_set_header X-Real-IP $remote_addr; # 客户端真实 ip
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 经过的反向代理 ip 列表
proxy_set_header X-Forwarded-Proto $scheme; # 发送给后端当前使用的协议 http or https
client_max_body_size 1000m; # 上传文件大小限制 1000m
}
}
上述配置将会把访问时的 /api/<接口地址>
反向代理到服务器本地 9001 端口 /<接口地址>
如果不需要子目录反向代理,将 location /api/
改为 location /
即可
反向代理启用 WebSocket
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name <域名>;
ssl_certificate <证书路径>;
ssl_certificate_key <私钥路径>;
location /api/ {
proxy_pass http://127.0.0.1:9001/;
proxy_redirect off;
proxy_set_header Host $host; # 发送给后端当前 host
proxy_set_header X-Real-IP $remote_addr; # 客户端真实 ip
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 经过的反向代理 ip 列表
proxy_set_header X-Forwarded-Proto $scheme; # 发送给后端当前使用的协议 http or https
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
client_max_body_size 1000m; # 上传文件大小限制 1000m
}
}
PHP-FPM 的 FastCGI 部署
location ~ [^/]\.php(/|$) {
try_files $uri =404;
fastcgi_pass unix:/var/run/php/php8.0-fpm.sock;
fastcgi_index index.php;
include fastcgi.conf;
}
反向代理高并发优化
具体配置需要根据压力测试结果进行调节
worker_processes auto;
events {
worker_connections 8096;
multi_accept on;
use epoll;
}
worker_processes 是 nginx 运行时启用的进程数量,默认为 auto,可以设置为CPU的核心数或线程数。
对于 Nginx 与后端服务、MySQL 存放在一台服务器上的时候如果 Nginx 进程开的太多,在高并发的时候会与 MySQL 或后端服务竞争 CPU 资源,如下图
在测试中,双核心处理器只启用 1 个 worker,增大连接数,压力测试出的并发数量甚至会有不少提升,不过一般保持 auto 就行。
文章最后修订于 2022年6月22日
评论 (0)