Nginx/Ubuntu 上的 React/Express - React 应用程序运行正常,Express 给出 521“坏网关”

Nginx/Ubuntu 上的 React/Express - React 应用程序运行正常,Express 给出 521“坏网关”

我尝试通过 Nginx 在一个 Ubuntu 服务器上运行 Express 后端和 React 前端,并使用 Cloudflare 处理 SSL 和 DNS。我的目标是让后端api.nonsensefreerecipes.com,以及前端nonsensefreerecipes.com

前端运行良好,后端始终无法连接(通常是 521 错误)。

我的后端在端口 8000 上运行,这是 Nginx 文件/etc/nginx/sites-available/api.nonsensefreerecipes.com

   server {
        listen 80;
        listen [::]:80;
        server_name api.nonsensefreerecipes.com www.api.nonsensefreerecipes.com;
        return 302 https://$server_name$request_uri;

}

server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;
        ssl_certificate /etc/ssl/cert.pem;
        ssl_certificate_key /etc/ssl/key.pem;

        server_name api.nonsensefreerecipes.com www.api.nonsensefreerecipes.com;
        root /var/www/api.nonsensefreerecipes.com/nnr-dev/backend;

        location / {
                proxy_pass http://localhost:8000;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection 'upgrade';
                proxy_set_header Host $host;
                proxy_cache_bypass $http_upgrade;
        }


}

/etc/nginx/sites-enabled当然,我已经为该配置文件建立了一个符号链接。

除了端口是 8000 而不是 3000 之外,这个配置文件与 React 应用完全兼容。我也试过了,listen 8000listen 8443没有成功。

Cloudflare SSL 涵盖域和子域,并且证书在两者上均有效。api.nonsensefreerecipes.com 是安全的,只是从不连接。

Express 服务器位于/var/www/api.nonsensefreerecipes.com/nnr-dev/backend,任何启动服务器的方式(例如等)都会在 Ubuntu 控制台上npm start运行服务器( 、等),并且我已经验证过此服务器在其他地方运行良好。这肯定是 Nginx 的问题。starting server..js... MongoDB Connected

最后注意 - 服务器的 IP 地址是 147.190.62.177 。Cloudflare 将 api.non... 和 non... 都推送到该 IP 地址。根据我有限的理解,在此添加 :8000 应该可以启动 Express 服务器,但这也不起作用。

我真的很感谢任何帮助,这是我第一次尝试这样做,而且我已经陷入困境好几天了。

答案1

Cloudflare 返回的 HTTP 状态代码 521 表示它无法连接到 147.190.62.177 端口 443。我要检查的第一件事是 Ubuntu 服务器上的防火墙是否配置为接受来自Cloudflare IP。Ubuntu 默认自带 UFW,所以检查规则的命令是这样的:

sudo ufw status verbose

要向 UFW 添加 INPUT 规则,请对每个 Clousflare 地址使用这些命令(CF_IP_ADDRESS_N):

sudo ufw allow from CF_IP_ADDRESS_N to any port 80 proto tcp
sudo ufw allow from CF_IP_ADDRESS_N to any port 443 proto tcp

请注意,您的 Ubuntu 服务器和互联网之间可能有一个或多个防火墙。确保所有防火墙都配置为接受来自 CF 的连接。

通过检查 Nginx 服务的状态来验证其是否正常运行:

systemctl status nginx

验证 Nginx 是否能够绑定到 TCP 端口 80 和 443:

sudo ss -lntp | grep -E ":(80|443)\s"

然后验证 Express 是否绑定到 TCP 8000 端口:

sudo ss -lntp | grep -E ":8000\s"

验证从 Ubuntu 服务器直接访问网站时 Nginx 是否响应有效的 HTTP 响应:

curl -Ik -H "Host: api.nonsensefreerecipes.com" https://127.0.0.1/

验证从 Ubuntu 服务器直接访问网站时 Express 是否响应有效的 HTTP 响应:

curl -I http://127.0.0.1:8000/

这些提示应该是一个很好的起点。

相关内容