Windows下Nginx配置支援HTTPS協議(已申請正式的SSL證書和私鑰的,前三步可以跳過)
以Windows 10系統為例。
一、安裝OpenSSL
然後安裝在C:\OpenSSL-Win64下。
然後配置環境變數。在系統環境變數中新增環境變數:
變數名:OPENSSL_HOME
變數值:C:\OpenSSL-Win64\bin;
(變數值為OPENSSL安裝位置下的bin目錄)
並在Path變數結尾新增一條: %OPENSSL_HOME%
二、安裝Nginx
到Nginx官網下載Nginx,我這裡下載的是 nginx/Windows-1.12.0 這個版本。
把下載好的壓縮包解壓出來,拷貝其中的nginx-1.12.0目錄到c:\下。並將資料夾名字修改為nginx。這樣,Nginx就被安裝到了c:\nginx目錄下。
進入到C:\nginx目錄下,雙擊nginx.exe檔案即可啟動伺服器。在瀏覽器位址列輸入http://localhost,如果可以成功訪問到Nginx的歡迎介面,則說明安裝成功。
三、生成證書
1、首先在Nginx安裝目錄中建立ssl資料夾用於存放證書。比如我的檔案目錄為 C:\nginx\ssl
在控制檯中執行:
cd C:\nginx\ssl
2、建立私鑰
在命令列中執行命令:
openssl genrsa -des3 -out test.key 1024 # test檔名是自己隨便起即可
輸入密碼後,再次重複輸入確認密碼。記住此密碼,後面會用到。
3、建立csr證書
在命令列中執行命令:
openssl req -new -key test.key -out test.csr
其中key檔案為剛才生成的檔案。
執行上述命令後,需要輸入一系列的資訊。輸入的資訊中最重要的為Common Name,這裡輸入的域名即為我們要使用https訪問的域名 ,比如我輸入的是localhost。其它的內容隨便填即可。
以上步驟完成後,ssl資料夾內出現兩個檔案:test.csr 和 buduhuis.key
4、去除密碼。
在載入SSL支援的Nginx並使用上述私鑰時除去必須的口令,否則會在啟動nginx的時候需要輸入密碼。
複製test.key並重命名為test.copy.key。
在命令列中執行如下命令以去除口令:
openssl rsa -in test.copy.key -out test.key
然後輸入密碼,這個密碼就是上文中在建立私鑰的時候輸入的密碼。
5、生成crt證書
在命令列中執行此命令:
openssl x509 -req -days 365 -in test.csr -signkey test.key -out test.crt
至此,證書生成完畢。我們發現,ssl資料夾中一共生成了4個檔案。下面,配置https伺服器的時候,我們需要用到的是其中的test.crt和test.key這兩個檔案。
四、修改Nginx的nginx.conf配置檔案
我的這個檔案在C:\nginx\conf目錄下。用任意一個編輯器(如Sublime Text之類)開啟這個nginx.conf檔案。
找到HTTPS server配置的那一段(即包含有listen 443 ssl配置那一段)。我們發現這段程式碼被註釋掉了。所以,首先我們把該段程式碼前面的#號去掉。然後分別修改其中的ssl_certificate和ssl_certificate_key配置項為剛才所生成的test.crt和test.key這兩個檔案的目錄。並配置server_name為localhost。修改後的該段配置如下:
server {
listen 443 ssl;
server_name localhost;
ssl_certificate C://nginx//ssl//test.crt; # 這個是證書的crt檔案所在目錄
ssl_certificate_key C://nginx//ssl//test.key; # 這個是證書key檔案所在目錄
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root html; # 這個是指定一個專案所在目錄
index index.html index.htm; # 這個是指定首頁的檔名
}
}
注意一下那兩個證書的檔案路徑的寫法。
五、Nginx的常用操作
在繼續後面的內容之前,先簡單介紹下Windows命令列中操作Nginx的幾個常用的語句:
start nginx # 啟動Nginx
nginx.exe -s stop # 快速停止Nginx,可能並不儲存相關資訊
nginx.exe -s quit # 完整有序的停止Nginx,並儲存相關資訊
nginx.exe -s reload # 重新載入Nginx,當配置資訊修改,需要重新載入這些配置時使用此命令。
nginx.exe -s reopen # 重新開啟日誌檔案
nginx -v # 檢視Nginx版本
因為修改了配置檔案,所以需要退出控制檯,並重新開啟一個控制檯。執行如下命令:
cd c:\nginx
nginx.exe -s quit
start nginx
即退出Nginx,然後再重新啟動它。這時候,在瀏覽器位址列輸入https://localhost並回車。
這時候,你可能看到“您的連線不是私密連線”的提示,單擊頁面中的“高階”,並接著單擊“繼續前往m.test.com(不安全)”,就可以看到Nginx的歡迎介面了。說明https伺服器已經配置成功了。
如果你只想用https://localhost訪問這個https伺服器,那麼下面的內容你就不用接著往下看了。
但是,也許你可能還想要用一個別的域名(例如:https://m.test.com)來訪問這個伺服器。那麼怎麼做呢?這就需要繼續往下看了。
六、修改hosts配置,實現域名對映
要想用別的域名來訪問上文配置好的https伺服器,也很簡單,修改hosts配置就可以了。你可以到這裡下載一個hosts管理工具——SwitchHosts。安裝號好之後,以管理員身份執行它。並新增上一個hosts項:
127.0.0.1 m.test.com
順便提一下,關於Mac環境下如何對映一個http路徑到一個https路徑,可以通過Charles工具來實現。參見這裡。
七、可能遇到的問題及其解決辦法
1、埠被佔用
完成上述工作之後,在啟動nginx的時候,可能提示埠被佔用或者雖然沒有出錯提示,但是訪問https頁面卻訪問不到的情況,這時候,你需要檢查一下443埠是否已經被佔用了。
可以用如下命令檢視:
netstat -ano | findstr 443
一般來說,如果有程式在佔用的話,輸出的第一行的最後一列就是佔用了443埠的PID。
找到這個PID之後,我們就用如下命令強制結束它:
taskkill /F /IM 這裡輸入上面找出來的PID
2、出現錯誤提示:“您的連線不是私密連線”
點選頁面最底部的“高階”,然後點“繼續前往WALLET.WALLET.COM(不安全)”
3、靜態的頁面資源在開發者工具的Network中顯示的Status為failed
可以在開發者工具的Network中的該資源上右鍵單擊它,然後選擇“Open in new tab”,接著會提示“您的連線不是私密連線”,然後按照上面的問題2的處理方式進行處理就可以了。本質上與上一個問題是同樣的問題,只不過因為你的靜態資源域名和頁面域名用的不是同一個罷了。
4、忘記配置hosts,導致訪問到的不是你本機上的服務的問題
只需要配置好host就可以了。注意,如果你的頁面域名、靜態資源域名兩者是不一樣的話,那麼兩者都需要配置hosts中,比如:
127.0.0.1 m.paian.com 127.0.0.1 static.pain.com
5、出現許可權不足的問題
這時候,你只需要以管理員身份開啟命令列工具,再正常進行操作即可。