You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DigitalOcean Droplet上Ghost子目录部署遇403错误求助

问题:Ghost部署在/blog子目录出现403 Forbidden错误

我在DigitalOcean购买了6美元的Ghost Droplet,现有主站jointero.org,希望将Ghost部署在/blog子目录中。已配置Ghost的url为https://www.jointero.org/blog,并在Web服务器的Nginx中设置/blog路径反向代理至Droplet的IP,但访问时出现403 Forbidden错误。尝试多种网上方法无效,附上相关配置及错误日志寻求帮助。

Nginx sites-enabled配置

server {
  server_name jointero.org www.jointero.org;
  location / {
    proxy_pass http://localhost:8080;
  }

location /blog {
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_http_version 1.1;
    proxy_set_header Update &http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
    proxy_pass http://137.184.139.240/;
  }

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/jointero.org/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/jointero.org/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot


}

server{
    if ($host = www.jointero.org) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


  if ($host = jointero.org) {
    return 301 https://$host$request_uri;
  } # managed by Certbot
  server_name jointero.org www.jointero.org;
  listen 80;
  return 404; # managed by Certbot


}

Ghost配置

{
  "url": "http://www.jointero.org/blog/",
  "server": {
    "port": 2368,
    "host": "127.0.0.1"
  },
  "database": {
    "client": "mysql",
    "connection": {
      "host": "localhost",
      "user": "hidden",
      "password": "hidden",
      "port": 3306,
      "database": "hidden"
    }
  },
  "mail": {
    "transport": "Direct"
  },
  "logging": {
    "transports": [
      "file",
      "stdout"
    ]
  },
  "process": "systemd",
  "paths": {
    "contentPath": "/var/www/ghost/content"
    }
 }

Nginx错误日志

directory index of "/var/www/ghost/system/nginx-root/" is forbidden, client: 45.132.240.139, server: www.jointero.org, request: "GET // HTTP/1.1", host: "jointero.org" 

问题分析与修复步骤

1. 修正Nginx反向代理路径

当前location /blog中的proxy_pass末尾加了斜杠,导致请求/blog时被转发到Ghost服务器的根路径/,和Ghost配置的/blog路由不匹配,还会引发路径拼接错误(日志中的GET // HTTP/1.1就是证据)。

修复:
将proxy_pass末尾的斜杠去掉,改为:

proxy_pass http://137.184.139.240;

2. 修正Ghost的URL协议和格式

Ghost配置里的url用了http,但实际站点是https,会导致资源路径生成错误;同时末尾的斜杠也可能引发路由问题。

修复:
修改Ghost配置文件中的url字段:

"url": "https://www.jointero.org/blog"

3. 修正Nginx的Upgrade头部拼写错误

配置里的proxy_set_header Update &http_upgrade;是错误的,正确的WebSocket升级头部应为Upgrade,拼写错误会导致连接异常。

修复:
替换为:

proxy_set_header Upgrade $http_upgrade;

4. 重启服务生效

修改配置后,重启Nginx和Ghost服务:

sudo systemctl restart nginx
sudo systemctl restart ghost_jointero-org

内容的提问来源于stack exchange,提问作者Adeel Faridi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 13:54:21