【问题标题】:NGINX server config with Lets Encrypt SSL, HTTP 2, and redirects使用 Lets Encrypt SSL、HTTP 2 和重定向的 NGINX 服务器配置
【发布时间】:2019-09-16 17:59:19
【问题描述】:

最近,我尝试升级我的服务器配置以支持 HTTP 2,并注意到当浏览器尝试在没有 SSL 的情况下加载站点时,它会下载一个 50 字节的二进制文件。

配置如下。

它按预期工作 - 通过重定向将请求升级到 HTTPS - 直到我在最后重定向的 listen 指令中添加了 http2

后果是现在缓存了不安全的 HTTP 请求,这非常糟糕,但是我想了解为什么会发生这种情况以及我应该如何配置我的服务器

我已经从重定向 listen 指令中删除了 http2

我认为最好向浏览器指定服务器完全支持 http2,但它没有按计划进行 - 由于某种原因,响应类型没有以 html 格式发送。

为什么会这样?

server {
    root /var/domains/mywebsite.com/html;
    error_log off;
    access_log off;
    index index.php index.html;
    server_name mywebsite.com;

    gzip on;
    gzip_types text/plain application/xml application/json application/javascript;

    location /service-worker.js {
        add_header Cache-Control "max-age=0, no-cache, no-store, must-revalidate";
        expires off;
        access_log off;
    }

    location / {

        try_files $uri $uri/ /index.html;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
    }

    location ~ /\.ht {
        deny all;
    }

    listen 443 ssl http2;
    ssl_certificate /etc/letsencrypt/live/mywebsite.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/mywebsite.com/privkey.pem; # managed by Certbot
    # include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_ciphers "EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5";
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}

server {
    error_log off;
    access_log off;
    server_name www.mywebsite.com;


    location ~ {
            rewrite ^/(.*)$ https://mywebsite.com/$1 permanent;
    }

    listen 443 ssl http2;
    ssl_certificate /etc/letsencrypt/live/mywebsite.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/mywebsite.com/privkey.pem; # managed by Certbot
    # include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_ciphers "EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5";
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}

server {
    server_name mywebsite.com;

    if ($host = mywebsite.com) {
        return 301 https://$host$request_uri;
    }

    listen 80 http2;
    return 404;
}

server {
    server_name www.mywebsite.com;

    if ($host = www.mywebsite.com) {
        return 301 https://$host$request_uri;
    }

    listen 80 http2;
    return 404;
}

【问题讨论】:

  • 不知道为什么会这样,但是每个浏览器都需要 https 才能使用 HTTP/2,所以建议你只为你的 443 配置打开它。
  • @BarryPollard 这是一个很好的观点!所以我想知道这是否代表 nginx 未能认识到它不应该尝试发送 http2 响应
  • 这让我想起了我之前看到的错误!:trac.nginx.org/nginx/ticket/816。添加了答案。

标签: nginx http2


【解决方案1】:

Nginx 不允许在非 HTTPS 连接上使用 HTTP/2 和 HTTP/1。此处提出的错误:https://trac.nginx.org/nginx/ticket/816.

web browsers only use HTTP/2 over HTTPS 一样,非 HTTPS HTTP/2(又名 h2c)连接没有什么意义,因此为什么尚未优先修复此错误。

所以从您的端口​​ 80 服务器配置中删除 http2 并将其留给您的端口 443 配置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-16
    • 2019-02-19
    • 1970-01-01
    • 2017-04-28
    • 2023-03-15
    相关资源
    最近更新 更多