有没有一种方法可以在两个nginx server {}块之间共享配置指令?我想避免重复规则,因为我的网站的HTTPS和HTTP内容使用完全相同的配置来提供。

当前,它是这样的:

server {
  listen 80;
  ...
}

server {
  listen 443;

  ssl on; # etc.
  ...
}


我可以按照以下方式做些什么:

#1 楼

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

server {
    listen 80;
    listen 443 default_server ssl;

    # other directives
}


官方方法

评论


啊,我不知道nginx足够聪明,可以忽略通过端口80加载的SSL指令。太棒了!

–ceejayoz
09年5月21日在19:34

nginx是各种各样的WIN。

–何J
09年5月21日在19:38

并且如果您在一台服务器上有多个站点,则值得一提的是,“默认”不是必须的

–luchaninov
2011年7月1日15:32

太优雅了,很疼...

– Alix Axel
2012年11月24日在1:39

在这里不起作用...“普通的HTTP请求已发送到HTTPS端口”

– gcstr
2014年8月18日下午3:55

#2 楼

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

SSL on;


,而对于0.8.21之后的nginx版本,您只需要以下内容

listen 443 ssl;


参考文献:

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

评论


谢谢!我不知道为什么http上的任何内容都不起作用。删除SSL;工作了。

–克里斯·卡明斯(Chris Cummings)
2014年2月14日下午16:27

#3 楼

我不知道像您建议的方法,但是肯定有一种简单且可维护的方法。

将常用服务器设置移动到单独的文件中,即“ serverFoo.conf”,然后分别将其include server {}块如下所示:

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


评论


+1 =对我有用。 (无法使其与其他方法一起使用。)

–user11480
09年7月3日在15:44

另外,如果充当负载平衡器,则另一个示例不考虑“ proxy_pass”。

–迈克·珀塞尔(Mike Purcell)
13年4月24日在23:34

如果每个端口的server_name不同,则此选项很好

– iDev247
13-10-3在6:40

不要使用ssl on,请使用listen 443 ssl;从现在开始。

–danger89
16-3-22在21:47

这似乎是使用最新的nginx 1.10.1的唯一解决方案。由于某些原因,两条侦听线无法正确解释,但是将它们移至单独的服务器{}可以对其进行修复。

– Artur Bodera
16年8月1日在10:54

#4 楼

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

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;
}


评论


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

–user147787
2015年1月6日23:32



#5 楼

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

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