配置 Nginx

Gisia 运行在 Docker 中,并将 Web 端口发布到 127.0.0.1:8080。在生产环境中,你需要在它前面放置 Nginx 作为反向代理,这样就可以使用自己的域名、终止 HTTPS,并允许大体积的 Git 推送。

本指南尽量保持配置简洁。先从纯 HTTP 开始,确认可用后再添加 HTTPS。

局域网内的 HTTP

创建 /etc/nginx/sites-available/gisia

map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}

server {
    listen 80;
    server_name gisia.example.com;

    client_max_body_size 0;

    location / {
        proxy_pass http://127.0.0.1:8080;

        proxy_http_version 1.1;
        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 Upgrade    $http_upgrade;
        proxy_set_header Connection $connection_upgrade;

        proxy_read_timeout    300;
        proxy_connect_timeout 300;
        proxy_redirect        off;
    }
}

启用并重新加载:

ln -s /etc/nginx/sites-available/gisia /etc/nginx/sites-enabled/gisia
nginx -t
systemctl reload nginx

各项配置说明

  • map $http_upgrade —— 在文件顶部、server 块之外声明一次。它支撑 WebSocket 升级,使实时功能保持连接。
  • client_max_body_size 0 —— 取消 Nginx 的上传大小限制,交由 Gisia 自行控制。否则大体积的 Git 推送和文件上传会失败并返回 413 Request Entity Too Large
  • Host $http_host —— 同时传递主机名和端口,使 Gisia 生成正确的 URL。
  • X-Forwarded-Proto $scheme —— 告诉 Gisia 原始请求是 HTTP 还是 HTTPS。不要把这个值写死。
  • proxy_http_version 1.1 + Upgrade / Connection —— WebSocket 连接能够被代理而不被丢弃所必需。
  • proxy_read_timeout 300 —— 部分克隆和流水线请求会超过 Nginx 默认的 60 秒。

面向公网的 HTTPS

HTTP 可用后,获取证书,然后切换到 HTTPS。将所有 HTTP 流量重定向到 HTTPS,并在 443 上提供服务:

server {
    listen 80;
    server_name gisia.example.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    http2 on;
    server_name gisia.example.com;

    ssl_certificate     /etc/letsencrypt/live/gisia.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/gisia.example.com/privkey.pem;

    client_max_body_size 0;

    location / {
        proxy_pass http://127.0.0.1:8080;

        proxy_http_version 1.1;
        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 Upgrade    $http_upgrade;
        proxy_set_header Connection $connection_upgrade;

        proxy_read_timeout    300;
        proxy_connect_timeout 300;
        proxy_redirect        off;
    }
}

将 HTTP 示例中的 map $http_upgrade 块保留在文件顶部 —— 两个 server 块共用它。

由于现在 HTTPS 在 Nginx 处终止,X-Forwarded-Proto $scheme 会向 Gisia 报告 https,因此重定向、安全 Cookie 和生成的链接都会使用 https://