Nginx
通過 suburi 隔離多個具有單個域的 nginx ssl 應用程序的策略?
警告:到目前為止,我只學習瞭如何使用 nginx 為具有自己的域和伺服器塊的應用程序提供服務。但我認為是時候深入一點。
為了減少對多個 SSL 證書或昂貴的萬用字元證書的需求,我想從一個 nginx server_name 提供多個應用程序(例如 rails 應用程序、php 應用程序、node.js 應用程序)。例如 rooturl/railsapp rooturl/nodejsapp rooturl/phpshop rooturl/phpblog
我不確定理想的策略。我見過或想到的一些例子:
- 多個位置規則,這似乎會導致各個應用程序配置要求之間發生衝突,例如不同的重寫和訪問要求
- 通過後端內部埠隔離應用程序,這可能嗎?每個埠路由到自己的配置?所以配置是隔離的,可以根據應用需求定制。
- 反向代理,我對它的工作原理一無所知,這是我需要研究的嗎?這實際上是上面的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 基礎並適當地生成連結(大多數實際應用程序都支持這一點)。
參考: