题 nginx HTTPS使用与HTTP相同的配置


有没有办法跨两个nginx共享配置指令 server {} 块?我想避免重复规则,因为我的网站的HTTPS和HTTP内容是使用完全相同的配置提供的。

目前,它是这样的:

server {
  listen 80;
  ...
}

server {
  listen 443;

  ssl on; # etc.
  ...
}

我可以做一些事情:

server {
  listen 80, 443;
  ...

  if(port == 443) {
    ssl on; #etc
  }
}

174
2018-05-21 16:18






答案:


你可以将它组合成一个服务器块,如下所示:

server {
    listen 80;
    listen 443 default_server ssl;

    # other directives
}

官方指导


238
2018-05-21 18:54



啊,我不知道如果通过端口80加载,nginx足够聪明,可以忽略SSL指令。真棒! - ceejayoz
nginx是各种WIN。 - Jauder Ho
如果你在一台服务器上有几个站点,值得一提的是“默认”不是强制性的 - luchaninov
这么优雅很痛...... - Alix Axel
不在这里工作......“普通的HTTP请求被发送到HTTPS端口” - gcstr


为了澄清已接受的答案,您需要省略

SSL on;

你只需要在0.8.21之后获得nginx版本的以下内容

listen 443 ssl;

参考:

Nginx文档 - 配置单个HTTP / HTTPS服务器


81
2018-06-13 06:19



谢谢!我无法弄清楚为什么http上没有任何工作。删除SSL;工作。 - Chris Cummings


我不知道你建议的方式,但肯定有一种简单易行的方法。

将公共服务器设置移动到单独的文件中,即“serverFoo.conf”然后 include 它是分开的 server {} 像这样的块:

server {
    listen 80;
    include serverFoo.conf;
}
server {
    listen 443 ssl;
    include serverFoo.conf;
}

25
2018-05-21 18:38



+1 =适合我。 (无法使用其他方法。) - lackey
此外,如果充当负载均衡器,则另一个示例不考虑'proxy_pass'。 - Mike Purcell
如果你的话,这个选项很棒 server_name 每个端口都不同 - iDev247
不要使用ssl,使用 listen 443 ssl; 从现在开始。 - danger89
这似乎是最近使用nginx 1.10.1的唯一解决方案。出于某种原因两个 listen 行未正确解释,但将它们移动到单独的行 server{} 解决它。 - Artur Bodera


扩展已经有用的答案,这是一个更完整的例子:

server {

    # Listen on port 80 and 443
    # on both IPv4 and IPv6
    listen 80;
    listen [::]:80 ipv6only=on;
    listen 443 ssl;
    listen [::]:443 ipv6only=on ssl;

    # Set website folder
    root /path/to/your/website;

    # Enable SSL
    ssl_certificate your-cert.pem;
    ssl_certificate_key your-cert.key;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv3:+EXP;
    ssl_prefer_server_ciphers on;
}

7
2018-05-10 17:48



我知道这是一个非常古老的答案,但由于它非常完整,我只想指出可能使用它的其他人,你应该禁用SSLv3协议,因为它容易受到POODLE漏洞的影响: disablessl3.com  而是使用:ssl_protocols TLSv1 TLSv1.1 TLSv1.2; - user147787


只是为了添加到Igor / Jauder的帖子,如果您正在收听特定的IP,您可以使用:

listen xxx.xxx.xxx.xxx;
listen xxx.xxx.xxx.xxx:443 default ssl;

4
2018-02-25 13:11