# Nginx 反向代理

> 推荐查看 Nginx 官方文档，此处记录并不全面。

## HTTP 反向代理

配置此功能非常简单，在 `http {}` 板块下新建 `server {}` 板块：

```txt
http {
    server {
        listen 8080;
        server_name proxy.example.com;
        location / {
            proxy_pass https://target.example.com/;
        }
    }
}
```

这样当用户访问 `https://proxy.example.com:8080` 时，会被跳转到 `https://target.example.com`。

同时还可以借助 `location` 字段，实现在特定 URL 跳转：

仅需将 `location / {}` 改为 `location /proxy/ {}`，这样当用户访问 `https://proxy.example.com:8080/proxy` 时，会被跳转到 `https://target.example.com`。

使用反向代理还可以实现负载均衡，使用 `upstream name {}` 板块添加后端服务器组。

```txt
http {

    upstream backend {
        server backend.example.com:8080;
        server backend.example.com:8081;
    }

    server {
        listen 8080;
        server_name proxy.example.com;
        location / {
            proxy_pass backend;
        }
    }
}
```

在 `upstream name {}` 中，可以用 `weight` 指定权重，ip_hash 固定同一 ip 的访问在同一台服务器中。

```txt
# ...
    upstream backend {
        ip_hash;
        server backend.example.com:8080 weight=1;
        server backend.example.com:8081 weight=3;
    }
# ...
```

## TCP 反向代理

此模块依赖于 Nginx 的 Stream 模块，此模块的安装默认不包含在 Nginx 的默认编译选项中。

要使用此模块，在先前的基础上，添加 `--with-stream` 参数进行编译：

```bash
./configure --with-stream
```

随后重新编译安装 Nginx 并冷重启 Nginx 服务：

```bash
make && sudo make install && nginx -s stop && nginx
```

在 `nginx.conf` 中添加以下板块：

```txt
stream {
    server {
        listen 13157;
        proxy_pass acovia.net:29185;
    }
}
```

这样所有在 `acovia.net:29185` 的 tcp 流量会被转发在本机的 13157 端口。