如何在 Ubuntu 22.04 上将 Nginx 配置为反向代理

介绍

一个倒置代用是推荐的将应用程序服务器曝光到互联网的方法. 无论是在生产中运行一个Node.js应用程序,还是使用Flask的最小内置网络服务器,这些应用程序服务器都会用TCP端口绑定到"localhost". 这意味着默认情况下, 您的应用程序只能在它所居住的机器上本地访问 。 尽管您可以指定一个不同的绑定点强制通过互联网访问,但这些应用程序服务器被设计为从生产环境的倒置代理背后服务. 这为将应用程序服务器与互联网直接连接隔离、对防火墙保护进行集中管理的能力以及将攻击平面最小化以对付诸如拒绝服务攻击等常见威胁提供了安全益处.

从客户端的角度来看,与反向代理互动与直接与应用程序服务器互动没有什么不同. 它在功能上是相同的,而客户端无法区分。

本教程将展示如何使用 Nginx,一个流行的Web服务器和反向代理解决方案,设置反向代理程序。您将安装 Nginx,使用proxy_pass指令将其配置为反向代理程序,并从客户端的请求中传输相应的标题。如果您没有应用程序服务器来测试,您可以选择使用WSGI服务器Gunicorn设置测试应用程序。

前提条件

要完成本教程,您将需要:

  • Ubuntu 22.04服务器,根据我们Ubuntu 22.04的初始服务器设置指南设置,
  • 联合国 您想要代理的应用程序服务器的地址, 这将在整个教程中被称为 app_ server_ 地址 。 这可以是带有TCP端口的IP地址(例如:"http://127.0.0.1:8000"的Gunicorn默认),也可以是unix域套接字(例如:"http://unix:/tmp/pgadmin4.sock" for pgAdmin). 如果没有安装用于测试的应用程序服务器,则将通过设置Gunicorn应用程序提供指导,该应用程序将绑定在`http://127.0.0.1:8000'上。
  • 一个域名指向您的服务器的公开IP. 这将配置为 Nginx 来代理您的应用程序服务器 。 .

第1步:安装 Nginx

Nginx 可通过默认存储库进行apt的安装。更新您的存储库索引,然后安装 Nginx:

1sudo apt update
2sudo apt install nginx

Y来确认安装. 如果您被要求重新启动服务,请按ENTER来接受默认。

您需要通过您的防火墙允许访问 Nginx. 根据初始服务器前提设置您的服务器后,添加以下规则ufw:

1sudo ufw allow 'Nginx HTTP'

现在您可以验证 Nginx 是否正在运行:

1systemctl status nginx
 1[secondary_label Output]
 2 nginx.service - A high performance web server and a reverse proxy server
 3     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
 4     Active: active (running) since Mon 2022-08-29 06:52:46 UTC; 39min ago
 5       Docs: man:nginx(8)
 6   Main PID: 9919 (nginx)
 7      Tasks: 2 (limit: 2327)
 8     Memory: 2.9M
 9        CPU: 50ms
10     CGroup: /system.slice/nginx.service
11             ├─9919 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;"
12             └─9920 "nginx: worker process

接下来,您将添加一个自定义服务器块与您的域和应用程序服务器代理。

步骤 2 — 配置您的服务器块

建议您为新服务器块添加创建自定义配置文件,而不是直接编辑默认配置。

1sudo nano /etc/nginx/sites-available/your_domain

将以下内容插入到新文件中,确保取代your_domainapp_server_address。 如果您没有应用程序服务器可供测试,请默认使用http://127.0.0.1:8000用于 Step 3 中的可选Gunicorn服务器设置:

 1[label /etc/nginx/sites-available/your_domain]
 2server {
 3    listen 80;
 4    listen [::]:80;
 5
 6    server_name your_domain www.your_domain;
 7
 8    location / {
 9        proxy_pass app_server_address;
10        include proxy_params;
11    }
12}

存储和退出,使用nano您可以通过按CTRL+O然后按CTRL+X来做到这一点。

此配置文件以标准的 Nginx 设置开始, Nginx 将在端口 80 上收听, 并响应对您的域名和 www.your_domain 的要求。 反向代理功能通过Nginx的"proxy_pass"指令被启用. 使用此配置, 在本地网页浏览器中浏览您的域将会与在您的远程机器上打开 App_ server_ 地址相同 。 虽然这个教程只会代理一个单一的应用程序服务器,但Nginx能够同时充当多个服务器的代理. 通过根据需要增加更多的位置块,一个单一的服务器名可以通过代理将多个应用程序服务器合并为一个有凝聚力的网络应用程序.

所有 HTTP 请求都附有标题,其中包含有关发送请求的客户端的信息. 这包括 IP 地址、缓存偏好、 Cookie 跟踪、授权状态等详细信息。 Nginx 提供了一些推荐的标题转发设置,您已包含为proxy_params,详细信息可在/etc/nginx/proxy_params中找到:

1[label /etc/nginx/proxy_params]
2proxy_set_header Host $http_host;
3proxy_set_header X-Real-IP $remote_addr;
4proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
5proxy_set_header X-Forwarded-Proto $scheme;

使用反向代理服务器,你的目标是传递有关客户端的相关信息,有时也传递关于反向代理服务器本身的信息. 有使用情况,代理服务器希望知道哪个反向代理服务器处理了请求,但通常重要信息来自原始客户端的请求。

默认情况下,当 Nginx 作为反向代理代理时,它会更改两个头条,删除所有空头条,然后通过请求。两个更改的头条是) 有关每个目的的更多信息,尽管对反向代理的相关头条将在稍后这里列出。

以下是由「proxy_params」转发的标题和其存储数据的变量:

  • 联合国 主机 : 此头包含客户端请求的原始主机,即网站域和端口. Nginx 保留在 $http_ host 变量中。
  • X 前导: 此信头包含发送原始请求的客户端的IP地址. 它还可以包含一个IP地址列表,由原客户端IP先来,再列出通过请求的反向代理服务器的所有IP地址. Nginx 保留在 $proxy_ add_ x_ forward_ for 变量中 。
  • X-真实IP: 这个头总是包含一个属于远程客户端的IP地址. 这与类似的"X-Forwarded-For"形成对比,它可以包含一个地址列表. 如果X-Forwarded-For不在场,则与X-Real-IP相同.
  • X 前导后导: 此信头包含原始客户端用来连接的协议,无论是HTTP还是HTTPS. Nginx 将它保留在 $cheme 变量中。 .

接下来,通过从它创建链接到 Nginx 在启动时阅读的网站启用目录来激活此配置文件:

1sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/

现在您可以测试配置文件以检测语法错误:

1sudo nginx -t

如果没有报告的问题,请重新启动 Nginx 以应用您的更改:

1sudo systemctl restart nginx

Nginx现在已配置为您的应用程序服务器的反向代理,如果您的应用程序服务器正在运行,您可以从本地浏览器访问它。

否则,继续在下一步中使用 Gunicorn 设置测试应用程序和服务器。

步骤 3 — 使用 Gunicorn 测试您的反向代理 (可选)

如果您在开始本教程之前准备并运行了应用程序服务器,您现在可以在浏览器中访问它:

1your_domain

但是,如果你没有应用程序服务器来测试你的反向代理,你可以通过以下步骤来安装Gunicorn和测试应用程序。

更新您的apt存储索引并安装gunicorn:

1sudo apt update
2sudo apt install gunicorn

您还可以通过PyPI的pip来安装Gunicorn,最新的版本可以与Python虚拟环境相配,但apt在这里被用作快速测试床。

接下来,你会写一个Python函数返回Hello World!作为HTTP响应,在网页浏览器中渲染。

1nano test.py

将下列 Python 代码插入到文件中:

1def app(environ, start_response):
2    start_response("200 OK", [])
3    return iter([b"Hello, World!"])

这是 Gunicorn 所需的最低代码,以启动 HTTP 响应,在您的 Web 浏览器中渲染一行文本。

现在启动您的Gunicorn服务器,指定测试Python模块和其中的应用程序功能。

1gunicorn --workers=2 test:app
1[secondary_label Output]
2[2022-08-29 07:09:29 +0000] [10568] [INFO] Starting gunicorn 20.1.0
3[2022-08-29 07:09:29 +0000] [10568] [INFO] Listening at: http://127.0.0.1:8000 (10568)
4[2022-08-29 07:09:29 +0000] [10568] [INFO] Using worker: sync
5[2022-08-29 07:09:29 +0000] [10569] [INFO] Booting worker with pid: 10569
6[2022-08-29 07:09:29 +0000] [10570] [INFO] Booting worker with pid: 10570

输出确认Gunicorn正在听到http://127.0.0.1:8000的默认地址。 这是您在 Nginx 配置中之前设置的代理地址。 如果没有,请返回您的/etc/nginx/sites-available/your_domain文件并编辑与proxy_pass指令相关的 app_server_address。

打开您的网页浏览器并导航到您用 Nginx 设置的域:

1your_domain

您的 Nginx 反向代理现在为您的 Gunicorn Web 应用程序服务器提供服务,显示 Hello World!

结论

借助本教程,您已将 Nginx 配置为反向代理,以允许访问您的应用程序服务器,否则只可在本地使用。

对于使用 Nginx 作为反向代理程序的完整解决方案的示例,请参阅 如何在 Ubuntu 22.04 上使用 Gunicorn 和 Nginx 服务 Flask 应用程序或 [如何在 Ubuntu 22.04 上使用 InstantSearch 运行 Meilisearch 前端(https://andsky.com/tech/tutorials/how-to-run-a-meilisearch-frontend-using-instantsearch-on-ubuntu-22-04)。

Published At
Categories with 技术
comments powered by Disqus