nginx實現https訪問
背景:
項目背景是在開發APP發佈平臺,ios的安裝包的下載和自動更新等操作需要https獲取plist文件,所以需要通過配置nginx的SSL模塊來支持HTTPS訪問,也就是說,要做一個網站域名爲 域名.com 要求通過HTTPS://域名.com進行訪問.
SSL英文名爲Secure Socket Layer,安全套接字層。SSL是一種數字證書,它使用ssl協議在瀏覽器和web server之間建立一條安全通道,數據信息在client與server之間的安全傳輸.
一,環境準備
1.安裝nginx,2.獲取安全證書
1.安裝nginx(已安裝可以跳過)
第一步:下載nginx壓縮包
nginx官方下載地址:http://nginx.org/en/download.html
wget命令下載:
wget -c https://nginx.org/download/nginx-1.16.1.tar.gz
注意:這一步最好在自己的目標目錄進行操作,我一般是把壓縮包下載到/usr/local目錄下。
第二步:配置nginx安裝所需的環境
1. 安裝gcc
安裝 nginx 需要先將官網下載的源碼進行編譯,編譯依賴 gcc 環境。安裝指令如下:
yum install gcc-c++
2. 安裝PCRE pcre-devel
Nginx的Rewrite模塊和HTTP核心模塊會使用到PCRE正則表達式語法。這裏需要安裝兩個安裝包pcre和pcre-devel。第一個安裝包提供編譯版本的庫,而第二個提供開發階段的頭文件和編譯項目的源代碼。安裝指令如下:
yum install -y pcre pcre-devel
3.安裝zlib
zlib庫提供了開發人員的壓縮算法,在Nginx的各種模塊中需要使用gzip壓縮。安裝指令如下:
yum install -y zlib zlib-devel
4.安裝Open SSL
nginx不僅支持 http協議,還支持 https(即在 ssl 協議上傳輸 http),如果使用了 https,需要安裝 OpenSSL 庫。安裝指令如下:
yum install -y openssl openssl-devel
第三步:解壓nginx壓縮包並安裝
將壓縮包進行解壓
tar -zxvf nginx-1.16.1.tar.gz
解壓之後,進入加壓文件,即cd nginx-1.16.1。
然後進行配置,推薦使用默認配置,直接./configure就好了,如下圖所示:
第四步:編譯安裝nginx
這裏和redis的編譯安裝比較類似,首先在當前目錄(/usr/local/nginx-1.16.1)進行編譯。輸入make即可
make
然後回車,如果編譯出錯,請檢查是否前面的4個安裝都沒有問題。
編譯成功之後,就可以安裝了,輸入以下指令:
make install
ok,安裝成功。
這時候返回上一級目錄,就會發現多了nginx目錄,接下來,啓動nginx。
第五步:啓動nginx
進入/usr/local/nginx/sbin目錄,輸入./nginx即可啓動nginx
./nginx
關閉nginx
./nginx -s quit 或者 ./nginx -s stop
重啓nginx
./nginx -s reload
查看nginx進程
ps aux|grep nginx
設置nginx開機啓動,只需在rc.local增加啓動代碼即可。
vim /etc/rc.local
然後在底部增加/usr/local/nginx/sbin/nginx
nginx配置文件
/usr/local/nginx/conf目錄可修改nginx的配置文件 -> vim nginx.conf
修改域名以及端口等
2.ssl證書:
1. 配置SSL模塊首先需要CA證書,CA證書可以自己手動頒發也可以在阿里雲申請,本人在騰訊雲上申請的證書。
2. 默認情況下ssl模塊並未被安裝,如果要使用該模塊則需要在編譯nginx時指定–with-http_ssl_module參數.
獲取證書:
在成功購買域名並通過備案後
1.進入控制檯
2.下載證書
下載下來的文件:
nginx文件下:
二、實現nginx+https
1.安裝ssl模塊
正常安裝nginx一般ssl模塊並未被安裝
默認情況下ssl模塊並未被安裝,如果要使用該模塊則需要在編譯nginx時指定–with-http_ssl_module參數
解決方案:
nginx缺少http_ssl_module模塊,編譯安裝的時候帶上--with-http_ssl_module配置就行了,但是現在的情況是我的nginx已經安裝過了,怎麼添加模塊,其實也很簡單,往下看: 做個說明:我的nginx的安裝目錄是/usr/local/nginx這個目錄,我的源碼包在/usr/local/nginx-1.16.1目錄
(1)切換到源碼包:
cd /usr/local/nginx-1.16.1
(2)配置信息:
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
(3)配置完成後,運行make進行編譯,千萬不要進行make install,否則就是覆蓋安裝。
make
(4)然後備份原有已經安裝好的nginx
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
(5)停止Nginx,正常命令直接 nginx -s stop就可以
nginx -s stop
如果關不掉,就直接Kill掉進程。ps aux | grep 進程名 查看進程佔用的PID號。
(6)將剛剛編譯好的nginx覆蓋掉原有的nginx
cp /usr/local/nginx-1.16.1/objs/nginx /usr/local/nginx/sbin
(7)啓動nginx
在路徑:/usr/local/nginx/sbin下
./nginx
(8)通過下面的命令查看是否已經加入成功。
nginx -V
2.在Nginx配置文件中安裝證書
文件說明:
1. 證書文件“證書名稱.crt‘’,包含兩段內容,請不要刪除任何一段內容。
2. 如果是證書系統創建的CSR,還包含:證書私鑰文件“證書名稱.key”。
( 1 ) 在Nginx的配置文件所在的目錄下創建cert文件夾,並且將下載的全部文件拷貝到cert目錄中。如果申請證書時是自己創建的CSR文件,請將對應的私鑰文件放到cert目錄下並且命名爲“證書名稱.key”;
( 2 ) 打開 Nginx 安裝目錄下 conf 目錄中的 nginx.conf 文件,找到:
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.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;
# }
#}
( 3 ) 將其修改爲 (以下屬性中ssl開頭的屬性與證書配置有直接關係,其它屬性請結合自己的實際情況複製或調整) :
server {
listen 8890 ssl;
server_name localhost;
ssl_certificate cert/1_luckilye.cn_bundle.crt;
ssl_certificate_key cert/2_luckilye.cn.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;
}
}
( 4 )重啓 Nginx。
nginx -s reload
( 5 ) 通過 https 方式訪問您的站點,測試站點證書的安裝配置。 在瀏覽器中輸入https://域名,如下圖所示,則說明配置成功。
在配置時有可能碰到的錯誤:
nginx 報錯 : [warn] the "ssl" directive is deprecated, use the "listen ... ssl" directive instead
解決:
1. 如果配置了SSL ON請刪掉
2.
listen 443;
修改爲
listen 443 ssl;