Nginx代理CMS的网站预览多个IP地址

第一次的海报,所以忍受着我。

我对Nginx相对来说比较陌生,但是设法弄清楚了我所需要的东西……直到现在。

Nginx v1.0.15代理到PHP-FPM v.5.3.10,它正在http://127.0.0.1:9000上监听。 [敲木头]一切运行顺利,在托pipe我们的CMS和许多网站。

现在,我们已经开发了我们的CMS并configuration了Nginx,使得每个支持的网站都有一个预览url(例如http:// [WebsiteID] .ourcms.com / ),您可以预测网站的位置, DNS尚未parsing到我们的服务器等。

具体而言,我们使用Nginx的Map模块( http://wiki.nginx.org/HttpMapModule )和CMS的server_name中的server_name中的正则expression式来1)从其预览URL中查找网站的主要域名,然后2)将请求转发到“匹配的”主域。

相应的Nginxconfiguration:

 map $host $h { 123.ourcms.com www.example1.com; 456.ourcms.com www.example2.com; 789.ourcms.com www.example3.com; } 

 server { listen [OurCMSIPAddress]:80; listen [OurCMSIPAddress]:443 ssl; root /var/www/ourcms.com; server_name ~^(.*)\.ourcms\.com$; ssl_certificate /etc/nginx/conf.d/ourcms.com.chained.crt; ssl_certificate_key /etc/nginx/conf.d/ourcms.com.key; location / { proxy_pass http://127.0.0.1/; proxy_set_header Host $h; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } 

(注意:我意识到server_name中的正则expression式由于安全原因应该是“更紧密”,并且只匹配网站ID的格式(即我们的情况下的UUID)。)

此configuration适用于我们99%的网站…除了那些为已安装的SSL证书提供专用IP地址的网站。 一个“502坏网关”返回这些,我不确定为什么。

这是我认为目前的configuration适用于任何匹配正则expression式的请求(例如http://123.ourcms.com/ ):

  1. Nginx从映射中查找网站的主要域,
  2. 作为proxy_pass http://127.0.0.1指令的结果,将请求传递回Nginx本身
  3. 由于被代理的请求有一个与网站的主域名对应的主机名,通过proxy_set_header Host $h指令,Nginx处理这个请求,就好像它是对该主机名的直接请求一样。

如果我在这个理解中错了, 纠正我。

我应该代理这些网站的专用IP地址吗? 我尝试过,但似乎没有工作? 代理模块中是否存在缺less的设置?

谢谢您的帮助。

MB

除了那些具有已安装的SSL证书的专用IP地址的设备。

它看起来像我只听一个IP地址。 您还需要为“SSL”域添加“监听”指令。 除非你有一个通配的SSL证书,否则我认为你需要为每个主机定义一个服务器定义。

下面是我使用的相关模式,如果您试图避免需要完全手动维护您的SSL Nginx域的configuration,可能会有所帮助:

我的Nginxconfiguration的一部分作为模板存储在源代码pipe理下。 Nginx的“init”脚本已经被修改,所以每当Nginx重新加载或重新启动时,都会调用一个Perl脚本,根据环境(alpha,beta,production等)填充模板variables。 一个新的纯文本文件被写出来,Nginx将“渲染的”模板作为一个包含文件。

这为自动化和干燥提供了新的可能性。 也许这会有助于你的情况。

对于任何可能遇到这种情况的人来说,解决scheme是以下Nginxconfiguration:

 # Map preview URLs to shared or dedicated IP addresses map $host $i { default [IP for Shared VHosts]; 123.ourcms.com [Dedicated IP Address 1]; # www.example1.com; 456.ourcms.com [Dedicated IP Address 2]; # www.example2.com; 789.ourcms.com [Dedicated IP Address 3]; # www.example3.com; } # Map preview URLS to appropriate hostname map $host $h { 123.ourcms.com www.example1.com; 456.ourcms.com www.example2.com; 789.ourcms.com www.example3.com; } ... # Configuration for "preview" server server { listen [OurCMSIPAddress]:80; listen [OurCMSIPAddress]:443 ssl; error_log /var/log/nginx/error-ourcms.com.log debug; root /var/www/ourcms.com; server_name ~^(.*)\.ourcms\.com$; ssl_certificate /etc/nginx/conf.d/ourcms.com.chained.crt; ssl_certificate_key /etc/nginx/conf.d/ourcms.com.key; location / { proxy_pass http://$i; proxy_set_header Host $h; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } 

诀窍,我认为@MarkStosberg暗指这一点,我不明白,是查找预览网站的主机名 IP地址。 此外,每个虚拟主机的服务器块必须包含listen [SharedIPForVhosts]:80而不是listen *:80