因此,我在家中安装了 Synology NAS,其中运行着一些我需要从 WWW 访问的服务,但可以理解的是,我不想将我的家庭 IP 上的端口开放到广阔的互联网(特别是因为外部服务需要访问端口 443 上的服务器)- 所以我决定在安装了 Ubuntu 22.04 的 Oracle Cloud 上启动一个 Always Free 实例(0.48Gbps 连接,1 个 CPU,1GB RAM),并在其上安装 nginx,以便从我的家庭网络外部访问这些服务。然后,我仅将路由器上的端口开放给云实例的 IP 地址。
我确实有通过 SSH 管理 Linux 服务器的经验,但这是我第一次接触 nginx,更不用说反向代理了。
在测试期间,我将端口开放给所有 IP,这样我就可以直接或通过反向代理测试进入实验室的流量。下面就是我开始遇到困难的地方:
- 当我直接访问上游服务器上运行的 phpMyAdmin 时(我只是查询https://pma.upstream.mydomain.xyz:openedPort在我的浏览器中),它可以立即加载 - 即使清除了缓存
- 当我通过反向代理访问上游服务器上运行的 phpMyAdmin 时(通过查询https://pma.reverseproxy.mydomain.xyz:443在我的浏览器中),清除浏览器缓存后需要一分钟以上的时间才能加载。当缓存已经加载时,加载速度不会那么慢(可能要 10 秒),但仍然比直接查询上游服务器慢得多(当我关闭更广泛的互联网端口时,这将是不可能的)。检查浏览器控制台后,花费时间最长的是 phpMyAdmin 用作图标的小型 PNG(每个图像最多几百字节)和较大的 CSS/JS 文件(几十 KB)。
当我通过反向代理访问上游服务器上的其他站点时,我似乎没有遇到这些问题,尽管它确实没有提供那么多微小的 JS 和 PNG 文件,大部分只是文本
以下是我的 nginx 服务器块配置。有人知道我可能哪里出错了吗?任何建议都将不胜感激。
server {
listen 443 ssl http2;
server_name pma.reverseproxy.mydomain.xyz;
sendfile on;
tcp_nodelay on;
tcp_nopush on;
ssl_certificate /etc/letsencrypt/live/reverseproxy.mydomain.xyz/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/reverseproxy.mydomain.xyz/privkey.pem;
resolver 1.1.1.1 8.8.8.8 valid=300s;
set $backend_server https://pma.upstream.mydomain.xyz:openedPort;
location / {
proxy_pass $backend_server;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host pma.upstream.mydomain.xyz;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_buffer_size 128k;
proxy_buffers 8 256k;
proxy_busy_buffers_size 256k;
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
proxy_read_timeout 20s;
}
}