【问题标题】:How to serve devpi with https?如何使用 https 服务 devpi?
【发布时间】:2019-09-26 18:54:19
【问题描述】:

我有一个开箱即用的 devpi-server 在 http:// 上运行

我需要让它在 https:// 上工作。

我已经拥有该域的证书。

我遵循 nginx-site-config 的 documentation,并创建了 /etc/nginx/conf.d/domain.conf 文件,其中包含指向我的证书的 server{} 块(摘录如下)。

但是,我的devpi-server --start --init 完全忽略了任何/所有 nginx 配置。 如何让 devpi-server 使用 nginx 配置?有没有可能,还是我完全没有抓住重点?

/etc/nginx/conf.d/domain.conf文件内容:

server {
    server_name localhost $hostname "";

    listen              8081 ssl default_server;
    listen              [::]:8081 ssl default_server;
    server_name         domain;
    ssl_certificate     /root/certs/domain/domain.crt;
    ssl_certificate_key /root/certs/domain/domain.key;
    ssl_protocols       TLSv1.1 TLSv1.2;
    ssl_ciphers         EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH;

    gzip             on;
    gzip_min_length  2000;
    gzip_proxied     any;
    gzip_types       application/json;

    proxy_read_timeout 60s;
    client_max_body_size 64M;

    # set to where your devpi-server state is on the filesystem
    root /root/.devpi/server;

    # try serving static files directly
    location ~ /\+f/ {
        # workaround to pass non-GET/HEAD requests through to the named location below
        error_page 418 = @proxy_to_app;
        if ($request_method !~ (GET)|(HEAD)) {
            return 418;
        }

        expires max;
        try_files /+files$uri @proxy_to_app;
    }
    # try serving docs directly
    location ~ /\+doc/ {
        try_files $uri @proxy_to_app;
    }
    location / {
        # workaround to pass all requests to / through to the named location below
        error_page 418 = @proxy_to_app;
        return 418;
    }
    location @proxy_to_app {
        proxy_pass https://localhost:8081;
        proxy_set_header X-outside-url $scheme://$host:$server_port;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto https;
    }
}

【问题讨论】:

  • my devpi-server is totally ignoring any/all nginx configurations 到底是什么意思?从索引中尝试pip installing 时会遇到什么样的错误? devpis 日志里有什么有用的吗?

标签: ssl nginx tls1.2 devpi


【解决方案1】:

这是我在 superuser 上对同一问题的回答。

Devpi 对 Nginx 一无所知,它只会提供 HTTP 流量。当我们想通过 HTTPS 与 Web 应用程序交互时,作为客户端,我们需要与可以处理它的前端(Nginx)进行通信,然后再与我们的 Web 应用程序通信。 Nginx 的这个应用程序被称为reverse proxy。作为反向代理,我们还可以从 Nginx 提供静态文件的能力中受益,而不是让我们的网络应用自己做(因此 “尝试服务...” 位置块)。 p>

这是我用于 devpi 的完整 Nginx 配置。请注意,这是 /etc/nginx/nginx.conf 文件,而不是像您这样的域配置,因为我在 docker 中使用 compose 运行 Nginx 和 Devpi,但您应该能够提取您需要的内容:

worker_processes 1;

events { 
    worker_connections 1024; 
}

http {
    # Define the location for devpi
    upstream pypi-backend {
        server localhost:8080;
    }

    # Redirect HTTP to HTTPS
    server {
        listen 80;
        listen [::]:80;
        server_name _;
        return 301 https://$host$request_uri;
    }

    server {
        listen 443 ssl;
        server_name example.co.uk; # This is the accessing address eg. https://example.co.uk

        root /devpi/server; # This is where your devpi server directory is
        gzip             on;
        gzip_min_length  2000;
        gzip_proxied     any;

        proxy_read_timeout 60s;
        client_max_body_size 64M;

        ssl_certificate             /etc/nginx/certs/cert.crt; Path to certificate
        ssl_certificate_key         /etc/nginx/certs/cert.key; Path to certificate key

        ssl_session_cache           builtin:1000  shared:SSL:10m;
        ssl_protocols               TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers                 HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
        ssl_prefer_server_ciphers   on;

        access_log                  /var/log/nginx/pypi.access.log;

        # try serving static files directly
        location ~ /\+f/ {
            error_page 418 = @pypi_backend;
            if ($request_method !~ (GET)|(HEAD)) {
                return 418;
            }

            expires max;
            try_files /+files$uri @pypi_backend;
        }

        # try serving docs directly
        location ~ /\+doc/ {
            try_files $uri @pypi_backend;
        }

        location / {
            error_page 418 = @pypi_backend;
            return 418;
        }

        location @pypi_backend {
            proxy_pass              http://pypi-backend; # Using the upstream definition
            proxy_redirect          off;
            proxy_set_header        Host $host;
            proxy_set_header        X-Real-IP $remote_addr;
            proxy_set_header        X-outside-url $scheme://$host:$server_port;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header        X-Forwarded-Host $server_name;
        }
    }
}

通过使用此配置的 Nginx 和在 http://localhost:8080 上运行的 devpi,您应该能够访问 https://localhost 或使用适当的 DNS https://example.co.uk 访问您的机器。请求将是:

client (HTTPS) > Nginx (HTTP) > devpi (HTTP) > Nginx (HTTPS) > client

这也意味着您需要确保 Nginx 自己运行,因为 devpi start 不会更好地知道。您至少应该看到一个 Nginx 欢迎页面。

【讨论】:

    猜你喜欢
    • 2019-02-18
    • 2020-12-22
    • 2018-09-07
    • 1970-01-01
    • 2016-11-06
    • 2017-01-19
    • 2012-11-14
    • 2011-02-25
    • 2020-12-24
    相关资源
    最近更新 更多