Nginx是一個(gè)非??焖伲?jīng)過(guò)測(cè)試,易于配置的HTTP服務(wù)器和代理。雖然Vapor支持使用或不使用TLS直接提供HTTP請(qǐng)求,但是Nginx后面的代理可以提供更高的性能,安全性和易用性。
注意
我們建議代理Nginx后面的Vapor HTTP服務(wù)器。
概述(Overview)
代理HTTP服務(wù)器意味著什么?簡(jiǎn)而言之,代理人作為公共互聯(lián)網(wǎng)和HTTP服務(wù)器之間的中間人。請(qǐng)求到代理,然后發(fā)送到Vapor。
這個(gè)中間人代理的一個(gè)重要特征是它可以改變甚至重定向請(qǐng)求。例如,代理可以要求客戶(hù)端使用TLS(https),速率限制請(qǐng)求,甚至可以在不與您的Vapor應(yīng)用程序通信的情況下提供公共文件。

更多細(xì)節(jié)(More Detail)
用于接收HTTP請(qǐng)求的默認(rèn)端口是80端口(HTTPS是443端口)。當(dāng)您將Vapor服務(wù)器綁定到80端口時(shí),它將直接接收并響應(yīng)到您的服務(wù)器的HTTP請(qǐng)求。當(dāng)添加像Nginx這樣的代理程序時(shí),可以將Vapor綁定到內(nèi)部端口,如8080端口。
注意
大于1024的端口不需要sudo綁定。
當(dāng)Vapor綁定到80端口或443端口時(shí),外部互聯(lián)網(wǎng)不可訪(fǎng)問(wèn)。然后,您將Nginx綁定到80端口,并將其配置為將請(qǐng)求路徑到8080端口(或您選擇的任何端口)上綁定的Vapor服務(wù)器。
就是這樣 。如果Nginx配置正確,您會(huì)看到您的Vapor應(yīng)用程序響應(yīng)80端口上的請(qǐng)求。Nginx在不可見(jiàn)的情況下代理請(qǐng)求和響應(yīng)。
安裝Nginx(Install Nginx)
第一步是安裝Nginx。Nginx的一個(gè)重要部分是圍繞它的大量社區(qū)資源和文檔。因此,我們不會(huì)在這里詳細(xì)介紹Nginx,因?yàn)閹缀蹩隙〞?huì)有一個(gè)專(zhuān)門(mén)的平臺(tái)、操作系統(tǒng)和提供程序的教程。
教程:
- 如何在Ubuntu 14.04 LTS上安裝Nginx
- 如何在Ubuntu 16.04上安裝Nginx
- 如何在Heroku上部署Nginx
- 如何在Ubuntu 14.04的Docker容器中運(yùn)行Nginx
APT
Nginx可以通過(guò)APT安裝。
sudo apt-get update
sudo apt-get install nginx
在瀏覽器中訪(fǎng)問(wèn)服務(wù)器的IP地址,檢查Nginx是否正確安裝
http://server_domain_name_or_IP
服務(wù)(Server)
該服務(wù)可以啟動(dòng)或停止。
sudo service nginx stop
sudo service nginx start
sudo service nginx restart
引導(dǎo)蒸氣(Booting Vapor)
Nginx可以用sudo service nginx ...命令啟動(dòng)一個(gè)停止。您將需要類(lèi)似啟動(dòng)和停止您的Vapor服務(wù)器的東西。
有很多方法可以做到這一點(diǎn),它們?nèi)Q于您要部署的平臺(tái)。查看管理員說(shuō)明,添加啟動(dòng)和停止Vapor應(yīng)用程序的命令。
配置代理(Configure Proxy)
在/etc/nginx/sites-enabled/里可以找到啟用的站點(diǎn)的配置文件。
創(chuàng)建一個(gè)新的文件或復(fù)制示例模板從/etc/nginx/sites-available/開(kāi)始。
下面是一個(gè)示例配置文件,用于在主目錄中名為Hello的Vapor項(xiàng)目。
server {
server_name hello.com;
listen 80;
root /home/vapor/Hello/Public/;
location @proxy {
proxy_pass http://127.0.0.1:8080;
proxy_pass_header Server;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass_header Server;
proxy_connect_timeout 3s;
proxy_read_timeout 10s;
}
}
這個(gè)配置文件假設(shè)Hello項(xiàng)目在生產(chǎn)模式下啟動(dòng)時(shí)綁定到8080端口。
服務(wù)文件(Serving Files)
Nginx也可以提供公共文件,而不要求您的Vapor應(yīng)用程序。這可以通過(guò)在重負(fù)載下為其他任務(wù)釋放Vapor的過(guò)程來(lái)提高性能。
server {
...
# Serve all public/static files via nginx and then fallback to Vapor for the rest
try_files $uri @proxy;
location @proxy {
...
}
}
TLS
添加TLS相對(duì)簡(jiǎn)單,只要證書(shū)已經(jīng)被正確地生成的。免費(fèi)生成TLS證書(shū),請(qǐng)查看 Let's Encrypt。
server {
...
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/hello.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/hello.com/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_stapling on;
ssl_stapling_verify on;
add_header Strict-Transport-Security max-age=15768000;
...
location @proxy {
...
}
}
上面的配置是使用Nginx的TLS的相對(duì)嚴(yán)格的設(shè)置。這里的一些設(shè)置不是必需的,但增強(qiáng)安全性。