2016年5月14日 星期六

linux mint 架設 nginx https server 並支援 fastcgi

1. 先用 sudo 安裝 nginx http server 並支援 fastcgi
        sudo apt-get install nginx fcgiwrap

2. 修改 nginx 設定檔, 它位於 /etc/nginx/sites-available/default
    找尋 server {} 區塊, 以便增加 fastcgi 可支援 /cgi-bin/ 目錄, 加入以下設定, 並讓nginx doc root設定到 /usr/share/nginx/html 目錄:
   server {
     # ...
         root  /usr/share/nginx/html;       
         location /cgi-bin/ {
       gzip off;
      fastcgi_pass  unix:/var/run/fcgiwrap.socket;
      include /etc/nginx/fastcgi_params;
      fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    }
     #...
   }
   上述 fastcgi_param 指示當 http client 要求獲取 fastcgi_script_name時, 自動在該 fastcgi_script_name 前面增加 $document_root 目錄以便形成絕對位址找到正確路徑,此時 SCRIPT_FILENAME=$document_root$fastcgi_script_name. 


3. 同樣在 server區塊內, 可以增加  https  支援並監聽 443 port, 加入以下設定:
       listen 443 ssl;
ssl on;
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;

4. 產生 /etc/nginx/ssl 目錄, 並在該目錄下執行 openssl,  按照螢幕指令輸入資料, 便可產生兩個密鑰檔案  nginx.key 及  nginx.crt
      sudo mkdir /etc/nginx/ssl
      sudo cd /etc/nginx/ssl
      sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt

5. 重新啟動 nginx
      sudo service nginx restart

6. 如果成功, 使用瀏覽器開啟網址  https://127.0.0.1, 便可看到 nginx server 所顯示出的訊息

p.s.
1. nginx 的 config file 在 location 區塊可以利用 try_files 來取代 if 的語法, 或是用來找尋檔案, 但須注意的是只有最後一個參數會導致 nginx 內部重新導向(例如 cgi 程式等), 因此像是使用 script 所寫的檔案時就要小心, 僅適合放在最後一個參數, 若放在中間一旦被匹配到, 則導致 nginx 直接處理並將整個源碼(source code)傳送到客戶端(client). 因此最保險的作法是將源碼放在一個目錄(例如 /cgi-bin)裡, 再利用 location /cgi-bin { } 指引來設定該目錄存取方式, 在此區塊內不要使用 try_files,  如此一來存取到該目錄內的所有檔案就比較能獲得控制.
2. 在 config file 內每一行結尾要使用分號(;)做結束, 否則 service nginx restart 會顯示出錯誤訊息
3. 更新 nginx 到最新版讓它支援 http2, 目前最新版是1.10.0, 更新方法詳見文章: http://nginx.org/en/linux_packages.html#distributions
   (a)  下載 nginx key 檔案, 避免升級時產生警告,  並加入 apt-key
          sudo wget  http://nginx.org/keys/nginx_signing.key
          sudo apt-key add nginx_signing.key
       
   (b) 修改 /etc/apt/sources.list, 其中 codename 須依照系統自行修改, 我用的是 linux mint 17.3(用 unmae -a 查, 他其實是 ubuntu 14.04)所以 codename 是 trusty, 因此加入以下兩行文字
         deb http://nginx.org/packages/mainline/ubuntu/ trusty nginx
         deb-src http://nginx.org/packages/mainline/ubuntu/ trusty nginx
   (c) 接著再下達更新指令, 但更新前先備份好設定檔(例如 /etc/nginx/sites-available/default 等)
         sudo apt-get update
         sudo apt-get install nginx
   (d) 修改 /etc/nginx/sites-available/default 文件, 將 ssl 所需文字從剛剛備份檔複製貼上, 但須將listen 443 ssl 更改成  listen 443 ssl http2;並添加一行 ssl_ciphers AESGCM:HIGH:!aNULL:!MD5;
我的 /etc/nginx/sites-available/default 完整內容如下:

    server {
listen 443 ssl http2 default_server;
server_name localhost;
root /usr/share/nginx/html;
index index.html index.htm;
   location /cgi-bin/ {
    gzip off;
fastcgi_pass  unix:/var/run/fcgiwrap.socket;
include /etc/nginx/fastcgi_params;
    fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
}
location / {
try_files $uri $uri/ =404;
}
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
     ssl_ciphers AESGCM:HIGH:!aNULL:!MD5;
   }

   (e) 重新啟動 nginx
           sudo service nginx restart
   (f) 查看目前 nginx 版本:
            nginx -v
   (g) 用瀏覽器瀏覽 http://127.0.0.1 時他會自動重新導向 https://127.0.0.1 完成!
   (h) 要檢視 http2 是否真的有在運作, 參考文章:  https://www.nginx.com/blog/early-alpha-patch-http2/ 可以安裝 http/2 and SPDY indicator,如果是 chrome browser 安裝 plug-in :
https://chrome.google.com/webstore/detail/http2-and-spdy-indicator/mpbpobfflnpcgagjijhmgnchggcjblin?hl=en
如果是 firefox 則安裝 plug-in  : https://addons.mozilla.org/en-us/firefox/addon/spdy-indicator/

4. 如果發現 cgi 程式無法存取硬碟時目錄時, 可能是權限不足, 用 sudo 建立目錄並開放權限給 www-data
    sudo mkdir /usr/share/nginx/html/cgi-bin
    sudo mkdir /usr/share/nginx/html/cgi-bin/db
    sudo chown www-data. /usr/share/nginx/html/cgi-bin/db



沒有留言: