我有一个 VPS,在该 VPS 上有一个使用 Docker 端口 80 运行的现有应用程序。我想要在该 VPS 上部署两个应用程序,第一个应用程序是使用端口 8080 的 Laravel 后端,第二个应用程序是 NextJS 前端端口 8081。这两个应用程序都可以通过公共 IP(193.203.x.x:8080
和193.203.x.x:8081
)访问。
但我想对第一个应用程序和第二个应用程序使用子域。
- laravel 后端:be.example.com
- nextjs 前端:fe.example.com
我已经配置了 A 记录并将值be
和fe
点添加到服务器193.203.x.x
。
我已经配置了 nginx,以便第一个应用程序指向be.example.com
,第二个应用程序指向fe.example.com
,但是当我在浏览器中输入 时be.example.com
,出现的是端口为 80 的现有应用程序。
我希望当我输入时be.example.com
,出现 Laravel 后端应用程序页面,同样当我检查时fe.example.com
,出现 NextJS 前端应用程序页面。
我做了什么:
我检查了域配置,没有带 * 的 A 记录。我还检查了后端和前端应用程序的 Nginx,例如,它已关闭,而 be.example.com 页面仍然显示带有端口 80 的现有应用程序,这意味着我的 Nginx 无法访问 be.example.com URL
这是我的 nginx 配置:
可用站点
server {
listen 8080;
listen [::]:8080;
server_name be.example.com; #change with your domain
root /home/cabin/web-app-backend/public;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
index index.php;
charset utf-8;
location / {
#try_files $uri $uri/ /index.php?query_string;
proxy_pass http://127.0.0.1:8080;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_redirect off;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}}
ufw 状态
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
443 ALLOW Anywhere
80/tcp ALLOW Anywhere
85 DENY Anywhere
8080 ALLOW Anywhere
8080/tcp ALLOW Anywhere
8081 ALLOW Anywhere
8081/tcp ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
443 (v6) ALLOW Anywhere (v6)
80/tcp (v6) ALLOW Anywhere (v6)
85 (v6) DENY Anywhere (v6)
8080 (v6) ALLOW Anywhere (v6)
8080/tcp (v6) ALLOW Anywhere (v6)
8081 (v6) ALLOW Anywhere (v6)
8081/tcp (v6) ALLOW Anywhere (v6)
答案1
如果您希望用户输入be.example.com
并获取您的应用程序,则需要使用默认端口,HTTP 为 80,HTTPS 为 443。对于其他每个端口,用户也需要输入端口,例如be.example.com:8080
。
话虽如此,您需要将服务器块绑定到默认端口。
例子:
server {
listen 80;
listen [::]:80;
server_name be.example.com;
location / {
proxy_pass http://127.0.0.1:8080;
}
}
server {
listen 80;
listen [::]:80;
server_name fe.example.com;
location / {
proxy_pass http://127.0.0.1:8081;
}
}
不过,你应该考虑默认使用 HTTPS,将所有 HTTP 流量重定向到 HTTPS,因为 SSL 证书现在不需要花费任何费用。
之后,您应该将后端服务器绑定到环回接口,127.0.0.1
以便它们只能通过反向代理访问。您可以并且应该从防火墙中删除端口 8081 和 8080。反向代理不需要它们。
答案2
您是否已从 docker 容器中解除绑定现有应用程序端口 80。运行以下命令解除绑定端口 80。
docker run -p <所需主机端口>:<容器端口> -d --name <容器名称> <镜像名称>