配置Nginx SSL Node.js環境詳細指南

edithfang發表於2014-09-21
Nginx是一款高效能的HTTP伺服器,同時也是一款高效的反向代理伺服器。不像傳統的伺服器,Nginx是基於事件驅動的非同步架構,記憶體佔用少但是效能很好。如果你的Web應用是基於Node.js的,那麼建議你考慮使用Nginx來做反向代理,因為Nginx可以非常高效地提供靜態檔案服務。本文的主要內容是在不同的作業系統下配置Nginx和SSL,並且搭建一個Node.js執行環境。

安裝Nginx

假設你已經在伺服器上安裝了Node.js,下面我們來安裝Nginx。

在Mac系統上安裝Nginx

利用chown命令來獲取訪問/usr/local資料夾的許可權,命令程式碼如下:
sudo chown -R ‘username here’ /usr/local
接下來的兩行命令就可以安裝Nginx了:
brew link pcre
brew install nginx
Nginx安裝完畢後,你可以用下面的命令來啟動Nginx
sudo nginx
最後你可以在目錄/usr/local/etc/nginx/nginx.conf下看到Nginx的配置檔案。

在Ubuntu上安裝Nginx

如果你使用Ubuntu,那麼可以用以下方式安裝Nginx:
sudo apt-get update
sudo apt-get install nginx
Nginx安裝完成後便可自動啟動。

在Windows下安裝Nginx

windows版本的nginx可以在這裡下載,接下來將安裝包解壓放到指定目錄下,在cmd命令工具下執行以下程式碼:
unzip nginx-1.3.13.zip
cd nginx-1.3.13
start nginx
同樣,start nginx命令會讓nginx啟動完成。

現在我們已經安裝完Ngnix,接下來該配置伺服器了。

配置Node.js伺服器

首先我們來建立一個簡單的Node.js伺服器,你可以在這裡下載Express版本的Node.js。下載原始碼後,將其解壓至demoApp資料夾下,並且輸入以下命令讓伺服器在3000埠上啟動。
npm install
node bin/www
1
<h2 id=”configuring-nginx”>Configuring Nginx</h2>
<p>Now let’s open up Nginx config file. As I am on Mac, I can just use nano to start editing the file:</p>
1
nano /usr/local/etc/nginx/nginx.conf
如果需要,你也可以直接到資料夾下用你最喜歡的文字編輯器開啟config檔案,你可以在檔案中找到server 配置節點,類似下面的程式碼:
server {
listen       8080;
server_name  localhost;
….
more config goes here
}
接下來我們將對server 節點作一些符合自己需求的配置,我們需要把網站中的靜態檔案請求交給Nginx處理,其他的檔案請求則交給Node.js後端伺服器。我們將用下面的程式碼替換上面的server 配置節點:
server {
listen       8080;
server_name  localhost;
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection ‘upgrade’;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
location /public {
root /usr/local/var/www;
}
}
這樣我們就讓Nginx在http://localhost:8080. 上監聽了。location / 配置節點將告訴Nginx接收任意的請求,location 配置節點中我們用proxy_pass 指定了Node.js的後端伺服器為http://localhost:3000 。

現在我們要用另外一個配置節點location /public 來告訴Nginx處理靜態檔案請求,其中內部的location 節點設定了根目錄為/usr/local/var/www. 當然你也可以換成其他的目錄。如此一來,當有類似這樣的請求http://localhost:8080/public/somepath/file.html ,Nginx都會從/usr/local/var/www/public/somepath/file.html讀取靜態檔案。

修改完配置檔案後,你需要用下面的程式碼來重啟Nginx:

Mac:
sudo nginx -s stop && sudo nginx
Ubuntu:
sudo service nginx restart
或者
sudo /etc/init.d/nginx restart
Windows:
nginx -s reload
接下來我們來用Nginx來代替Node.js提供CSS樣式檔案,Node.js模板用的是/public/stylesheets/style.css 下面的檔案。在/usr/local/var/www/public/stylesheets 資料夾下建立一個名為style.css 的檔案,Nginx將會正確地解析到它。比如你可以在CSS檔案中寫入以下程式碼:
body {
padding: 50px;
font: 14px “Lucida Grande”, Helvetica, Arial, sans-serif;
}
a {
color: #00B7FF;
}
然後你可以登入到http://localhost:8080 下來看自己的web應用,你會發現儘管是訪問Nginx伺服器,但是請求都是通過真實的Node.js後端伺服器處理的,只有CSS靜態檔案由Nginx處理。

建立SSL

網站產品做多了,你會發現需要建立SSL來保護敏感的資訊。可能你第一反應會想到從證書頒發機構申請網站證書,但是你也可以建立簽名證書。唯一的問題就是瀏覽器端會提示“該證書不可信”的警告資訊,但是作為本地測試,這也就足夠了。這裡有一篇教程講解了如何自己建立簽名SSL證書,可以看看。

當你有了自己的證書,你就可以在Nginx上安裝SSL了,修改後的配置檔案,程式碼如下:
server {
listen       8080;
listen       443 ssl;
server_name  localhost;
ssl_certificate  /etc/nginx/ssl/server.crt
ssl_certificate_key /etc/nginx/ssl/server.key
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection ‘upgrade’;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
location /public {
root /usr/local/var/www;
}
}
完成了!這樣當你訪問https://localhost:8080 的時候SSL就可以開始工作了。這裡我們預設將證書儲存在/etc/nginx/ssl/server.crt 目錄下。將私鑰儲存在/etc/nginx/ssl/server.key 目錄下,你也可以改變儲存的目錄。

總結

本文中我們學到了如何用Nginx為Node.js做反向代理,並且配置SSL。由Nginx在前端處理靜態檔案請求,這可以為Node.js後端伺服器大大減輕壓力。自己嘗試一下吧,有什麼問題可以在評論中交流。

英文原文:Configuring Nginx and SSL with Node.js

翻譯作者:碼農網 – 小峰
相關閱讀
評論(2)

相關文章