如何在Linode服务器上通过反向代理部署SvelteKit/PocketBase应用至不同子域名
如何在Linode服务器上通过反向代理部署SvelteKit/PocketBase应用至不同子域名
嘿,我来帮你搞定这个端口冲突的问题!核心思路是用Caddy作为统一的反向代理,让它独占443端口处理所有HTTPS请求,再把不同子域名的流量转发给对应的服务——这样PocketBase和SvelteKit只需要在各自的内部端口运行,就不会打架啦。下面是一步步的操作指南:
1. 调整PocketBase的监听端口
之前你的PocketBase应该是直接绑定了443端口,现在我们把它改成一个内部端口(比如8090):
- 找到你的PocketBase systemd服务文件,一般在
/etc/systemd/system/pocketbase.service - 编辑启动命令,把原来的
--https=0.0.0.0:443改成--http=0.0.0.0:8090,比如:ExecStart=/path/to/your/pocketbase serve --http=0.0.0.0:8090 - 重新加载systemd配置并重启服务:
sudo systemctl daemon-reload sudo systemctl restart pocketbase - 先验证本地访问:
curl http://localhost:8090,能看到PocketBase的响应就没问题。
2. 调整SvelteKit的运行端口
同样,让SvelteKit跑在另一个内部端口(比如3000):
- 如果用pm2启动,直接在命令里指定端口:
pm2 start npm --name "sveltekit-app" -- run start -- --port 3000 - 或者在SvelteKit的
vite.config.js里配置端口:export default defineConfig({ server: { port: 3000 } }); - 验证本地访问:
curl http://localhost:3000,能看到你的应用响应就OK。
3. 配置Caddy作为反向代理
现在让Caddy来接管443端口,把不同子域名的请求转发给对应的服务:
- 编辑Caddy配置文件(一般在
/etc/caddy/Caddyfile),替换成下面的内容:backend.mydomain.com { reverse_proxy localhost:8090 # Caddy会自动申请并维护Let's Encrypt SSL证书,不用手动管 } appname.mydomain.com { reverse_proxy localhost:3000 } - 重启Caddy服务:
sudo systemctl restart caddy
4. 验证最终效果
现在你可以分别访问:
https://backend.mydomain.com:应该能正常打开PocketBase的界面https://appname.mydomain.com:应该能正常加载你的SvelteKit应用
两个服务会同时运行,再也不会出现端口冲突的问题啦!
额外注意事项
- 确保Linode的防火墙规则开放了80端口和443端口(Caddy需要80端口来完成SSL证书的验证流程)
- 内部服务用HTTP监听完全安全,因为Caddy已经在外层处理了HTTPS加密,流量从用户到Caddy是加密的,Caddy到内部服务是本地传输,不用担心安全问题
- 如果Caddy启动失败,查看日志排查问题:
journalctl -u caddy
备注:内容来源于stack exchange,提问作者Jozef Jezik




