Nginx

通過 suburi 隔離多個具有單個域的 nginx ssl 應用程序的策略?

  • October 7, 2012

警告:到目前為止,我只學習瞭如何使用 nginx 為具有自己的域和伺服器塊的應用程序提供服務。但我認為是時候深入一點。

為了減少對多個 SSL 證書或昂貴的萬用字元證書的需求,我想從一個 nginx server_name 提供多個應用程序(例如 rails 應用程序、php 應用程序、node.js 應用程序)。例如 rooturl/railsapp rooturl/nodejsapp rooturl/phpshop rooturl/phpblog

我不確定理想的策略。我見過或想到的一些例子:

  1. 多個位置規則,這似乎會導致各個應用程序配置要求之間發生衝突,例如不同的重寫和訪問要求
  2. 通過後端內部埠隔離應用程序,這可能嗎?每個埠路由到自己的配置?所以配置是隔離的,可以根據應用需求定制。
  3. 反向代理,我對它的工作原理一無所知,這是我需要研究的嗎?這實際上是上面的2嗎?線上幫助似乎總是代理到另一台伺服器,例如 apache

什麼是隔離通過子 uri 從單個域提供的應用程序的配置要求的有效方法?

Nginx 可以做很多事情,包括反向代理、記憶體和服務內容,但在大型環境中,各個功能被拆分以使它們更易於維護或專門使用更適合的替代方案(如用於大容量 https:// 的螺柱)。

反向代理只是指位於客戶端和實際應用程序之間的東西。它實際上是用詞不當,應該稱為“伺服器代理”。

要在一個域上提供一個證書的所有內容,請從以下內容開始:

(在 Ubuntu LTS 12.04 上測試)

/etc/nginx/proxy_params

#proxy_set_header Host            $proxy_host; # instead of standard $host
proxy_set_header  X-Real-IP       $remote_addr;
proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;

/etc/nginx/sites-enabled/global_redirects

# note: must disable the built-in 
#       /etc/nginx/sites-enabled/default by removing it (it's a symlink) 
server {

   # redirects all http:// requests to https://
   # critically, passes the original host the client was trying to connect to.
   rewrite ^ https://$host$request_uri? permanent;

   # combined redirect access and error logs for easier correlation
   error_log  '/var/log/nginx/global_redirects';
   access_log '/var/log/nginx/global_redirects';

}

/etc/nginx/sites-enabled/global_ssl

# This serves all enabled-locations over ssl only.
# If there's no match, it shows the default site.

include /etc/nginx/upstreams-enabled/*; # include enabled upstream proxies

server {

   listen 443 ssl;

   ssl_certificate      /etc/nginx/server.crt;
   ssl_certificate_key  /etc/nginx/server.key;

   keepalive_timeout    70;

   root /usr/share/nginx/www;
   index index.html index.htm;

   access_log '/var/log/nginx/global_ssl';
   error_log  '/var/log/nginx/global_ssl';

   include /etc/nginx/locations-enabled/*;

}

/etc/nginx/locations-enabled/bar

# points to hackernews but
# it could be http://10.2.4.5:401/app495 instead
location ~ ^/bar(/.*)?$ {

   include proxy_params;
   include apps/node;

   proxy_pass       http://news.ycombinator.com/$1;

   access_log '/var/log/nginx/bar';
   error_log  '/var/log/nginx/bar';

}

/etc/nginx/locations-enabled/foo

location ~ ^/foo(/.*)?$ {

   include proxy_params;
   include apps/ruby;

   proxy_pass       http://www.linode.com/$1;

   access_log '/var/log/nginx/foo';
   error_log  '/var/log/nginx/foo';

}

/etc/nginx/upstreams-enabled/news.ycombinator.com

upstream news.ycombinator.com {
 server news.ycombinator.com;
}

/etc/nginx/upstreams-enabled/www.linode.com

upstream www.linode.com {
 server www.linode.com;
}

/etc/nginx/apps/ruby

# Place ruby specific directives here

/etc/nginx/apps/節點

# Place node specific directives here

請記住,這不會重寫頁面中的 url,因為它們是由每個應用程序生成的。相反,每個應用程序都應該知道它的外部方案、主機、埠和 url 基礎並適當地生成連結(大多數實際應用程序都支持這一點)。

參考:

  1. http://wiki.nginx.org/HttpProxyModule
  2. http://wiki.nginx.org/HttpSslModule

引用自:https://serverfault.com/questions/435535