我尝试通过 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 8000
但listen 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/
这些提示应该是一个很好的起点。