From b5c4cb7d3a8a3566235165ee94a687e7e8a992c4 Mon Sep 17 00:00:00 2001 From: Cherrling Date: Sun, 8 Dec 2024 23:09:34 +0800 Subject: [PATCH 01/12] add nginx --- docs/advanced/nginx.md | 565 +++++++++++++++++++++++++++++++++++++++++ mkdocs.yml | 1 + 2 files changed, 566 insertions(+) create mode 100644 docs/advanced/nginx.md diff --git a/docs/advanced/nginx.md b/docs/advanced/nginx.md new file mode 100644 index 000000000..6a3e6d731 --- /dev/null +++ b/docs/advanced/nginx.md @@ -0,0 +1,565 @@ + +# Nginx 速通指南 + +*2024.12.8 | Cherrling* + +***WebServer 不能失去 Nginx ,就如同西方不能失去耶路撒冷*** + +Nginx 是一个高性能的 HTTP 和反向代理服务器,它可以作为一个独立的 Web 服务器,也可以作为其他 Web 服务器的反向代理服务器。 + +如果你只是需要简单快速的拉起一个网站,或许也可以试试 Caddy,它是一个更加简单的 Web 服务器。 + +## 安装 + +你可以直接从 Debian 官方源安装 Nginx + +```bash +sudo apt update +sudo apt install nginx -y +sudo nginx -v # 查看 Nginx 版本 +``` + +如果你需要的话,设置开机自启 + +```bash +sudo systemctl enable nginx # 设置开机自启 +sudo systemctl start nginx # 启动 Nginx +sudo systemctl status nginx # 查看 Nginx 状态 +``` + +常用命令: + +```bash +sudo nginx -t # 检查配置文件是否正确 +sudo nginx -s reload # 不停机重新加载配置文件 +sudo systemctl reload nginx # 不停机重新加载配置文件 +sudo nginx -s stop # 停止 Nginx +sudo nginx -s quit # 安全停止 Nginx (完成当前请求后停止) +``` + + +## 配置 + +### 配置文件在哪 + +配置 Nginx 主要涉及到三个目录,分别是 `/etc/nginx/nginx.conf`、`/etc/nginx/sites-available` 和 `/etc/nginx/sites-enabled`。 + +* `nginx.conf` 是 Nginx 的主配置文件,它包含了 Nginx 的全局配置。 +* `sites-available` 目录下存放的是所有的站点配置文件。 +* `sites-enabled` 目录下存放的是启用的站点配置文件的符号链接。 + +一般情况下,我们不直接修改 `nginx.conf` 文件,而是在 `sites-available` 目录下创建一个新的配置文件,然后在 `sites-enabled` 目录下创建一个符号链接。 +如果要暂时下线某个站点,只需要删除 `sites-enabled` 目录下的符号链接即可,而不需要删除配置文件。 + +在一些较老版本的 Nginx 中,`sites-available` 和 `sites-enabled` 目录可能不存在,你可以在 `conf.d` 目录中新建 `*.conf` 文件来存放站点配置。 +一般情况下,`nginx.conf` 文件中会用 `include` 指令引入 `sites-enabled` 和 `conf.d` 目录下的配置文件。 + +>```nginx +># nginx.conf +>include /etc/nginx/conf.d/*.conf; +>include /etc/nginx/sites-enabled/*; +>``` + +### 我该如何编辑? + +编辑默认站点配置文件 + +```bash +sudo vim /etc/nginx/sites-available/default +``` + +一般来说,默认的站点配置长得像这样 + +```nginx +server { + listen 80 default_server; + listen [::]:80 default_server; + + root /var/www/html; + index index.html index.htm index.nginx-debian.html; + + server_name _; + + location / { + try_files $uri $uri/ =404; + } +} +``` + +这个配置文件中定义了一个监听 80 端口的站点,根目录是 `/var/www/html`,默认的首页文件是 `index.html`、`index.htm` 和 `index.nginx-debian.html`。 +这时你可以在 `/var/www/html` 目录下放置你自己的网站文件,然后访问 `http://localhost` 就可以看到你的网站了。 + +如果你需要反向代理,可以参考下面的配置: + +```nginx +server { + listen 80 default_server; # 监听 80 端口 + listen [::]:80 default_server; + + location / { + proxy_pass http://backend_server:port; # 替换为后端服务器的地址和端口 + 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; # 设置转发的 IP + proxy_set_header X-Forwarded-Proto $scheme; # 设置转发的协议 + } +} +``` + +这时访问 `http://localhost` 就会被转发到 `http://backend_server:port`。对外网来说,Nginx 就是一个反向代理站点。 + + +### 别忘了重启 + +修改配置文件后,别忘了重新加载 Nginx 配置,否则修改不会生效。 + +你可以先检查配置文件是否正确 + +```bash +sudo nginx -t +``` + +如果没有问题,就重新加载配置文件 + +```bash +sudo nginx -s reload +``` + +或者使用 + +```bash +sudo systemctl reload nginx +``` + + + +## 进阶教程 + +### Nginx 名词扫盲 + +在向你展示如何进阶配置 Nginx 之前,有一些你必须要了解的概念。 + +#### server 块 + +Nginx 的配置文件中可以有多个 server 块,每个 server 块定义了一个站点(虚拟主机),Nginx 会根据请求的域名和端口号来匹配对应的 server 块。 +Nginx 正是通过 server 块来实现多站点配置的。 +一个典型的 server 块: +```nginx +server { + listen 80; # 监听的端口 + server_name example.com; # 服务器名称 + + location / { + # 处理请求的指令 + } +} +``` + +#### location 块 + +location 块嵌套于 server 块中,用于定义如何处理特定 URI 的请求。一个 server 块中可以有多个 location 块。 + +Nginx 的 location 块用于定义如何处理特定 URI 的请求。它是 Nginx 配置中的一个重要部分,允许您根据请求的路径、参数或其他条件来执行不同的操作。 + +一个 location 块的基本结构如下: + +```nginx +location [modifier] /path/ { + # 处理请求的指令 +} +``` + +#### 反向代理与负载均衡 + +反向代理是指代理服务器接收客户端的请求,然后将请求转发给后端服务器,最后将后端服务器的响应返回给客户端。反代有不同协议的区分,如 HTTP 反代、TCP 反代、UDP 反代等。 + +负载均衡是指将请求分发给多个后端服务器,以达到均衡负载的目的。Nginx 支持多种负载均衡算法,如轮询、加权轮询、IP 哈希、最少连接等。 + +一个十分巧妙的负载均衡算法是一致性哈希算法,它可以保证在服务器数量变化时,尽可能少地改变已有的映射关系。推荐阅读:[一致性哈希算法](https://zh.wikipedia.org/wiki/%E4%B8%80%E8%87%B4%E5%93%88%E5%B8%8C)。 + +#### SSL/TLS + +SSL/TLS 是一种加密通信协议,用于保护客户端和服务器之间的通信安全。Nginx 支持 SSL/TLS 协议,可以用来配置 HTTPS 站点。 + +一般的 http 监听端口是 80,https 监听端口是 443。 + +#### WebSocket + +WebSocket 是一种全双工通信协议,用于在客户端和服务器之间建立持久连接,实现实时通信。Nginx 支持 WebSocket 协议,可以用来配置 WebSocket 服务器。 + +### 示例讲解 + +Nginx 主要用途可以分为固定站点和反代两类,可以通过几个例子来学习一下。 + + +#### 多站点配置 + +Nginx 的一个十分炫酷的功能就是可以实现一台主机上运行多个网站,对不同的域名提供不同的服务。这就是所谓的虚拟主机配置。 + +那么如何实现呢?答案就是 server 块中的 server_name 指令。server_name 指令用于定义服务器的名称,可以是域名、IP 地址、通配符等。我们来看一个典型的示例: + +* 对于请求 `example.com` 和 `www.example.com`,Nginx 会使用第一个 server 块来处理请求,对应的网站根目录是 `/var/www/example.com`。 + +* 对于请求 `example.org` 和 `www.example.org`,Nginx 会使用第二个 server 块来处理请求。对应的网站根目录是 `/var/www/example.org`。 + +* 对于其他请求,Nginx 会返回 404 错误。 +```nginx +server { + listen 80; # 监听的端口 + server_name example.com www.example.com; # 指定的域名 + root /var/www/example.com; # 网站根目录 + location / { + try_files $uri $uri/ =404; + } +} +server { + listen 80; # 监听的端口 + server_name example.org www.example.org; # 指定的域名 + root /var/www/example.org; # 网站根目录 + location / { + try_files $uri $uri/ =404; + } +server { + listen 80 default_server; # 默认站点 + server_name _; # 默认域名 + root /var/www/default; # 默认网站根目录 + location / { + try_files $uri $uri/ =404; + } +} +``` +注意到除了指定的域名外,还有一个 `_`,它表示默认域名。如果请求的域名不在 server_name 中,Nginx 会使用 `_` 对应的 server 块来处理请求。 +那 `default_server` 又是什么意思呢?它表示默认站点,当请求的域名不在 server_name 中时,Nginx 会使用 `default_server` 对应的 server 块来处理请求。 +一般建议为 Nginx 配置一个默认站点,用于处理未知域名的请求。 + +但是要注意的是,如果你只写了 `listen 80 default_server;`,比如: + +```nginx +server { + listen 80 default_server; + # 缺少 server_name 指令 + root /var/www/default; + location / { + try_files $uri $uri/ =404; + } +} +``` + +只写了 `listen 80 default_server;` 而没有 `server_name` 指令,Nginx 仍然会将该 server 块标记为默认服务器,但由于没有指定 server_name,它将会匹配所有请求的 Host 头。 +在这种情况下,任何发送到 80 端口的请求(无论 Host 头是什么)都会被这个 server 块处理,因为它是默认服务器。 + +如果只写了 `server_name _;`,比如: + +```nginx +server { + # 缺少 listen 指令 + server_name _; + root /var/www/default; + location / { + try_files $uri $uri/ =404; + } +} +``` +只写了 `server_name _;` 而没有 listen 指令,Nginx 将不会知道在哪个端口上监听这个 server 块,所以Nginx 不会启动这个 server 块,不会处理任何请求。 + + +#### Location 块详解 + +一个典型的 location 块如下: + +```nginx +location [modifier] /path/ { + # 处理请求的指令 +} +``` + +首先来看 `modifier`,它是一个可选的修饰符,用于修改 location 块的匹配规则。常用的修饰符有: + +* 前缀匹配 + +前缀匹配是 location 块的默认匹配规则,只要请求的路径以 location 块的路径开头,就会匹配成功。例如: + +```nginx +location /example { + # 处理请求 /example 和 /example/xxx + return 200 "This is a prefix match."; +} +``` + + + + +* `=` + + +精确匹配,只有请求的路径与 location 块的路径完全相同时才匹配。 + +```nginx +location = /example { + # 处理请求 /example + # 不处理 /example/xxx + return 200 "This is an exact match."; +} +``` + +* `~` + +区分大小写的正则匹配。 + + +* `~*` + +不区分大小写的正则匹配。 + +正则匹配的例子是: + +```nginx +location ~ /example[0-9] { + # 处理请求 /example1, /example2, ... + return 200 "This is a case-sensitive regex match."; +} +location ~ \.php$ { + # 处理以 .php 结尾的请求 + include fastcgi_params; + fastcgi_pass 127.0.0.1:9000; +} + +location ~* \.(jpg|jpeg|png)$ { + # 处理 jpg、jpeg 和 png 文件,不区分大小写 + root /var/www/html/images; +} +``` + + +* `^~` + + 通配符匹配,如果请求的 URI 以指定的路径开头,且该路径是最长的前缀匹配,则使用该 location 块。它优先于正则匹配。 + + +```nginx +location ^~ /static/ { + # 处理以 /static/ 开头的请求 + root /var/www/html/static; +} + +location ~ \.css$ { + # 处理以 .css 结尾的请求 + root /var/www/html/styles; +} +``` +在这个例子中,如果请求的 URI 是 `/static/style.css`,则会匹配到第一个 location 块,因为它是以 `/static/` 开头的前缀匹配。即使 `/static/style.css` 也符合第二个正则匹配的条件,但由于第一个 location 块使用了 `^~`,Nginx 不会继续检查正则匹配。 + + + +Nginx 在处理请求时会按照以下顺序匹配 location 块: + +1. 精确匹配 (=)。 +2. 前缀匹配(最长匹配)。 +3. 通配符匹配 (^~)。 +4. 正则匹配(~ 和 ~*,按出现顺序匹配)。 + + +而在 Location 块中,我们可以使用一些指令来处理请求,如: + +* `proxy_pass http://backend_server;`:反向代理。 +* `root /var/www/html;`:指定网站根目录。 +* `try_files $uri $uri/ =404;`:尝试查找文件,如果找不到返回 404 错误。 +* `return 200 "Hello, World!";`:返回指定的状态码和内容。 +* `include fastcgi_params;`:引入 FastCGI 参数。 + +#### SSL/TLS 配置 + +作为 WebServer ,必不可少的功能就是支持 HTTPS。你可以在 [https://cherr.cc/ssl.html](https://cherr.cc/ssl.html) 找到 SSL/TLS 的原理解释。 + +首先,你需要为你的域名申请一个 SSL 证书。你可以使用免费的 Let's Encrypt 证书,也可以购买商业证书。 +假设你的证书保存在 `/etc/ssl/certs/example.com.pem` 和 `/etc/ssl/private/example.com.pem`。 + +然后,你需要在 Nginx 配置文件中添加 SSL 配置: + +```nginx +server { + listen 443 ssl; # 监听的端口 + server_name example.com; # 指定的域名 + root /var/www/example.com; # 网站根目录 + + ssl_certificate /etc/ssl/certs/example.com.pem; # SSL 证书路径 + ssl_certificate_key /etc/ssl/private/example.com.pem; # SSL 证书密钥路径 + + # (可选)中间证书 + ssl_trusted_certificate /etc/ssl/certs/ca_bundle.crt; # 中间证书文件 + + # (可选)SSL 设置 + ssl_protocols TLSv1.2 TLSv1.3; # 启用的 SSL/TLS 协议 + ssl_ciphers 'HIGH:!aNULL:!MD5'; # 使用的加密套件 + ssl_prefer_server_ciphers on; # 优先使用服务器的加密套件 + ssl_session_cache shared:SSL:10m; # SSL 会话缓存大小 + ssl_session_timeout 10m; # SSL 会话超时时间 + + # (可选)HSTS(HTTP Strict Transport Security) + add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; + + location / { + try_files $uri $uri/ =404; + } +} +``` + +注意到和前文的配置不同,这里的监听端口是 443,而且增加了 ssl 选项。 +`ssl_certificate` 和 `ssl_certificate_key` 分别指定了 SSL 证书和密钥的路径。 + + +在配置文件中,我们还提到了一些可选的配置,如中间证书、SSL 设置、HSTS 等。一般建议设置 `ssl_protocols TLSv1.2 TLSv1.3;` ,因为 TLSv1.0 和 TLSv1.1 已经不安全且被弃用。 + +HSTS 是一种安全机制,用于强制客户端(浏览器)使用 HTTPS 访问网站。 +当用户首次访问支持 HSTS 的网站时,浏览器会通过 HTTP 或 HTTPS 发送请求。 +如果网站支持 HSTS,服务器会在响应中包含 Strict-Transport-Security 头部,指示浏览器该网站应仅通过 HTTPS 访问。 +`add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;` 表示启用 HSTS,浏览器会在 1 年内强制使用 HTTPS 访问网站,并且包括子域名。 + +#### 反向代理配置 + +反向代理是 Nginx 的一个重要功能,可以用于隐藏后端服务器的真实 IP 地址,提高安全性。也可以将开在不同端口的服务统一到一个端口上。 + +比如 alist 默认端口是 5244 ,komga 默认端口是 25600 ,jellyfin 默认端口是 8096 ,grafana 的默认端口是 3000,你可以通过反向代理将它们统一到 80 或 443 端口上。使用如下的域名区分不同的服务。 +* alist.cherr.cc -> 5244 +* komga.cherr.cc -> 25600 +* jellyfin.cherr.cc -> 8096 +* grafana.cherr.cc -> 3000 + +比如上面的例子,就可以通过下面的配置实现反向代理: + +```nginx +server { + listen 80; # 监听的端口 + server_name alist.cherr.cc; # 指定的域名 + + location / { + proxy_pass http://localhost:5244; # 反向代理的地址 + 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; # 设置转发的 IP + proxy_set_header X-Forwarded-Proto $scheme; # 设置转发的协议 + } +} + +server { + listen 80; # 监听的端口 + server_name komga.cherr.cc; # 指定的域名 + + location / { + proxy_pass http://localhost:25600; # 反向代理的地址 + 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; # 设置转发的 IP + proxy_set_header X-Forwarded-Proto $scheme; # 设置转发的协议 + } +} + +... +... +``` + +但是这只是最简单的反向代理配置,实际情况下往往还需要根据不同的服务做一些特殊的配置,可以通过两个狠狠坑过我的例子来学习。 + +* alist 反向代理非标准端口或启用https后丢失https或端口号/无法播放视频 + +https://alist.nn.ci/zh/guide/install/reverse-proxy.html + +问题就在于反代时需要正确的 Host 头,添加设置 `proxy_set_header Host $host;`,否则会导致反代失败。 + +```nginx +location / { + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Host $http_host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header Range $http_range; + proxy_set_header If-Range $http_if_range; + proxy_redirect off; + proxy_pass http://127.0.0.1:5244; + # the max size of file to upload + client_max_body_size 20000m; +} +``` + + +* Grafana 需要 websocket 反代支持 + +https://grafana.com/tutorials/run-grafana-behind-a-proxy/ + +关键在于 Grafana 加载数据时使用了 websocket,需要指示 Nginx 支持 websocket 反代。 + +```nginx +map $http_upgrade $connection_upgrade { + default upgrade; + '' close; +} +# Proxy Grafana Live WebSocket connections. +location /api/live/ { +proxy_http_version 1.1; +proxy_set_header Upgrade $http_upgrade; +proxy_set_header Connection $connection_upgrade; +proxy_set_header Host $host; +proxy_pass http://grafana; +} +``` + +#### 负载均衡配置 + +负载均衡是 Nginx 的另一个重要功能,可以用于分发请求到多个后端服务器,提高性能和可靠性。 + +一个典型的负载均衡配置如下: + +```nginx +http { + upstream backend { + server backend1.example.com; + server backend2.example.com; + server backend3.example.com; + } + + server { + listen 80; + server_name example.com; + + location / { + proxy_pass http://backend; # 将请求转发到 upstream 定义的后端服务器 + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + } + + server { + listen 80; + server_name another-example.com; + + location / { + proxy_pass http://backend; # 也可以使用相同的 upstream + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + } +} +``` + +* 负载均衡算法 + +Nginx 支持多种负载均衡算法,默认是轮询(round-robin)。你可以通过在 upstream 块中指定不同的算法来更改负载均衡策略,例如: + +最少连接: +```nginx +upstream backend { + least_conn; # 使用最少连接算法 + server backend1.example.com; + server backend2.example.com; +} +``` +IP 哈希: +```nginx +upstream backend { + ip_hash; # 使用 IP 哈希算法 + server backend1.example.com; + server backend2.example.com; +} +``` \ No newline at end of file diff --git a/mkdocs.yml b/mkdocs.yml index 982322412..c149f4ea1 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -118,6 +118,7 @@ nav: - Linux 桌面与窗口系统: advanced/desktop.md - ACL: advanced/acl.md - Caddy: advanced/caddy.md + - Nginx: advanced/nginx.md - Nmap: advanced/nmap.md - 守护进程: advanced/daemon.md - 超算: advanced/supercomputer.md From a6cc1f895b3ca0641db79249f3f4dbd9eb4e3e6a Mon Sep 17 00:00:00 2001 From: Cherrling Date: Mon, 9 Dec 2024 12:59:08 +0800 Subject: [PATCH 02/12] mv nginx --- docs/{advanced => ops/network-service}/nginx.md | 0 mkdocs.yml | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename docs/{advanced => ops/network-service}/nginx.md (100%) diff --git a/docs/advanced/nginx.md b/docs/ops/network-service/nginx.md similarity index 100% rename from docs/advanced/nginx.md rename to docs/ops/network-service/nginx.md diff --git a/mkdocs.yml b/mkdocs.yml index c149f4ea1..c47bf58a1 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -96,6 +96,7 @@ nav: - 网络服务实践: - ops/network-service/index.md - 隧道组网: ops/network-service/intranet.md + - Nginx: ops/network-service/nginx.md - 数据库: ops/database.md - 问题调试: ops/debug.md - 虚拟化技术: @@ -118,7 +119,6 @@ nav: - Linux 桌面与窗口系统: advanced/desktop.md - ACL: advanced/acl.md - Caddy: advanced/caddy.md - - Nginx: advanced/nginx.md - Nmap: advanced/nmap.md - 守护进程: advanced/daemon.md - 超算: advanced/supercomputer.md From 7e582803a586b314b32f290e1079ab6005207231 Mon Sep 17 00:00:00 2001 From: Cherrling Date: Mon, 9 Dec 2024 13:01:07 +0800 Subject: [PATCH 03/12] nginx: add author --- docs/ops/network-service/nginx.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/ops/network-service/nginx.md b/docs/ops/network-service/nginx.md index 6a3e6d731..f45c2f6ce 100644 --- a/docs/ops/network-service/nginx.md +++ b/docs/ops/network-service/nginx.md @@ -1,7 +1,7 @@ # Nginx 速通指南 -*2024.12.8 | Cherrling* +- Author: [Cherrling](https://cherr.cc) ***WebServer 不能失去 Nginx ,就如同西方不能失去耶路撒冷*** From 97c82be7e0002bace2202b5e8b3a8205046cb08b Mon Sep 17 00:00:00 2001 From: taoky Date: Tue, 24 Dec 2024 03:45:44 +0800 Subject: [PATCH 04/12] Format fixes --- docs/ops/network-service/nginx.md | 168 +++++++++++++++--------------- includes/authors.md | 1 + mkdocs.yml | 2 +- 3 files changed, 84 insertions(+), 87 deletions(-) diff --git a/docs/ops/network-service/nginx.md b/docs/ops/network-service/nginx.md index f45c2f6ce..6f428393e 100644 --- a/docs/ops/network-service/nginx.md +++ b/docs/ops/network-service/nginx.md @@ -1,9 +1,10 @@ +# Nginx 网页服务器 -# Nginx 速通指南 +!!! note "主要作者" -- Author: [Cherrling](https://cherr.cc) + [@Cherrling][Cherrling] -***WebServer 不能失去 Nginx ,就如同西方不能失去耶路撒冷*** +**_WebServer 不能失去 Nginx,就如同西方不能失去耶路撒冷_** Nginx 是一个高性能的 HTTP 和反向代理服务器,它可以作为一个独立的 Web 服务器,也可以作为其他 Web 服务器的反向代理服务器。 @@ -11,7 +12,7 @@ Nginx 是一个高性能的 HTTP 和反向代理服务器,它可以作为一 ## 安装 -你可以直接从 Debian 官方源安装 Nginx +你可以直接从 Debian 官方源安装 Nginx: ```bash sudo apt update @@ -19,7 +20,7 @@ sudo apt install nginx -y sudo nginx -v # 查看 Nginx 版本 ``` -如果你需要的话,设置开机自启 +如果你需要的话,设置开机自启: ```bash sudo systemctl enable nginx # 设置开机自启 @@ -28,7 +29,7 @@ sudo systemctl status nginx # 查看 Nginx 状态 ``` 常用命令: - + ```bash sudo nginx -t # 检查配置文件是否正确 sudo nginx -s reload # 不停机重新加载配置文件 @@ -37,16 +38,15 @@ sudo nginx -s stop # 停止 Nginx sudo nginx -s quit # 安全停止 Nginx (完成当前请求后停止) ``` - ## 配置 ### 配置文件在哪 配置 Nginx 主要涉及到三个目录,分别是 `/etc/nginx/nginx.conf`、`/etc/nginx/sites-available` 和 `/etc/nginx/sites-enabled`。 -* `nginx.conf` 是 Nginx 的主配置文件,它包含了 Nginx 的全局配置。 -* `sites-available` 目录下存放的是所有的站点配置文件。 -* `sites-enabled` 目录下存放的是启用的站点配置文件的符号链接。 +- `nginx.conf` 是 Nginx 的主配置文件,它包含了 Nginx 的全局配置。 +- `sites-available` 目录下存放的是所有的站点配置文件。 +- `sites-enabled` 目录下存放的是启用的站点配置文件的符号链接。 一般情况下,我们不直接修改 `nginx.conf` 文件,而是在 `sites-available` 目录下创建一个新的配置文件,然后在 `sites-enabled` 目录下创建一个符号链接。 如果要暂时下线某个站点,只需要删除 `sites-enabled` 目录下的符号链接即可,而不需要删除配置文件。 @@ -54,21 +54,21 @@ sudo nginx -s quit # 安全停止 Nginx (完成当前请求后停止) 在一些较老版本的 Nginx 中,`sites-available` 和 `sites-enabled` 目录可能不存在,你可以在 `conf.d` 目录中新建 `*.conf` 文件来存放站点配置。 一般情况下,`nginx.conf` 文件中会用 `include` 指令引入 `sites-enabled` 和 `conf.d` 目录下的配置文件。 ->```nginx -># nginx.conf ->include /etc/nginx/conf.d/*.conf; ->include /etc/nginx/sites-enabled/*; ->``` +> ```nginx +> # nginx.conf +> include /etc/nginx/conf.d/*.conf; +> include /etc/nginx/sites-enabled/*; +> ``` ### 我该如何编辑? -编辑默认站点配置文件 +编辑默认站点配置文件: ```bash sudo vim /etc/nginx/sites-available/default ``` -一般来说,默认的站点配置长得像这样 +一般来说,默认的站点配置长得像这样: ```nginx server { @@ -108,31 +108,28 @@ server { 这时访问 `http://localhost` 就会被转发到 `http://backend_server:port`。对外网来说,Nginx 就是一个反向代理站点。 - ### 别忘了重启 修改配置文件后,别忘了重新加载 Nginx 配置,否则修改不会生效。 -你可以先检查配置文件是否正确 +你可以先检查配置文件是否正确: ```bash sudo nginx -t ``` -如果没有问题,就重新加载配置文件 +如果没有问题,就重新加载配置文件: ```bash sudo nginx -s reload ``` -或者使用 - +或者使用: + ```bash sudo systemctl reload nginx ``` - - ## 进阶教程 ### Nginx 名词扫盲 @@ -144,6 +141,7 @@ sudo systemctl reload nginx Nginx 的配置文件中可以有多个 server 块,每个 server 块定义了一个站点(虚拟主机),Nginx 会根据请求的域名和端口号来匹配对应的 server 块。 Nginx 正是通过 server 块来实现多站点配置的。 一个典型的 server 块: + ```nginx server { listen 80; # 监听的端口 @@ -191,18 +189,18 @@ WebSocket 是一种全双工通信协议,用于在客户端和服务器之间 Nginx 主要用途可以分为固定站点和反代两类,可以通过几个例子来学习一下。 - #### 多站点配置 Nginx 的一个十分炫酷的功能就是可以实现一台主机上运行多个网站,对不同的域名提供不同的服务。这就是所谓的虚拟主机配置。 那么如何实现呢?答案就是 server 块中的 server_name 指令。server_name 指令用于定义服务器的名称,可以是域名、IP 地址、通配符等。我们来看一个典型的示例: -* 对于请求 `example.com` 和 `www.example.com`,Nginx 会使用第一个 server 块来处理请求,对应的网站根目录是 `/var/www/example.com`。 +- 对于请求 `example.com` 和 `www.example.com`,Nginx 会使用第一个 server 块来处理请求,对应的网站根目录是 `/var/www/example.com`。 -* 对于请求 `example.org` 和 `www.example.org`,Nginx 会使用第二个 server 块来处理请求。对应的网站根目录是 `/var/www/example.org`。 +- 对于请求 `example.org` 和 `www.example.org`,Nginx 会使用第二个 server 块来处理请求。对应的网站根目录是 `/var/www/example.org`。 + +- 对于其他请求,Nginx 会返回 404 错误。 -* 对于其他请求,Nginx 会返回 404 错误。 ```nginx server { listen 80; # 监听的端口 @@ -212,6 +210,7 @@ server { try_files $uri $uri/ =404; } } + server { listen 80; # 监听的端口 server_name example.org www.example.org; # 指定的域名 @@ -219,6 +218,8 @@ server { location / { try_files $uri $uri/ =404; } +} + server { listen 80 default_server; # 默认站点 server_name _; # 默认域名 @@ -228,8 +229,9 @@ server { } } ``` -注意到除了指定的域名外,还有一个 `_`,它表示默认域名。如果请求的域名不在 server_name 中,Nginx 会使用 `_` 对应的 server 块来处理请求。 -那 `default_server` 又是什么意思呢?它表示默认站点,当请求的域名不在 server_name 中时,Nginx 会使用 `default_server` 对应的 server 块来处理请求。 + +注意到除了指定的域名外,还有一个 `_`,它表示默认域名。如果请求的域名不在 `server_name` 中,Nginx 会使用 `*` 对应的 server 块来处理请求。 +那 `default_server` 又是什么意思呢?它表示默认站点,当请求的域名不在 `server_name` 中时,Nginx 会使用 `default_server` 对应的 server 块来处理请求。 一般建议为 Nginx 配置一个默认站点,用于处理未知域名的请求。 但是要注意的是,如果你只写了 `listen 80 default_server;`,比如: @@ -245,7 +247,7 @@ server { } ``` -只写了 `listen 80 default_server;` 而没有 `server_name` 指令,Nginx 仍然会将该 server 块标记为默认服务器,但由于没有指定 server_name,它将会匹配所有请求的 Host 头。 +只写了 `listen 80 default_server;` 而没有 `server_name` 指令,Nginx 仍然会将该 server 块标记为默认服务器,但由于没有指定 `server_name`,它将会匹配所有请求的 Host 头。 在这种情况下,任何发送到 80 端口的请求(无论 Host 头是什么)都会被这个 server 块处理,因为它是默认服务器。 如果只写了 `server_name _;`,比如: @@ -260,8 +262,8 @@ server { } } ``` -只写了 `server_name _;` 而没有 listen 指令,Nginx 将不会知道在哪个端口上监听这个 server 块,所以Nginx 不会启动这个 server 块,不会处理任何请求。 +只写了 `server_name _;` 而没有 listen 指令,Nginx 将不会知道在哪个端口上监听这个 server 块,所以 Nginx 不会启动这个 server 块,不会处理任何请求。 #### Location 块详解 @@ -275,7 +277,7 @@ location [modifier] /path/ { 首先来看 `modifier`,它是一个可选的修饰符,用于修改 location 块的匹配规则。常用的修饰符有: -* 前缀匹配 +- 前缀匹配 前缀匹配是 location 块的默认匹配规则,只要请求的路径以 location 块的路径开头,就会匹配成功。例如: @@ -286,11 +288,7 @@ location /example { } ``` - - - -* `=` - +- `=` 精确匹配,只有请求的路径与 location 块的路径完全相同时才匹配。 @@ -301,13 +299,12 @@ location = /example { return 200 "This is an exact match."; } ``` - -* `~` -区分大小写的正则匹配。 +- `~` +区分大小写的正则匹配。 -* `~*` +- `~*` 不区分大小写的正则匹配。 @@ -318,6 +315,7 @@ location ~ /example[0-9] { # 处理请求 /example1, /example2, ... return 200 "This is a case-sensitive regex match."; } + location ~ \.php$ { # 处理以 .php 结尾的请求 include fastcgi_params; @@ -330,11 +328,9 @@ location ~* \.(jpg|jpeg|png)$ { } ``` +- `^~` -* `^~` - - 通配符匹配,如果请求的 URI 以指定的路径开头,且该路径是最长的前缀匹配,则使用该 location 块。它优先于正则匹配。 - +通配符匹配,如果请求的 URI 以指定的路径开头,且该路径是最长的前缀匹配,则使用该 location 块。它优先于正则匹配。 ```nginx location ^~ /static/ { @@ -347,29 +343,27 @@ location ~ \.css$ { root /var/www/html/styles; } ``` -在这个例子中,如果请求的 URI 是 `/static/style.css`,则会匹配到第一个 location 块,因为它是以 `/static/` 开头的前缀匹配。即使 `/static/style.css` 也符合第二个正则匹配的条件,但由于第一个 location 块使用了 `^~`,Nginx 不会继续检查正则匹配。 - +在这个例子中,如果请求的 URI 是 `/static/style.css`,则会匹配到第一个 location 块,因为它是以 `/static/` 开头的前缀匹配。即使 `/static/style.css` 也符合第二个正则匹配的条件,但由于第一个 location 块使用了 `^~`,Nginx 不会继续检查正则匹配。 Nginx 在处理请求时会按照以下顺序匹配 location 块: 1. 精确匹配 (=)。 2. 前缀匹配(最长匹配)。 3. 通配符匹配 (^~)。 -4. 正则匹配(~ 和 ~*,按出现顺序匹配)。 - +4. 正则匹配(~ 和 ~\*,按出现顺序匹配)。 而在 Location 块中,我们可以使用一些指令来处理请求,如: -* `proxy_pass http://backend_server;`:反向代理。 -* `root /var/www/html;`:指定网站根目录。 -* `try_files $uri $uri/ =404;`:尝试查找文件,如果找不到返回 404 错误。 -* `return 200 "Hello, World!";`:返回指定的状态码和内容。 -* `include fastcgi_params;`:引入 FastCGI 参数。 +- `proxy_pass http://backend_server;`:反向代理。 +- `root /var/www/html;`:指定网站根目录。 +- `try_files $uri $uri/ =404;`:尝试查找文件,如果找不到返回 404 错误。 +- `return 200 "Hello, World!";`:返回指定的状态码和内容。 +- `include fastcgi_params;`:引入 FastCGI 参数。 #### SSL/TLS 配置 -作为 WebServer ,必不可少的功能就是支持 HTTPS。你可以在 [https://cherr.cc/ssl.html](https://cherr.cc/ssl.html) 找到 SSL/TLS 的原理解释。 +作为 WebServer,必不可少的功能就是支持 HTTPS。你可以在 [https://cherr.cc/ssl.html](https://cherr.cc/ssl.html) 找到 SSL/TLS 的原理解释。 首先,你需要为你的域名申请一个 SSL 证书。你可以使用免费的 Let's Encrypt 证书,也可以购买商业证书。 假设你的证书保存在 `/etc/ssl/certs/example.com.pem` 和 `/etc/ssl/private/example.com.pem`。 @@ -407,7 +401,6 @@ server { 注意到和前文的配置不同,这里的监听端口是 443,而且增加了 ssl 选项。 `ssl_certificate` 和 `ssl_certificate_key` 分别指定了 SSL 证书和密钥的路径。 - 在配置文件中,我们还提到了一些可选的配置,如中间证书、SSL 设置、HSTS 等。一般建议设置 `ssl_protocols TLSv1.2 TLSv1.3;` ,因为 TLSv1.0 和 TLSv1.1 已经不安全且被弃用。 HSTS 是一种安全机制,用于强制客户端(浏览器)使用 HTTPS 访问网站。 @@ -419,11 +412,12 @@ HSTS 是一种安全机制,用于强制客户端(浏览器)使用 HTTPS 反向代理是 Nginx 的一个重要功能,可以用于隐藏后端服务器的真实 IP 地址,提高安全性。也可以将开在不同端口的服务统一到一个端口上。 -比如 alist 默认端口是 5244 ,komga 默认端口是 25600 ,jellyfin 默认端口是 8096 ,grafana 的默认端口是 3000,你可以通过反向代理将它们统一到 80 或 443 端口上。使用如下的域名区分不同的服务。 -* alist.cherr.cc -> 5244 -* komga.cherr.cc -> 25600 -* jellyfin.cherr.cc -> 8096 -* grafana.cherr.cc -> 3000 +比如 alist 默认端口是 5244,komga 默认端口是 25600,jellyfin 默认端口是 8096,grafana 的默认端口是 3000,你可以通过反向代理将它们统一到 80 或 443 端口上。使用如下的域名区分不同的服务。 + +- alist.cherr.cc -> 5244 +- komga.cherr.cc -> 25600 +- jellyfin.cherr.cc -> 8096 +- grafana.cherr.cc -> 3000 比如上面的例子,就可以通过下面的配置实现反向代理: @@ -460,46 +454,45 @@ server { 但是这只是最简单的反向代理配置,实际情况下往往还需要根据不同的服务做一些特殊的配置,可以通过两个狠狠坑过我的例子来学习。 -* alist 反向代理非标准端口或启用https后丢失https或端口号/无法播放视频 +- alist 反向代理非标准端口或启用 https 后丢失 https 或端口号/无法播放视频 -https://alist.nn.ci/zh/guide/install/reverse-proxy.html +参考: 问题就在于反代时需要正确的 Host 头,添加设置 `proxy_set_header Host $host;`,否则会导致反代失败。 ```nginx location / { - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_set_header Host $http_host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header Range $http_range; - proxy_set_header If-Range $http_if_range; - proxy_redirect off; - proxy_pass http://127.0.0.1:5244; - # the max size of file to upload - client_max_body_size 20000m; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Host $http_host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header Range $http_range; + proxy_set_header If-Range $http_if_range; + proxy_redirect off; + proxy_pass http://127.0.0.1:5244; + # the max size of file to upload + client_max_body_size 20000m; } ``` +- Grafana 需要 websocket 反代支持 -* Grafana 需要 websocket 反代支持 - -https://grafana.com/tutorials/run-grafana-behind-a-proxy/ +参考: 关键在于 Grafana 加载数据时使用了 websocket,需要指示 Nginx 支持 websocket 反代。 ```nginx map $http_upgrade $connection_upgrade { - default upgrade; - '' close; + default upgrade; + '' close; } # Proxy Grafana Live WebSocket connections. location /api/live/ { -proxy_http_version 1.1; -proxy_set_header Upgrade $http_upgrade; -proxy_set_header Connection $connection_upgrade; -proxy_set_header Host $host; -proxy_pass http://grafana; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + proxy_set_header Host $host; + proxy_pass http://grafana; } ``` @@ -543,11 +536,12 @@ http { } ``` -* 负载均衡算法 +- 负载均衡算法 Nginx 支持多种负载均衡算法,默认是轮询(round-robin)。你可以通过在 upstream 块中指定不同的算法来更改负载均衡策略,例如: 最少连接: + ```nginx upstream backend { least_conn; # 使用最少连接算法 @@ -555,11 +549,13 @@ upstream backend { server backend2.example.com; } ``` + IP 哈希: + ```nginx upstream backend { ip_hash; # 使用 IP 哈希算法 server backend1.example.com; server backend2.example.com; } -``` \ No newline at end of file +``` diff --git a/includes/authors.md b/includes/authors.md index d6da38614..c492dba11 100644 --- a/includes/authors.md +++ b/includes/authors.md @@ -17,3 +17,4 @@ [Integral-Tech]: https://github.com/Integral-Tech [stevapple]: https://github.com/stevapple [yuanyiwei]: https://github.com/yuanyiwei +[Cherrling]: https://cherr.cc diff --git a/mkdocs.yml b/mkdocs.yml index c47bf58a1..30f23523a 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -96,7 +96,7 @@ nav: - 网络服务实践: - ops/network-service/index.md - 隧道组网: ops/network-service/intranet.md - - Nginx: ops/network-service/nginx.md + - Nginx 网页服务器: ops/network-service/nginx.md - 数据库: ops/database.md - 问题调试: ops/debug.md - 虚拟化技术: From 6565c46105a9c6a6e78c378aa5205573604a58c2 Mon Sep 17 00:00:00 2001 From: Cherrling Date: Thu, 2 Jan 2025 04:50:50 +0800 Subject: [PATCH 05/12] =?UTF-8?q?nginx=E4=BF=AE=E4=BA=86=E4=B8=80=E5=8D=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/ops/network-service/nginx.md | 69 +++++++++++++++++++------------ 1 file changed, 43 insertions(+), 26 deletions(-) diff --git a/docs/ops/network-service/nginx.md b/docs/ops/network-service/nginx.md index 6f428393e..1631df38d 100644 --- a/docs/ops/network-service/nginx.md +++ b/docs/ops/network-service/nginx.md @@ -8,7 +8,7 @@ Nginx 是一个高性能的 HTTP 和反向代理服务器,它可以作为一个独立的 Web 服务器,也可以作为其他 Web 服务器的反向代理服务器。 -如果你只是需要简单快速的拉起一个网站,或许也可以试试 Caddy,它是一个更加简单的 Web 服务器。 +如果你只是需要简单快速的拉起一个网站,或许也可以试试 [Caddy](https://201.ustclug.org/advanced/caddy/),它是一个更加简单的 Web 服务器。 ## 安装 @@ -29,40 +29,61 @@ sudo systemctl status nginx # 查看 Nginx 状态 ``` 常用命令: - ```bash sudo nginx -t # 检查配置文件是否正确 sudo nginx -s reload # 不停机重新加载配置文件 sudo systemctl reload nginx # 不停机重新加载配置文件 sudo nginx -s stop # 停止 Nginx -sudo nginx -s quit # 安全停止 Nginx (完成当前请求后停止) +sudo nginx -s quit # 安全停止 Nginx(完成当前请求后停止) ``` + ## 配置 ### 配置文件在哪 +**对于 Debian & Ubuntu 系来说** + +nginx.conf: +```nginx +http { + … + include /etc/nginx/conf.d/*.conf; + include /etc/nginx/sites-enabled/*; +} +``` + 配置 Nginx 主要涉及到三个目录,分别是 `/etc/nginx/nginx.conf`、`/etc/nginx/sites-available` 和 `/etc/nginx/sites-enabled`。 -- `nginx.conf` 是 Nginx 的主配置文件,它包含了 Nginx 的全局配置。 -- `sites-available` 目录下存放的是所有的站点配置文件。 -- `sites-enabled` 目录下存放的是启用的站点配置文件的符号链接。 +* `nginx.conf` 是 Nginx 的主配置文件,它包含了 Nginx 的全局配置。 +* `sites-available` 目录下存放的是所有的站点配置文件。 +* `sites-enabled` 目录下存放的是启用的站点配置文件的符号链接。 -一般情况下,我们不直接修改 `nginx.conf` 文件,而是在 `sites-available` 目录下创建一个新的配置文件,然后在 `sites-enabled` 目录下创建一个符号链接。 +一般情况下,我们不在 `nginx.conf` 文件中直接编写站点信息(`http` 块),而是在 `sites-available` 目录下创建一个新的配置文件,然后在 `sites-enabled` 目录下创建一个符号链接。 如果要暂时下线某个站点,只需要删除 `sites-enabled` 目录下的符号链接即可,而不需要删除配置文件。 -在一些较老版本的 Nginx 中,`sites-available` 和 `sites-enabled` 目录可能不存在,你可以在 `conf.d` 目录中新建 `*.conf` 文件来存放站点配置。 -一般情况下,`nginx.conf` 文件中会用 `include` 指令引入 `sites-enabled` 和 `conf.d` 目录下的配置文件。 +从 NGINX 的角度来看,唯一的区别在于来自 `conf.d` 的文件能够更早被处理,因此,如果您有相互冲突的配置,那么来自 `conf.d` 的配置会优先于 `sites-enabled` 中的配置。 + +**对于其他发行版和官方源来说** + +nginx 官方上游包的 /etc/nginx/nginx.conf: +```nginx +http { + … + include /etc/nginx/conf.d/*.conf; +} +``` + +并没有`/etc/nginx/sites-available` 和 `/etc/nginx/sites-enabled`这两个目录,你需要将你编写的配置文件放置于 `/etc/nginx/conf.d` 目录下,但当你需要禁用某些内容时,必须将其移出文件夹、删除或进行更改。当然,你也可以自己创建 `sites-available` 和 `sites-enabled` 目录,然后在 `nginx.conf` 中引入。 + +所以其实 Debian & Ubuntu 系的配置文件中关于 `sites-*` 文件夹的抽象使事情更有条理,并允许你通过单独的脚本来管理它们。 + +关于两者的区别,你可以查看[这篇文章](https://serverfault.com/questions/527630/difference-in-sites-available-vs-sites-enabled-vs-conf-d-directories-nginx)。 -> ```nginx -> # nginx.conf -> include /etc/nginx/conf.d/*.conf; -> include /etc/nginx/sites-enabled/*; -> ``` ### 我该如何编辑? -编辑默认站点配置文件: +编辑默认站点配置文件 ```bash sudo vim /etc/nginx/sites-available/default @@ -130,6 +151,9 @@ sudo nginx -s reload sudo systemctl reload nginx ``` +需要注意的是,如果没有检查配置,并且配置中存在错误,`nginx -s reload` 会让 nginx 停止,而 `systemctl reload nginx` 不会,并且不会采用新的配置文件。 + + ## 进阶教程 ### Nginx 名词扫盲 @@ -141,7 +165,6 @@ sudo systemctl reload nginx Nginx 的配置文件中可以有多个 server 块,每个 server 块定义了一个站点(虚拟主机),Nginx 会根据请求的域名和端口号来匹配对应的 server 块。 Nginx 正是通过 server 块来实现多站点配置的。 一个典型的 server 块: - ```nginx server { listen 80; # 监听的端口 @@ -175,9 +198,9 @@ location [modifier] /path/ { 一个十分巧妙的负载均衡算法是一致性哈希算法,它可以保证在服务器数量变化时,尽可能少地改变已有的映射关系。推荐阅读:[一致性哈希算法](https://zh.wikipedia.org/wiki/%E4%B8%80%E8%87%B4%E5%93%88%E5%B8%8C)。 -#### SSL/TLS +#### TLS -SSL/TLS 是一种加密通信协议,用于保护客户端和服务器之间的通信安全。Nginx 支持 SSL/TLS 协议,可以用来配置 HTTPS 站点。 +TLS 是一种加密通信协议,用于保护客户端和服务器之间的通信安全。Nginx 支持 TLS 协议,可以用来配置 HTTPS 站点。 一般的 http 监听端口是 80,https 监听端口是 443。 @@ -210,7 +233,6 @@ server { try_files $uri $uri/ =404; } } - server { listen 80; # 监听的端口 server_name example.org www.example.org; # 指定的域名 @@ -218,8 +240,6 @@ server { location / { try_files $uri $uri/ =404; } -} - server { listen 80 default_server; # 默认站点 server_name _; # 默认域名 @@ -229,9 +249,8 @@ server { } } ``` - -注意到除了指定的域名外,还有一个 `_`,它表示默认域名。如果请求的域名不在 `server_name` 中,Nginx 会使用 `*` 对应的 server 块来处理请求。 -那 `default_server` 又是什么意思呢?它表示默认站点,当请求的域名不在 `server_name` 中时,Nginx 会使用 `default_server` 对应的 server 块来处理请求。 +注意到除了指定的域名外,还有一个 `_`,它表示默认域名。如果请求的域名不在 server_name 中,Nginx 会使用 `_` 对应的 server 块来处理请求。 +那 `default_server` 又是什么意思呢?它表示默认站点,当请求的域名不在 server_name 中时,Nginx 会使用 `default_server` 对应的 server 块来处理请求。 一般建议为 Nginx 配置一个默认站点,用于处理未知域名的请求。 但是要注意的是,如果你只写了 `listen 80 default_server;`,比如: @@ -315,7 +334,6 @@ location ~ /example[0-9] { # 处理请求 /example1, /example2, ... return 200 "This is a case-sensitive regex match."; } - location ~ \.php$ { # 处理以 .php 结尾的请求 include fastcgi_params; @@ -541,7 +559,6 @@ http { Nginx 支持多种负载均衡算法,默认是轮询(round-robin)。你可以通过在 upstream 块中指定不同的算法来更改负载均衡策略,例如: 最少连接: - ```nginx upstream backend { least_conn; # 使用最少连接算法 From 96777efc9c9dcf96271e27810aa6bb934808761f Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Thu, 25 Sep 2025 08:58:06 +0000 Subject: [PATCH 06/12] [autofix.ci] apply automated fixes --- docs/ops/network-service/nginx.md | 49 ++++++++++++++++--------------- 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/docs/ops/network-service/nginx.md b/docs/ops/network-service/nginx.md index d595b6c2d..6ed55e0c5 100644 --- a/docs/ops/network-service/nginx.md +++ b/docs/ops/network-service/nginx.md @@ -33,6 +33,7 @@ sudo systemctl status nginx # 查看 Nginx 状态 ``` 常用命令: + ```bash sudo nginx -t # 检查配置文件是否正确 sudo nginx -s reload # 不停机重新加载配置文件 @@ -41,7 +42,6 @@ sudo nginx -s stop # 停止 Nginx sudo nginx -s quit # 安全停止 Nginx(完成当前请求后停止) ``` - ## 配置 ### 配置文件在哪 @@ -49,6 +49,7 @@ sudo nginx -s quit # 安全停止 Nginx(完成当前请求后停止) **对于 Debian & Ubuntu 系来说** nginx.conf: + ```nginx http { … @@ -71,6 +72,7 @@ http { **对于其他发行版和官方源来说** nginx 官方上游包的 /etc/nginx/nginx.conf: + ```nginx http { … @@ -84,7 +86,6 @@ http { 关于两者的区别,你可以查看[这篇文章](https://serverfault.com/questions/527630/difference-in-sites-available-vs-sites-enabled-vs-conf-d-directories-nginx)。 - ### 我该如何编辑? 编辑默认站点配置文件 @@ -157,7 +158,6 @@ sudo systemctl reload nginx 需要注意的是,如果没有检查配置,并且配置中存在错误,`nginx -s reload` 会让 nginx 停止,而 `systemctl reload nginx` 不会,并且不会采用新的配置文件。 - ## 进阶教程 ### Nginx 名词扫盲 @@ -169,6 +169,7 @@ sudo systemctl reload nginx Nginx 的配置文件中可以有多个 server 块,每个 server 块定义了一个站点(虚拟主机),Nginx 会根据请求的域名和端口号来匹配对应的 server 块。 Nginx 正是通过 server 块来实现多站点配置的。 一个典型的 server 块: + ```nginx server { listen 80; # 监听的端口 @@ -222,11 +223,11 @@ Nginx 的一个十分炫酷的功能就是可以实现一台主机上运行多 那么如何实现呢?答案就是 server 块中的 server_name 指令。server_name 指令用于定义服务器的名称,可以是域名、IP 地址、通配符等。我们来看一个典型的示例: -- 对于请求 `example.com` 和 `www.example.com`,Nginx 会使用第一个 server 块来处理请求,对应的网站根目录是 `/var/www/example.com`。 +* 对于请求 `example.com` 和 `www.example.com`,Nginx 会使用第一个 server 块来处理请求,对应的网站根目录是 `/var/www/example.com`。 -- 对于请求 `example.org` 和 `www.example.org`,Nginx 会使用第二个 server 块来处理请求。对应的网站根目录是 `/var/www/example.org`。 +* 对于请求 `example.org` 和 `www.example.org`,Nginx 会使用第二个 server 块来处理请求。对应的网站根目录是 `/var/www/example.org`。 -- 对于其他请求,Nginx 会返回 404 错误。 +* 对于其他请求,Nginx 会返回 404 错误。 ```nginx server { @@ -253,6 +254,7 @@ server { } } ``` + 注意到除了指定的域名外,还有一个 `_`,它表示默认域名。如果请求的域名不在 server_name 中,Nginx 会使用 `_` 对应的 server 块来处理请求。 那 `default_server` 又是什么意思呢?它表示默认站点,当请求的域名不在 server_name 中时,Nginx 会使用 `default_server` 对应的 server 块来处理请求。 一般建议为 Nginx 配置一个默认站点,用于处理未知域名的请求。 @@ -300,7 +302,7 @@ location [modifier] /path/ { 首先来看 `modifier`,它是一个可选的修饰符,用于修改 location 块的匹配规则。常用的修饰符有: -- 前缀匹配 +* 前缀匹配 前缀匹配是 location 块的默认匹配规则,只要请求的路径以 location 块的路径开头,就会匹配成功。例如: @@ -311,7 +313,7 @@ location /example { } ``` -- `=` +* `=` 精确匹配,只有请求的路径与 location 块的路径完全相同时才匹配。 @@ -323,11 +325,11 @@ location = /example { } ``` -- `~` +* `~` 区分大小写的正则匹配。 -- `~*` +* `~*` 不区分大小写的正则匹配。 @@ -350,7 +352,7 @@ location ~* \.(jpg|jpeg|png)$ { } ``` -- `^~` +* `^~` 通配符匹配,如果请求的 URI 以指定的路径开头,且该路径是最长的前缀匹配,则使用该 location 块。它优先于正则匹配。 @@ -377,11 +379,11 @@ Nginx 在处理请求时会按照以下顺序匹配 location 块: 而在 Location 块中,我们可以使用一些指令来处理请求,如: -- `proxy_pass http://backend_server;`:反向代理。 -- `root /var/www/html;`:指定网站根目录。 -- `try_files $uri $uri/ =404;`:尝试查找文件,如果找不到返回 404 错误。 -- `return 200 "Hello, World!";`:返回指定的状态码和内容。 -- `include fastcgi_params;`:引入 FastCGI 参数。 +* `proxy_pass http://backend_server;`:反向代理。 +* `root /var/www/html;`:指定网站根目录。 +* `try_files $uri $uri/ =404;`:尝试查找文件,如果找不到返回 404 错误。 +* `return 200 "Hello, World!";`:返回指定的状态码和内容。 +* `include fastcgi_params;`:引入 FastCGI 参数。 #### SSL/TLS 配置 @@ -436,10 +438,10 @@ HSTS 是一种安全机制,用于强制客户端(浏览器)使用 HTTPS 比如 alist 默认端口是 5244,komga 默认端口是 25600,jellyfin 默认端口是 8096,grafana 的默认端口是 3000,你可以通过反向代理将它们统一到 80 或 443 端口上。使用如下的域名区分不同的服务。 -- alist.cherr.cc -> 5244 -- komga.cherr.cc -> 25600 -- jellyfin.cherr.cc -> 8096 -- grafana.cherr.cc -> 3000 +* alist.cherr.cc -> 5244 +* komga.cherr.cc -> 25600 +* jellyfin.cherr.cc -> 8096 +* grafana.cherr.cc -> 3000 比如上面的例子,就可以通过下面的配置实现反向代理: @@ -476,7 +478,7 @@ server { 但是这只是最简单的反向代理配置,实际情况下往往还需要根据不同的服务做一些特殊的配置,可以通过两个狠狠坑过我的例子来学习。 -- alist 反向代理非标准端口或启用 https 后丢失 https 或端口号/无法播放视频 +* alist 反向代理非标准端口或启用 https 后丢失 https 或端口号/无法播放视频 参考: @@ -497,7 +499,7 @@ location / { } ``` -- Grafana 需要 websocket 反代支持 +* Grafana 需要 websocket 反代支持 参考: @@ -558,11 +560,12 @@ http { } ``` -- 负载均衡算法 +* 负载均衡算法 Nginx 支持多种负载均衡算法,默认是轮询(round-robin)。你可以通过在 upstream 块中指定不同的算法来更改负载均衡策略,例如: 最少连接: + ```nginx upstream backend { least_conn; # 使用最少连接算法 From 437bd540f0d8ca494e8cedabeae568da5c87d154 Mon Sep 17 00:00:00 2001 From: Cherrling Date: Wed, 15 Oct 2025 23:30:38 +0800 Subject: [PATCH 07/12] nginx: fix typo --- docs/ops/network-service/nginx.md | 84 +++++++++++++++++++------------ 1 file changed, 51 insertions(+), 33 deletions(-) diff --git a/docs/ops/network-service/nginx.md b/docs/ops/network-service/nginx.md index 6ed55e0c5..8d58e5420 100644 --- a/docs/ops/network-service/nginx.md +++ b/docs/ops/network-service/nginx.md @@ -436,7 +436,7 @@ HSTS 是一种安全机制,用于强制客户端(浏览器)使用 HTTPS 反向代理是 Nginx 的一个重要功能,可以用于隐藏后端服务器的真实 IP 地址,提高安全性。也可以将开在不同端口的服务统一到一个端口上。 -比如 alist 默认端口是 5244,komga 默认端口是 25600,jellyfin 默认端口是 8096,grafana 的默认端口是 3000,你可以通过反向代理将它们统一到 80 或 443 端口上。使用如下的域名区分不同的服务。 +假如你开设了一个多媒体服务器,在运行的服务器软件中,alist 默认端口是 5244,komga 默认端口是 25600,jellyfin 默认端口是 8096,grafana 的默认端口是 3000,你可以通过反向代理将它们统一到 80 或 443 端口上。使用如下的域名区分不同的服务: * alist.cherr.cc -> 5244 * komga.cherr.cc -> 25600 @@ -480,45 +480,63 @@ server { * alist 反向代理非标准端口或启用 https 后丢失 https 或端口号/无法播放视频 -参考: + 参考: -问题就在于反代时需要正确的 Host 头,添加设置 `proxy_set_header Host $host;`,否则会导致反代失败。 + 问题就在于反代时需要正确的 Host 头,添加设置 `proxy_set_header Host $host;`,否则会导致反代失败。 -```nginx -location / { - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_set_header Host $http_host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header Range $http_range; - proxy_set_header If-Range $http_if_range; - proxy_redirect off; - proxy_pass http://127.0.0.1:5244; - # the max size of file to upload - client_max_body_size 20000m; -} -``` + 这里要说明一下 `$host` 和 `$http_host` 的区别: + + `$host` 是 Nginx 的一个内置变量,用于获取请求的主机名(Host)。它的值是根据以下优先级确定的: + + 1. 请求行中的主机名(HTTP/1.0) + 2. Host 请求头字段 + 3. 与请求匹配的 `server_name` + + `$host` 变量的可靠性高。如果 Host 头缺失,会使用 `server_name` 作为后备值,保证有值。同时即使请求中有端口号,`$host` 也只会返回主机名部分,不包含端口号。 + + `$http_` 是 Nginx 的一个变量前缀,用于获取任意 HTTP 请求头的值。`$http_host` 就是专门用于获取 Host 请求头的变量。它纯粹是客户端发送过来的 Host 头的副本。 + + 如果客户端请求是 GET / HTTP/1.1, 并且带了 `Host: www.example.com:8080`,那么 `$http_host` 的值就是 "www.example.com:8080"。 + + 如果客户端请求是 GET / HTTP/1.0(HTTP/1.0 没有 Host 头),那么 `$http_host` 的值就是 空。 + + 因为它可能为空,如果你在配置中直接使用它(例如 `proxy_set_header Host $http_host;`),当其为空时,转发给后端的请求的 Host 头也会是空的,这可能导致后端服务器无法正确处理请求(无法识别要访问哪个虚拟主机)。 + + ```nginx + location / { + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header Range $http_range; + proxy_set_header If-Range $http_if_range; + proxy_redirect off; + proxy_pass http://127.0.0.1:5244; + # the max size of file to upload + client_max_body_size 20000m; + } + ``` * Grafana 需要 websocket 反代支持 -参考: + 参考: -关键在于 Grafana 加载数据时使用了 websocket,需要指示 Nginx 支持 websocket 反代。 + 关键在于 Grafana 加载数据时使用了 websocket,需要指示 Nginx 支持 websocket 反代。 -```nginx -map $http_upgrade $connection_upgrade { - default upgrade; - '' close; -} -# Proxy Grafana Live WebSocket connections. -location /api/live/ { - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection $connection_upgrade; - proxy_set_header Host $host; - proxy_pass http://grafana; -} -``` + ```nginx + map $http_upgrade $connection_upgrade { + default upgrade; + '' close; + } + # Proxy Grafana Live WebSocket connections. + location /api/live/ { + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + proxy_set_header Host $host; + proxy_pass http://grafana; + } + ``` #### 负载均衡配置 From abf88d2da3b65dbf55440c472921fb9536d14e6f Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Wed, 15 Oct 2025 19:35:47 +0000 Subject: [PATCH 08/12] [autofix.ci] apply automated fixes --- docs/ops/network-service/nginx.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/ops/network-service/nginx.md b/docs/ops/network-service/nginx.md index 8d58e5420..070a18002 100644 --- a/docs/ops/network-service/nginx.md +++ b/docs/ops/network-service/nginx.md @@ -491,12 +491,12 @@ server { 1. 请求行中的主机名(HTTP/1.0) 2. Host 请求头字段 3. 与请求匹配的 `server_name` - + `$host` 变量的可靠性高。如果 Host 头缺失,会使用 `server_name` 作为后备值,保证有值。同时即使请求中有端口号,`$host` 也只会返回主机名部分,不包含端口号。 `$http_` 是 Nginx 的一个变量前缀,用于获取任意 HTTP 请求头的值。`$http_host` 就是专门用于获取 Host 请求头的变量。它纯粹是客户端发送过来的 Host 头的副本。 - 如果客户端请求是 GET / HTTP/1.1, 并且带了 `Host: www.example.com:8080`,那么 `$http_host` 的值就是 "www.example.com:8080"。 + 如果客户端请求是 GET / HTTP/1.1,并且带了 `Host: www.example.com:8080`,那么 `$http_host` 的值就是 "www.example.com:8080"。 如果客户端请求是 GET / HTTP/1.0(HTTP/1.0 没有 Host 头),那么 `$http_host` 的值就是 空。 From 4b37a38ad4590239245f0b5ab3ebda35031a1bca Mon Sep 17 00:00:00 2001 From: taoky Date: Thu, 16 Oct 2025 04:34:41 +0800 Subject: [PATCH 09/12] ops/network-service: Nginx style fix --- docs/ops/network-service/nginx.md | 95 ++++++++++++++----------------- mkdocs.yml | 2 +- 2 files changed, 43 insertions(+), 54 deletions(-) diff --git a/docs/ops/network-service/nginx.md b/docs/ops/network-service/nginx.md index 070a18002..b36263919 100644 --- a/docs/ops/network-service/nginx.md +++ b/docs/ops/network-service/nginx.md @@ -2,35 +2,27 @@ icon: simple/nginx --- -1# Nginx 网页服务器 +# Nginx 网页服务器 !!! note "主要作者" [@Cherrling][Cherrling] -**_WebServer 不能失去 Nginx,就如同西方不能失去耶路撒冷_** +> WebServer 不能失去 Nginx,就如同西方不能失去耶路撒冷 +> +> —— [@Cherrling][Cherrling] Nginx 是一个高性能的 HTTP 和反向代理服务器,它可以作为一个独立的 Web 服务器,也可以作为其他 Web 服务器的反向代理服务器。 -如果你只是需要简单快速的拉起一个网站,或许也可以试试 [Caddy](https://201.ustclug.org/advanced/caddy/),它是一个更加简单的 Web 服务器。 +如果你只是需要简单快速的拉起一个网站,或许也可以试试 [Caddy](../../advanced/caddy.md),它是一个更加简单的 Web 服务器。 ## 安装 -你可以直接从 Debian 官方源安装 Nginx: +Nginx 可以直接从 Debian 官方源安装。如果有特殊的需求,也有其他的选择: -```bash -sudo apt update -sudo apt install nginx -y -sudo nginx -v # 查看 Nginx 版本 -``` - -如果你需要的话,设置开机自启: - -```bash -sudo systemctl enable nginx # 设置开机自启 -sudo systemctl start nginx # 启动 Nginx -sudo systemctl status nginx # 查看 Nginx 状态 -``` +- [Nginx.org 官方源](https://nginx.org/en/linux_packages.html#Debian) 提供了最新主线和稳定版本的 Nginx。 +- [n.wtf](https://n.wtf/) 提供了最新的 Nginx,并内置了 Brotli、QUIC(HTTP/3)等支持。 +- [OpenResty](https://openresty.org/en/linux-packages.html) 提供了基于 Nginx 的高性能 Web 平台,内置了 LuaJIT 支持。用户可以编写 Lua 脚本来扩展 Nginx 的功能。 常用命令: @@ -44,15 +36,13 @@ sudo nginx -s quit # 安全停止 Nginx(完成当前请求后停止) ## 配置 -### 配置文件在哪 +### 配置文件结构简介 -**对于 Debian & Ubuntu 系来说** - -nginx.conf: +对于 Debian & Ubuntu 来说,nginx.conf 的内容一般包含: ```nginx http { - … + # ... include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; } @@ -60,41 +50,32 @@ http { 配置 Nginx 主要涉及到三个目录,分别是 `/etc/nginx/nginx.conf`、`/etc/nginx/sites-available` 和 `/etc/nginx/sites-enabled`。 -* `nginx.conf` 是 Nginx 的主配置文件,它包含了 Nginx 的全局配置。 -* `sites-available` 目录下存放的是所有的站点配置文件。 -* `sites-enabled` 目录下存放的是启用的站点配置文件的符号链接。 - -一般情况下,我们不在 `nginx.conf` 文件中直接编写站点信息(`http` 块),而是在 `sites-available` 目录下创建一个新的配置文件,然后在 `sites-enabled` 目录下创建一个符号链接。 -如果要暂时下线某个站点,只需要删除 `sites-enabled` 目录下的符号链接即可,而不需要删除配置文件。 - -从 NGINX 的角度来看,唯一的区别在于来自 `conf.d` 的文件能够更早被处理,因此,如果您有相互冲突的配置,那么来自 `conf.d` 的配置会优先于 `sites-enabled` 中的配置。 +- `nginx.conf` 是 Nginx 的主配置文件,它包含了 Nginx 的全局配置。 +- `sites-available` 目录下存放的是所有的站点配置文件。 +- `sites-enabled` 目录下存放的是启用的站点配置文件的符号链接。 -**对于其他发行版和官方源来说** +一般情况下,我们不在 `nginx.conf` 文件中直接编写站点信息(`http` 块),而是在 `sites-available` 目录下创建一个新的配置文件,然后在 `sites-enabled` 目录下创建一个符号链接。如果要暂时下线某个站点,只需要删除 `sites-enabled` 目录下的符号链接即可,而不需要删除配置文件。 -nginx 官方上游包的 /etc/nginx/nginx.conf: - -```nginx -http { - … - include /etc/nginx/conf.d/*.conf; -} -``` +从 Nginx 的角度来看,唯一的区别在于来自 `conf.d` 的文件能够更早被处理,因此,如果你有相互冲突的配置,那么来自 `conf.d` 的配置会优先于 `sites-enabled` 中的配置。 -并没有`/etc/nginx/sites-available` 和 `/etc/nginx/sites-enabled`这两个目录,你需要将你编写的配置文件放置于 `/etc/nginx/conf.d` 目录下,但当你需要禁用某些内容时,必须将其移出文件夹、删除或进行更改。当然,你也可以自己创建 `sites-available` 和 `sites-enabled` 目录,然后在 `nginx.conf` 中引入。 +!!! note "其他发行版和 Nginx 官方的配置" -所以其实 Debian & Ubuntu 系的配置文件中关于 `sites-*` 文件夹的抽象使事情更有条理,并允许你通过单独的脚本来管理它们。 + 对于其他发行版和官方源来说,配置中则不包含 `sites-available` 和 `sites-enabled`,而是只会 `include` `conf.d` 目录: -关于两者的区别,你可以查看[这篇文章](https://serverfault.com/questions/527630/difference-in-sites-available-vs-sites-enabled-vs-conf-d-directories-nginx)。 + ```nginx + http { + # ... + include /etc/nginx/conf.d/*.conf; + } + ``` -### 我该如何编辑? + 此时,你需要将你编写的配置文件放置于 `/etc/nginx/conf.d` 目录下,但当你需要禁用某些内容时,必须将其移出文件夹、删除或进行更改。当然,你也可以自己创建 `sites-available` 和 `sites-enabled` 目录,然后在 `nginx.conf` 中引入。 -编辑默认站点配置文件 + 关于两者的区别,你可以查看[这篇文章](https://serverfault.com/questions/527630/difference-in-sites-available-vs-sites-enabled-vs-conf-d-directories-nginx)。 -```bash -sudo vim /etc/nginx/sites-available/default -``` +### 编辑站点配置 -一般来说,默认的站点配置长得像这样: +默认的站点配置文件在 `/etc/nginx/sites-available/default`,你可以直接编辑它——以下为去除了所有注释的默认版本: ```nginx server { @@ -112,10 +93,18 @@ server { } ``` -这个配置文件中定义了一个监听 80 端口的站点,根目录是 `/var/www/html`,默认的首页文件是 `index.html`、`index.htm` 和 `index.nginx-debian.html`。 -这时你可以在 `/var/www/html` 目录下放置你自己的网站文件,然后访问 `http://localhost` 就可以看到你的网站了。 +这个配置文件中定义了一个完整的 `server` 块。一个 `server` 块定义了一个站点(虚拟主机),Nginx 会根据请求的域名和端口号来匹配对应的 `server` 块。`server` 块中的指令如下: + +- `listen`:该默认站点在所有的 IPv4 和 IPv6 上监听 80 端口。 +- `root`:根目录是 `/var/www/html`。 +- `index`:在处理 URL 结尾为 `/` 的请求时,使用的默认的首页文件是 `index.html`、`index.htm` 和 `index.nginx-debian.html`;Nginx 会按顺序查找这些文件,找到第一个存在的文件后返回给客户端。 +- `server_name`:默认的服务器名称是 `_`,表示匹配所有未被其他 server 块匹配的请求。 +- `location /`:处理所有以 `/` 开头的请求。 + - `try_files $uri $uri/ =404;`:尝试按顺序查找请求的文件 `$uri`(请求的路径),如果找不到则尝试查找目录 `$uri/`,如果仍然找不到则返回 404 错误。 + +这时你可以在 `/var/www/html` 目录下放置你自己的 HTML、CSS、JS 等文件,然后访问 `http://localhost` 就可以看到你的网站了。 -如果你需要反向代理,可以参考下面的配置: +反向代理是代表服务器接收客户端请求、转发到后端、再返回结果的一层中间代理。一种常见的需求是让 Nginx 作为其他后端服务的反向代理。可以参考下面的配置: ```nginx server { @@ -132,9 +121,9 @@ server { } ``` -这时访问 `http://localhost` 就会被转发到 `http://backend_server:port`。对外网来说,Nginx 就是一个反向代理站点。 +这时访问 `http://localhost` 就会被转发到 `http://backend_server:port`。对外部网络来说,Nginx 就是一个反向代理站点。 -### 别忘了重启 +### 重新加载配置 修改配置文件后,别忘了重新加载 Nginx 配置,否则修改不会生效。 diff --git a/mkdocs.yml b/mkdocs.yml index 78f17589d..8e5726af7 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -117,7 +117,7 @@ nav: - ops/network-service/index.md - 网络时间同步: ops/network-service/ntp.md - 隧道组网: ops/network-service/intranet.md - - Nginx: ops/network-service/nginx.md + - Nginx 网页服务器: ops/network-service/nginx.md - Zeroconf: ops/network-service/zeroconf.md - 数据库: - ops/database/index.md From 313f29a10c42a73af65727af48334510bde6d7de Mon Sep 17 00:00:00 2001 From: taoky Date: Thu, 16 Oct 2025 04:37:57 +0800 Subject: [PATCH 10/12] ops/network-service: markdownlint-cli2 fix --- docs/ops/network-service/nginx.md | 42 +++++++++++++++---------------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/docs/ops/network-service/nginx.md b/docs/ops/network-service/nginx.md index b36263919..9b5d3949f 100644 --- a/docs/ops/network-service/nginx.md +++ b/docs/ops/network-service/nginx.md @@ -212,11 +212,9 @@ Nginx 的一个十分炫酷的功能就是可以实现一台主机上运行多 那么如何实现呢?答案就是 server 块中的 server_name 指令。server_name 指令用于定义服务器的名称,可以是域名、IP 地址、通配符等。我们来看一个典型的示例: -* 对于请求 `example.com` 和 `www.example.com`,Nginx 会使用第一个 server 块来处理请求,对应的网站根目录是 `/var/www/example.com`。 - -* 对于请求 `example.org` 和 `www.example.org`,Nginx 会使用第二个 server 块来处理请求。对应的网站根目录是 `/var/www/example.org`。 - -* 对于其他请求,Nginx 会返回 404 错误。 +- 对于请求 `example.com` 和 `www.example.com`,Nginx 会使用第一个 server 块来处理请求,对应的网站根目录是 `/var/www/example.com`。 +- 对于请求 `example.org` 和 `www.example.org`,Nginx 会使用第二个 server 块来处理请求。对应的网站根目录是 `/var/www/example.org`。 +- 对于其他请求,Nginx 会返回 404 错误。 ```nginx server { @@ -291,7 +289,7 @@ location [modifier] /path/ { 首先来看 `modifier`,它是一个可选的修饰符,用于修改 location 块的匹配规则。常用的修饰符有: -* 前缀匹配 +- 前缀匹配 前缀匹配是 location 块的默认匹配规则,只要请求的路径以 location 块的路径开头,就会匹配成功。例如: @@ -302,7 +300,7 @@ location /example { } ``` -* `=` +- `=` 精确匹配,只有请求的路径与 location 块的路径完全相同时才匹配。 @@ -314,11 +312,11 @@ location = /example { } ``` -* `~` +- `~` 区分大小写的正则匹配。 -* `~*` +- `~*` 不区分大小写的正则匹配。 @@ -341,7 +339,7 @@ location ~* \.(jpg|jpeg|png)$ { } ``` -* `^~` +- `^~` 通配符匹配,如果请求的 URI 以指定的路径开头,且该路径是最长的前缀匹配,则使用该 location 块。它优先于正则匹配。 @@ -368,11 +366,11 @@ Nginx 在处理请求时会按照以下顺序匹配 location 块: 而在 Location 块中,我们可以使用一些指令来处理请求,如: -* `proxy_pass http://backend_server;`:反向代理。 -* `root /var/www/html;`:指定网站根目录。 -* `try_files $uri $uri/ =404;`:尝试查找文件,如果找不到返回 404 错误。 -* `return 200 "Hello, World!";`:返回指定的状态码和内容。 -* `include fastcgi_params;`:引入 FastCGI 参数。 +- `proxy_pass http://backend_server;`:反向代理。 +- `root /var/www/html;`:指定网站根目录。 +- `try_files $uri $uri/ =404;`:尝试查找文件,如果找不到返回 404 错误。 +- `return 200 "Hello, World!";`:返回指定的状态码和内容。 +- `include fastcgi_params;`:引入 FastCGI 参数。 #### SSL/TLS 配置 @@ -427,10 +425,10 @@ HSTS 是一种安全机制,用于强制客户端(浏览器)使用 HTTPS 假如你开设了一个多媒体服务器,在运行的服务器软件中,alist 默认端口是 5244,komga 默认端口是 25600,jellyfin 默认端口是 8096,grafana 的默认端口是 3000,你可以通过反向代理将它们统一到 80 或 443 端口上。使用如下的域名区分不同的服务: -* alist.cherr.cc -> 5244 -* komga.cherr.cc -> 25600 -* jellyfin.cherr.cc -> 8096 -* grafana.cherr.cc -> 3000 +- alist.cherr.cc -> 5244 +- komga.cherr.cc -> 25600 +- jellyfin.cherr.cc -> 8096 +- grafana.cherr.cc -> 3000 比如上面的例子,就可以通过下面的配置实现反向代理: @@ -467,7 +465,7 @@ server { 但是这只是最简单的反向代理配置,实际情况下往往还需要根据不同的服务做一些特殊的配置,可以通过两个狠狠坑过我的例子来学习。 -* alist 反向代理非标准端口或启用 https 后丢失 https 或端口号/无法播放视频 +- alist 反向代理非标准端口或启用 https 后丢失 https 或端口号/无法播放视频 参考: @@ -506,7 +504,7 @@ server { } ``` -* Grafana 需要 websocket 反代支持 +- Grafana 需要 websocket 反代支持 参考: @@ -567,7 +565,7 @@ http { } ``` -* 负载均衡算法 +- 负载均衡算法 Nginx 支持多种负载均衡算法,默认是轮询(round-robin)。你可以通过在 upstream 块中指定不同的算法来更改负载均衡策略,例如: From b9fb4de9d52132abfc8b6b7c42e36d94304475bd Mon Sep 17 00:00:00 2001 From: taoky Date: Sat, 18 Oct 2025 04:05:42 +0800 Subject: [PATCH 11/12] ops/network-service: Note about X- HTTP headers --- docs/ops/network-service/nginx.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/ops/network-service/nginx.md b/docs/ops/network-service/nginx.md index 9b5d3949f..c388c6bcc 100644 --- a/docs/ops/network-service/nginx.md +++ b/docs/ops/network-service/nginx.md @@ -121,6 +121,10 @@ server { } ``` +!!! note "约定俗成的 HTTP 请求头" + + 以上配置中除了 `Host` 是 HTTP/1.1 标准的请求头以外,其他以 `X-` 开头的请求头都是约定俗成的非标准请求头,用于让反向代理(Nginx)传递请求用户的真实 IP 地址和请求协议等信息,否则后端服务只能看到反代本身的 IP 信息。需要注意的是,如果后端服务器没有经过反向代理,或者反向代理配置不正确,那么用户可能会伪造这些请求头,如果此时后端服务错误地信任了这些请求头,就会导致安全问题。 + 这时访问 `http://localhost` 就会被转发到 `http://backend_server:port`。对外部网络来说,Nginx 就是一个反向代理站点。 ### 重新加载配置 From d4864a0a2f5ef74391fa9d5485eda337f058da29 Mon Sep 17 00:00:00 2001 From: iBug Date: Sat, 18 Oct 2025 15:11:35 +0800 Subject: [PATCH 12/12] Fix typesetting and server_name errors --- docs/ops/network-service/nginx.md | 228 ++++++++++++++---------------- 1 file changed, 104 insertions(+), 124 deletions(-) diff --git a/docs/ops/network-service/nginx.md b/docs/ops/network-service/nginx.md index c388c6bcc..70b16fd7b 100644 --- a/docs/ops/network-service/nginx.md +++ b/docs/ops/network-service/nginx.md @@ -8,7 +8,7 @@ icon: simple/nginx [@Cherrling][Cherrling] -> WebServer 不能失去 Nginx,就如同西方不能失去耶路撒冷 +> Web server 不能失去 Nginx,就如同西方不能失去耶路撒冷 > > —— [@Cherrling][Cherrling] @@ -16,29 +16,42 @@ Nginx 是一个高性能的 HTTP 和反向代理服务器,它可以作为一 如果你只是需要简单快速的拉起一个网站,或许也可以试试 [Caddy](../../advanced/caddy.md),它是一个更加简单的 Web 服务器。 -## 安装 +## 安装 {#install} -Nginx 可以直接从 Debian 官方源安装。如果有特殊的需求,也有其他的选择: +Nginx 可以直接从 Debian APT 源安装。 -- [Nginx.org 官方源](https://nginx.org/en/linux_packages.html#Debian) 提供了最新主线和稳定版本的 Nginx。 +```bash +sudo apt update +sudo apt install nginx +``` + +如果有特殊的需求,也有其他的选择: + +- [Nginx.org 源](https://nginx.org/en/linux_packages.html#Debian) 提供了最新主线和稳定版本的 Nginx。 - [n.wtf](https://n.wtf/) 提供了最新的 Nginx,并内置了 Brotli、QUIC(HTTP/3)等支持。 - [OpenResty](https://openresty.org/en/linux-packages.html) 提供了基于 Nginx 的高性能 Web 平台,内置了 LuaJIT 支持。用户可以编写 Lua 脚本来扩展 Nginx 的功能。 -常用命令: +管理 Nginx 的常用命令: ```bash sudo nginx -t # 检查配置文件是否正确 sudo nginx -s reload # 不停机重新加载配置文件 -sudo systemctl reload nginx # 不停机重新加载配置文件 sudo nginx -s stop # 停止 Nginx sudo nginx -s quit # 安全停止 Nginx(完成当前请求后停止) ``` -## 配置 +对于使用 systemd 管理 Nginx 服务的系统,可以使用: + +```bash +sudo systemctl reload nginx # 重新加载配置文件 +sudo systemctl stop nginx # 安全停止 Nginx +``` + +## 配置 {#configuration} ### 配置文件结构简介 -对于 Debian & Ubuntu 来说,nginx.conf 的内容一般包含: +对于 Debian & Ubuntu 来说,`nginx.conf` 的内容一般包含: ```nginx http { @@ -98,7 +111,7 @@ server { - `listen`:该默认站点在所有的 IPv4 和 IPv6 上监听 80 端口。 - `root`:根目录是 `/var/www/html`。 - `index`:在处理 URL 结尾为 `/` 的请求时,使用的默认的首页文件是 `index.html`、`index.htm` 和 `index.nginx-debian.html`;Nginx 会按顺序查找这些文件,找到第一个存在的文件后返回给客户端。 -- `server_name`:默认的服务器名称是 `_`,表示匹配所有未被其他 server 块匹配的请求。 +- `server_name`:一个约定俗成的“默认服务器”名称 `_`。 - `location /`:处理所有以 `/` 开头的请求。 - `try_files $uri $uri/ =404;`:尝试按顺序查找请求的文件 `$uri`(请求的路径),如果找不到则尝试查找目录 `$uri/`,如果仍然找不到则返回 404 错误。 @@ -149,15 +162,13 @@ sudo nginx -s reload sudo systemctl reload nginx ``` -需要注意的是,如果没有检查配置,并且配置中存在错误,`nginx -s reload` 会让 nginx 停止,而 `systemctl reload nginx` 不会,并且不会采用新的配置文件。 - -## 进阶教程 +需要注意的是,如果配置文件中存在错误,`nginx -s reload` 会报出错误,然后 Nginx 会以旧的配置文件继续运行。 -### Nginx 名词扫盲 +## Nginx 名词解释 在向你展示如何进阶配置 Nginx 之前,有一些你必须要了解的概念。 -#### server 块 +### server 块 Nginx 的配置文件中可以有多个 server 块,每个 server 块定义了一个站点(虚拟主机),Nginx 会根据请求的域名和端口号来匹配对应的 server 块。 Nginx 正是通过 server 块来实现多站点配置的。 @@ -174,7 +185,7 @@ server { } ``` -#### location 块 +### location 块 location 块嵌套于 server 块中,用于定义如何处理特定 URI 的请求。一个 server 块中可以有多个 location 块。 @@ -188,7 +199,7 @@ location [modifier] /path/ { } ``` -#### 反向代理与负载均衡 +### 反向代理与负载均衡 反向代理是指代理服务器接收客户端的请求,然后将请求转发给后端服务器,最后将后端服务器的响应返回给客户端。反代有不同协议的区分,如 HTTP 反代、TCP 反代、UDP 反代等。 @@ -196,25 +207,25 @@ location [modifier] /path/ { 一个十分巧妙的负载均衡算法是一致性哈希算法,它可以保证在服务器数量变化时,尽可能少地改变已有的映射关系。推荐阅读:[一致性哈希算法](https://zh.wikipedia.org/wiki/%E4%B8%80%E8%87%B4%E5%93%88%E5%B8%8C)。 -#### TLS +### TLS TLS 是一种加密通信协议,用于保护客户端和服务器之间的通信安全。Nginx 支持 TLS 协议,可以用来配置 HTTPS 站点。 -一般的 http 监听端口是 80,https 监听端口是 443。 +一般的 HTTP 监听端口是 80,HTTPS 监听端口是 443,这是 IANA(互联网号码分配局)为这两种协议分配的标准端口号。 -#### WebSocket +### WebSocket WebSocket 是一种全双工通信协议,用于在客户端和服务器之间建立持久连接,实现实时通信。Nginx 支持 WebSocket 协议,可以用来配置 WebSocket 服务器。 -### 示例讲解 +## 示例讲解 Nginx 主要用途可以分为固定站点和反代两类,可以通过几个例子来学习一下。 -#### 多站点配置 +### 多站点配置 Nginx 的一个十分炫酷的功能就是可以实现一台主机上运行多个网站,对不同的域名提供不同的服务。这就是所谓的虚拟主机配置。 -那么如何实现呢?答案就是 server 块中的 server_name 指令。server_name 指令用于定义服务器的名称,可以是域名、IP 地址、通配符等。我们来看一个典型的示例: +那么如何实现呢?答案就是 server 块中的 `server_name` 指令。`server_name` 指令用于定义服务器的名称,可以是域名、IP 地址、通配符等。我们来看一个典型的示例: - 对于请求 `example.com` 和 `www.example.com`,Nginx 会使用第一个 server 块来处理请求,对应的网站根目录是 `/var/www/example.com`。 - 对于请求 `example.org` 和 `www.example.org`,Nginx 会使用第二个 server 块来处理请求。对应的网站根目录是 `/var/www/example.org`。 @@ -229,6 +240,7 @@ server { try_files $uri $uri/ =404; } } + server { listen 80; # 监听的端口 server_name example.org www.example.org; # 指定的域名 @@ -236,6 +248,8 @@ server { location / { try_files $uri $uri/ =404; } +} + server { listen 80 default_server; # 默认站点 server_name _; # 默认域名 @@ -246,42 +260,12 @@ server { } ``` -注意到除了指定的域名外,还有一个 `_`,它表示默认域名。如果请求的域名不在 server_name 中,Nginx 会使用 `_` 对应的 server 块来处理请求。 那 `default_server` 又是什么意思呢?它表示默认站点,当请求的域名不在 server_name 中时,Nginx 会使用 `default_server` 对应的 server 块来处理请求。 +该站点的 server_name 指定为 `_`,是一种约定俗成的默认域名,没有特殊含义。 +对于配置了 `default_server` 的 server 块,你也可以完全不写 `server_name` 指令。 一般建议为 Nginx 配置一个默认站点,用于处理未知域名的请求。 -但是要注意的是,如果你只写了 `listen 80 default_server;`,比如: - -```nginx -server { - listen 80 default_server; - # 缺少 server_name 指令 - root /var/www/default; - location / { - try_files $uri $uri/ =404; - } -} -``` - -只写了 `listen 80 default_server;` 而没有 `server_name` 指令,Nginx 仍然会将该 server 块标记为默认服务器,但由于没有指定 `server_name`,它将会匹配所有请求的 Host 头。 -在这种情况下,任何发送到 80 端口的请求(无论 Host 头是什么)都会被这个 server 块处理,因为它是默认服务器。 - -如果只写了 `server_name _;`,比如: - -```nginx -server { - # 缺少 listen 指令 - server_name _; - root /var/www/default; - location / { - try_files $uri $uri/ =404; - } -} -``` - -只写了 `server_name _;` 而没有 listen 指令,Nginx 将不会知道在哪个端口上监听这个 server 块,所以 Nginx 不会启动这个 server 块,不会处理任何请求。 - -#### Location 块详解 +### Location 块详解 一个典型的 location 块如下: @@ -293,82 +277,82 @@ location [modifier] /path/ { 首先来看 `modifier`,它是一个可选的修饰符,用于修改 location 块的匹配规则。常用的修饰符有: -- 前缀匹配 +- 前缀匹配(无修饰符) -前缀匹配是 location 块的默认匹配规则,只要请求的路径以 location 块的路径开头,就会匹配成功。例如: + 前缀匹配是 location 块的默认匹配规则,只要请求的路径以 location 块的路径开头,就会匹配成功。例如: -```nginx -location /example { - # 处理请求 /example 和 /example/xxx - return 200 "This is a prefix match."; -} -``` + ```nginx + location /example { + # 处理请求 /example 和 /example/xxx + return 200 "This is a prefix match."; + } + ``` -- `=` +- 前缀匹配 `^~` -精确匹配,只有请求的路径与 location 块的路径完全相同时才匹配。 + 这是另一种形式的前缀匹配,匹配规则与无修饰符相同,但会阻止后续的正则匹配检查。 -```nginx -location = /example { - # 处理请求 /example - # 不处理 /example/xxx - return 200 "This is an exact match."; -} -``` + ```nginx + location ^~ /static/ { + # 处理以 /static/ 开头的请求 + root /var/www/html/static; + } -- `~` + location ~ \.css$ { + # 处理以 .css 结尾的请求 + root /var/www/html/styles; + } + ``` -区分大小写的正则匹配。 +- `=` -- `~*` + 精确匹配,只有请求的路径与 location 块的路径完全相同时才匹配。 -不区分大小写的正则匹配。 + ```nginx + location = /example { + # 处理请求 /example + # 不处理 /example/xxx + return 200 "This is an exact match."; + } + ``` -正则匹配的例子是: +- 区分大小写的正则匹配 `~` 与不区分大小写的正则匹配 `~*`,例如: -```nginx -location ~ /example[0-9] { - # 处理请求 /example1, /example2, ... - return 200 "This is a case-sensitive regex match."; -} -location ~ \.php$ { - # 处理以 .php 结尾的请求 - include fastcgi_params; - fastcgi_pass 127.0.0.1:9000; -} + ```nginx + location ~ /example[0-9] { + # 处理请求 /example1, /example2, ... + return 200 "This is a case-sensitive regex match."; + } + location ~ \.php$ { + # 处理以 .php 结尾的请求 + include fastcgi_params; + fastcgi_pass 127.0.0.1:9000; + } -location ~* \.(jpg|jpeg|png)$ { - # 处理 jpg、jpeg 和 png 文件,不区分大小写 - root /var/www/html/images; -} -``` + location ~* \.(jpg|jpeg|png)$ { + # 处理 jpg、jpeg 和 png 文件,不区分大小写 + root /var/www/html/images; + } + ``` -- `^~` + 在这个例子中,如果请求的 URI 是 `/static/style.css`,则会匹配到第一个 location 块,因为它是以 `/static/` 开头的前缀匹配。即使 `/static/style.css` 也符合第二个正则匹配的条件,但由于第一个 location 块使用了 `^~`,Nginx 不会继续检查正则匹配。 -通配符匹配,如果请求的 URI 以指定的路径开头,且该路径是最长的前缀匹配,则使用该 location 块。它优先于正则匹配。 +#### Location 块的匹配顺序 -```nginx -location ^~ /static/ { - # 处理以 /static/ 开头的请求 - root /var/www/html/static; -} +Nginx 在处理请求时会按照以下顺序匹配 location 块: -location ~ \.css$ { - # 处理以 .css 结尾的请求 - root /var/www/html/styles; -} -``` +1. 精确匹配 (=)。 +2. 前缀匹配(无修饰符和 `^~`,按最长前缀匹配)。 -在这个例子中,如果请求的 URI 是 `/static/style.css`,则会匹配到第一个 location 块,因为它是以 `/static/` 开头的前缀匹配。即使 `/static/style.css` 也符合第二个正则匹配的条件,但由于第一个 location 块使用了 `^~`,Nginx 不会继续检查正则匹配。 + 在此步骤中,所有无修饰符和 `^~` 的 location 块会一起参与匹配,Nginx 会选择匹配前缀最长的 location。 + 在确定了最长前缀匹配后,如果该 location 块使用了 `^~` 修饰符,Nginx 会停止匹配过程,直接使用该 location 块处理请求;否则,Nginx 会继续进行正则匹配检查。 -Nginx 在处理请求时会按照以下顺序匹配 location 块: +3. 正则匹配(`~` 和 `~*`,按在配置文件中的出现顺序匹配)。 -1. 精确匹配 (=)。 -2. 前缀匹配(最长匹配)。 -3. 通配符匹配 (^~)。 -4. 正则匹配(~ 和 ~\*,按出现顺序匹配)。 + 如果有匹配到的正则表达式,Nginx 会使用该 location 块处理请求。 + 如果没有匹配到的正则表达式,Nginx 会使用第二步中匹配到的前缀 location 块处理请求。 -而在 Location 块中,我们可以使用一些指令来处理请求,如: +而在 location 块中,我们可以使用一些指令来处理请求,如: - `proxy_pass http://backend_server;`:反向代理。 - `root /var/www/html;`:指定网站根目录。 @@ -376,9 +360,9 @@ Nginx 在处理请求时会按照以下顺序匹配 location 块: - `return 200 "Hello, World!";`:返回指定的状态码和内容。 - `include fastcgi_params;`:引入 FastCGI 参数。 -#### SSL/TLS 配置 +### SSL/TLS 配置 -作为 WebServer,必不可少的功能就是支持 HTTPS。你可以在 [https://cherr.cc/ssl.html](https://cherr.cc/ssl.html) 找到 SSL/TLS 的原理解释。 +作为 WebServer,必不可少的功能就是支持 HTTPS。你可以在 找到 SSL/TLS 的原理解释。 首先,你需要为你的域名申请一个 SSL 证书。你可以使用免费的 Let's Encrypt 证书,也可以购买商业证书。 假设你的证书保存在 `/etc/ssl/certs/example.com.pem` 和 `/etc/ssl/private/example.com.pem`。 @@ -394,9 +378,6 @@ server { ssl_certificate /etc/ssl/certs/example.com.pem; # SSL 证书路径 ssl_certificate_key /etc/ssl/private/example.com.pem; # SSL 证书密钥路径 - # (可选)中间证书 - ssl_trusted_certificate /etc/ssl/certs/ca_bundle.crt; # 中间证书文件 - # (可选)SSL 设置 ssl_protocols TLSv1.2 TLSv1.3; # 启用的 SSL/TLS 协议 ssl_ciphers 'HIGH:!aNULL:!MD5'; # 使用的加密套件 @@ -416,14 +397,14 @@ server { 注意到和前文的配置不同,这里的监听端口是 443,而且增加了 ssl 选项。 `ssl_certificate` 和 `ssl_certificate_key` 分别指定了 SSL 证书和密钥的路径。 -在配置文件中,我们还提到了一些可选的配置,如中间证书、SSL 设置、HSTS 等。一般建议设置 `ssl_protocols TLSv1.2 TLSv1.3;` ,因为 TLSv1.0 和 TLSv1.1 已经不安全且被弃用。 +在配置文件中,我们还提到了一些可选的配置,如中间证书、SSL 设置、HSTS 等。一般建议设置 `ssl_protocols TLSv1.2 TLSv1.3;` ,因为 SSLv3、TLSv1.0 和 TLSv1.1 等旧的加密协议已经不再被认为是安全的了。 HSTS 是一种安全机制,用于强制客户端(浏览器)使用 HTTPS 访问网站。 当用户首次访问支持 HSTS 的网站时,浏览器会通过 HTTP 或 HTTPS 发送请求。 如果网站支持 HSTS,服务器会在响应中包含 Strict-Transport-Security 头部,指示浏览器该网站应仅通过 HTTPS 访问。 `add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;` 表示启用 HSTS,浏览器会在 1 年内强制使用 HTTPS 访问网站,并且包括子域名。 -#### 反向代理配置 +### 反向代理配置 反向代理是 Nginx 的一个重要功能,可以用于隐藏后端服务器的真实 IP 地址,提高安全性。也可以将开在不同端口的服务统一到一个端口上。 @@ -463,13 +444,12 @@ server { } } -... ... ``` 但是这只是最简单的反向代理配置,实际情况下往往还需要根据不同的服务做一些特殊的配置,可以通过两个狠狠坑过我的例子来学习。 -- alist 反向代理非标准端口或启用 https 后丢失 https 或端口号/无法播放视频 +!!! bug "alist 反向代理非标准端口或启用 https 后丢失 https 或端口号/无法播放视频" 参考: @@ -508,11 +488,11 @@ server { } ``` -- Grafana 需要 websocket 反代支持 +!!! bug "Grafana 需要 websocket 反代支持" 参考: - 关键在于 Grafana 加载数据时使用了 websocket,需要指示 Nginx 支持 websocket 反代。 + 关键在于 Grafana 加载数据时使用了 WebSocket,需要指示 Nginx 支持 WebSocket 反代。 ```nginx map $http_upgrade $connection_upgrade { @@ -529,7 +509,7 @@ server { } ``` -#### 负载均衡配置 +### 负载均衡配置 负载均衡是 Nginx 的另一个重要功能,可以用于分发请求到多个后端服务器,提高性能和可靠性。 @@ -569,7 +549,7 @@ http { } ``` -- 负载均衡算法 +#### 负载均衡算法 Nginx 支持多种负载均衡算法,默认是轮询(round-robin)。你可以通过在 upstream 块中指定不同的算法来更改负载均衡策略,例如: