【问题标题】:Advice requested about configuring nginx for https有关为 https 配置 nginx 的建议
【发布时间】:2022-02-06 21:19:38
【问题描述】:

我想请教有关为 Flask 服务器(Centos 7、nginx 1.20.1)配置 nginx 和 https 的建议。

我已经定义了一个按设计工作的 RESTful API。我现在希望用户在调用 API 时能够使用以下任何地址:

http://mysiteapi.com

http://www.mysiteapi.com

https://mysiteapi.com

https://www.mysiteapi.com

我设置了一个通用的 nginx.conf 文件,它适用于前两个地址 (http)。然后我运行 sudo certbot --nginx -d mysite.com -d www.mysite.com。 https 地址现在可以使用,但 http 地址会出现 405 错误。这个 nginx.conf 文件如下所示。

这里的 301 重定向有什么明显的错误吗?更一般地说,是否有空间整理文件并减少“服务器”块的数量?我正在学习有关 nginx 的方法,希望得到任何指导。

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
#include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

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

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 4096;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

    server 
    {
        client_max_body_size 8M;
        server_name mysiteapi.com;
        location / 
        {
            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_pass http://unix:/home/andrew/myproject/myproject.sock;  
        }
    
        listen 443 ssl; # managed by Certbot
        ssl_certificate /etc/letsencrypt/live/mysiteapi.com/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/mysiteapi.com/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 
    {
        client_max_body_size 8M;
        server_name www.mysiteapi.com;
        location / 
        {
            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_pass http://unix:/home/andrew/myproject/myproject.sock;  
        }
    
        listen 443 ssl; # managed by Certbot
        ssl_certificate /etc/letsencrypt/live/mysiteapi.com/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/mysiteapi.com/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 = mysiteapi.com) 
        {
            return 301 https://$host$request_uri;
        } # managed by Certbot

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

        listen 80;
        server_name www.mysiteapi.com;
        return 404; # managed by Certbot
   }
}

【问题讨论】:

标签: http nginx https centos7


【解决方案1】:

我不确定为什么在普通 HTTP 请求中会出现 HTTP 405 错误,但我猜想这可能是因为 GET 以外的请求方法导致的 - HTTP 301 重定向会将任何请求方法更改为GET 一个,为了防止它,您应该改用 HTTP 308 重定向。但是正如我从您的问题中了解到的那样,您根本不需要任何重定向,HTTP 和 HTTPS 方案都应该平等地提供服务,如果您想实现这一点,您可以显着简化您的服务器块:

server {
    server_name mysiteapi.com www.mysiteapi.com;
    listen 80;
    listen 443 ssl;
    ... # rest of the config here
}

这里想参考this答案:

我不允许 certbot 创建我的 Web 服务器配置。坦率地说,我不相信它会做对,因为它已经在做一些不太有效的做法。

我的服务器也是这样,所以我建议你将这个位置添加到你的 nginx 配置中(你可以使用任何合适的目录而不是 /var/www):

location /.well-known/acme-challenge/ {
    root /var/www;
    try_files $uri =404;
}

并使用certbot 仅用于证书颁发/更新:

certbot certonly --webroot -w /var/www -d mysiteapi.com -d www.mysiteapi.com

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-03
    • 1970-01-01
    • 1970-01-01
    • 2018-12-05
    • 1970-01-01
    • 2016-08-23
    • 2017-06-08
    相关资源
    最近更新 更多