Skip to content

Commit

Permalink
Merge commit '6565c46105a9c6a6e78c378aa5205573604a58c2'
Browse files Browse the repository at this point in the history
  • Loading branch information
Cherrling committed Jan 1, 2025
2 parents 0c0b7bf + 6565c46 commit 9005b20
Showing 1 changed file with 43 additions and 26 deletions.
69 changes: 43 additions & 26 deletions docs/ops/network-service/nginx.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

Nginx 是一个高性能的 HTTP 和反向代理服务器,它可以作为一个独立的 Web 服务器,也可以作为其他 Web 服务器的反向代理服务器。

如果你只是需要简单快速的拉起一个网站,或许也可以试试 Caddy,它是一个更加简单的 Web 服务器。
如果你只是需要简单快速的拉起一个网站,或许也可以试试 [Caddy](https://201.ustclug.org/advanced/caddy/),它是一个更加简单的 Web 服务器。

## 安装

Expand All @@ -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
Expand Down Expand Up @@ -130,6 +151,9 @@ sudo nginx -s reload
sudo systemctl reload nginx
```

需要注意的是,如果没有检查配置,并且配置中存在错误,`nginx -s reload` 会让 nginx 停止,而 `systemctl reload nginx` 不会,并且不会采用新的配置文件。


## 进阶教程

### Nginx 名词扫盲
Expand All @@ -141,7 +165,6 @@ sudo systemctl reload nginx
Nginx 的配置文件中可以有多个 server 块,每个 server 块定义了一个站点(虚拟主机),Nginx 会根据请求的域名和端口号来匹配对应的 server 块。
Nginx 正是通过 server 块来实现多站点配置的。
一个典型的 server 块:

```nginx
server {
listen 80; # 监听的端口
Expand Down Expand Up @@ -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。

Expand Down Expand Up @@ -210,16 +233,13 @@ server {
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 _; # 默认域名
Expand All @@ -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;`,比如:
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -541,7 +559,6 @@ http {
Nginx 支持多种负载均衡算法,默认是轮询(round-robin)。你可以通过在 upstream 块中指定不同的算法来更改负载均衡策略,例如:

最少连接:

```nginx
upstream backend {
least_conn; # 使用最少连接算法
Expand Down

0 comments on commit 9005b20

Please sign in to comment.