求助:如何实现一个域名绑定多个端口服务?

使用 “xx.me/alist” "xx.me/openwebui"这种方式还是有可能有问题的,需要看你的服务(就是你说的alist、open-webui这些服务)里对资源的请求路径是怎么写的。
以alist举个例子吧,假设你配置的路径是 xxx.me/alist
假如,我是说假如,
1.假如 alist 的前端页面代码里请求后端时使用的是相对路径比如 “xx/xx.js” “xx/xx.jpg”,这种的,访问时浏览器会自动帮你把浏览器地址栏里的 /alist 这个前缀之类的补全,是没问题的
2.假如 alist 的前端页面代码里请求后端时使用的是类似JSP中那种由代码动态获取当前的contextpath的,也没问题,但是这种的我感觉应该比较少了,尤其是前后端分离的项目基本上不太可能是这种方式
3.假如alist代码里写的就是绝对路径,比如 “/xx/xx.js” 那么浏览器访问时是不会帮你再把 “/alist” 这一部分给补上的,也就是说你的请求到达nginx的时候是不会带有 “/alist” 这一部分的,nginx也就没法给你转发到你想要的服务上,而是走默认的 “/” 根路径。

所以,你如果遇到能请求到网页,但是里面js/css/图片/接口等等无法访问的情况,那就说明代码里是写的绝对路径,这时候
1.要不然你去改代码,
2.要不然就去分析没法转发的那些路径前缀(比如"/staticdata")是不是只有这一个服务在用,如果是只有这一个服务使用那你需要在nginx里把这些路径也转发到alist的服务,如果不是只有这一个服务使用,那就不好搞了。

所以,还是推荐搞个二级域名 alist.xx.me openwebui.xx.me 这种形式。
xx.me/alist xx.me/openwebui 这种的,你要转发的服务越多,遇到问题的可能性就越大

我的建议是直接用宝塔,个人用户反正也不怕被收拾。操作基本都属于傻瓜式

cf代理指定端口

server {
  listen 443 ssl; 
  server_name aa.xxxx.top;

  client_max_body_size 4M;

  ssl_certificate     /etc/nginx/ssl/*.xxxx.top/server.crt;
  ssl_certificate_key /etc/nginx/ssl/*.xxxx.top/server.key;
  ssl_session_timeout 5m;
  ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
  ssl_prefer_server_ciphers on;

  location / {
    client_max_body_size 50M;
    proxy_pass http://127.0.0.1:80;
  }
}

https://aa.xxxx.tophttp://127.0.0.1:80
多写几个server块,不同的二级域名绑定到不同的端口上,省的记路径,还可能有问题

我这里直接给一个实际的配置吧,说实在的二级路径这种东西实在是吃力不讨好,不如直接用不同的域名。这个是我之前没捣鼓域名的时候搞的,后面发现使用路径来区分基本上每个服务都得单独去改点什么,没法直接复制,累得很,还不一定能用。很多服务压根就没考虑过使用路径的这种模式

server {
    listen 80;
    listen [::]:80;
    server_name localhost;
    client_max_body_size 128M;
    # portainer docker 管理面板
    location /apps/portainer/ {
        proxy_pass https://172.17.0.1:39443/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        # 如果使用自签名证书,可以禁用 SSL 验证
        proxy_ssl_verify off;
    }
    # dpanel docker 管理面板
    location /apps/dpanel/ {
        proxy_pass http://172.17.0.1:38807/;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_redirect off;
        sub_filter '/dpanel' '/apps/dpanel/dpanel';
        sub_filter '/api' '/apps/dpanel/api';
        sub_filter '/ws' '/apps/dpanel/ws';
        sub_filter_types text/javascript;
        sub_filter_once off;
    }
    # aria2 + AriaNg http/ftp 下载服务
    location /apps/ariang/ {
        proxy_pass http://172.17.0.1:36880/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
    # aria2 RPC
    location /apps/aria2/jsonrpc {
        proxy_pass http://172.17.0.1:36800/jsonrpc;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        # WebSocket 支持(如 Aria2 使用 WebSocket)
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
    # qbittorrent-nox BT 下载服务
    location /apps/qbittorrent/ {
        proxy_pass http://172.17.0.1:38080/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Host $http_host;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
    # alist 云盘
    location /apps/alist/ {
        proxy_pass http://172.17.0.1:35244/apps/alist/;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Range $http_range;
        proxy_set_header If-Range $http_if_range;
        proxy_redirect off;
        # the max size of file to upload
        client_max_body_size 20000m;
    }
    # nginx UI nginxWebUI管理面板
    location /apps/nginxui/ {
        proxy_pass http://127.0.0.1:9000/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
    }
    location / {
        try_files $uri $uri/ =404;
    }
}

的确二级域名更方便,nginx配置对小白来说太难了 :joy_cat:,总是出现一些无法无法理解的问题

的确是二级域名方便很多,不懂原理,配置起来太头疼了

感谢各位大佬的鼎力相助,目前用二级域名更方便,二级目录还得再琢磨琢磨

这不还是根据路径配的嘛

这个配置是n个月之前的了,只是留着在服务器上纪念下我那几天的辛苦配置。我现在用的是域名的方案。

如果需要证书 推荐caddy 配置相对nginx简单一些 丢给ai基本可以给你搞定