源碼編譯更新nginx到最新版本,並開始nginx支持http2協議模塊.
最近因為遷移公司vm上的代碼,遇到一些問題。有一台vm配置了https協議,原以為遷移安全證書以後,配置nginx就可以了,但是修改nginx配置文件以後,執行 nginx -t 命令後,報如下錯誤:
nginx: [warn] invalid parameter "spdy": ngx_http_spdy_module was superseded by ngx_http_v2_module in /usr/local/nginx/conf/sites-enable
在網上google了一下,發現原因和nginx的版本有關。遷移前的vm環境,nginx是1.8版本的,新vm上的nginx是1.10的。按照官方的說明,在1.9.5以上版本,如果要啟用ssl協議,需要將原來配置ssl的寫法改一下:
舊的ssl配置寫法:listen 443 ssl spdy;
新的寫法:listen 443 default_server ssl http2
修改後執行 nginx -t,報錯如下信息:
nginx: [emerg] the "http2" parameter requires ngx_http_v2_module in /usr/local/nginx/conf/sites-enable
原因是nginx從1.9.5開始,已經用 http_v2_module 模塊替換了 ngx_http_spdy_module ,並正式開始支持http2協議。所以,沒辦法了,隻好下載新版nginx的源碼,重新編譯升級。
關於SPDY和HTTP2協議的一些內容說明,可以一下內容:
(1)SPDY的定義
(2)HTTP2協議的定義
二. 升級OpenSSL
在http2.0協議中,涉及到ALPN(Application Layer Protocol Negotiation,應用層協議協商)的支持,目前所有主流的Unix服務器係統中內置的OpenSSL庫都低於1.0.2版本。通過使用OpenSSL的命令行工具,可以檢查當前的http2服務是否支持ALPN。
openssl s_client -alpn h2 -servername topics.orthonline.com.cn -connect topics.orthonline.com.cn:443 < /dev/null | grep 'ALPN'
如果報錯:unknown option -alpn
說明當前OpenSSL版本不支持,執行 如下命令,檢查OpenSSL的版本:openssl version
我本地當前版本是 OpenSSL 1.0.1e-fips,需要升級。
具體的操作步驟:
1.下載最新版的OpenSSL庫編譯安裝
wget https://www.openssl.org/source/openssl-1.1.0f.tar.gz
tar xzf openssl.tar.gz
cd openssl-1.1.0f
./config --prefix=/usr/local/openssl
make && make install
2.替換舊版本庫
mv /usr/bin/openssl /usr/bin/openssl.old
mv /usr/include/openssl /usr/include/openssl.old
ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl
ln -s /usr/local/openssl/include/openssl /usr/include/openssl
#鏈接新庫文件
ln -s /usr/local/openssl/lib/libssl.so /usr/local/lib64/libssl.so
ln -s /usr/local/openssl/lib/libcrypto.so /usr/local/lib64/libcrypto.so
#檢查更新後的openssl依賴庫是否是1.1.0f
strings /usr/local/lib64/libssl.so | grep OpenSSL
#顯示結果表明已升級到最新版本鏈接庫
OpenSSL 1.1.0f 25 May 2017
#配置openssl庫文件的搜索路徑
echo '/usr/local/openssl/lib' >> /etc/ld.so.conf
#使修改後的搜索路徑生效
ldconfig -v
#查看openssl版本,結果顯示升級成功
openssl version
OpenSSL 1.1.0f 25 May 2017
三.升級nginx
1.下載最新版nginx源碼並解壓編譯
wget https://nginx.org/download/nginx-1.10.3.tar.gz
tar zxvf nginx-1.10.3.tar.gz
cd nginx-1.10.3
#編譯nginx,添加http_v2模塊應用,新版編譯命令如下
./configure --prefix=/usr/local/nginx \
--conf-path=/usr/local/nginx/conf/nginx.conf \
--sbin-path=/usr/local/nginx/sbin/nginx \
--pid-path=/usr/local/nginx/nginx.pid \
--error-log-path=/var/log/nginx/nginx-error.log \
--http-log-path=/var/log/nginx/nginx-access.log \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_secure_link_module \
--with-http_v2_module \
--with-http_stub_status_module \
--with-http_sub_module \
--with-openssl=/home/softwares/openssl-1.1.0f
編譯完成後,執行make,但不執行make install
make
將舊版本的nginx二進製文件,重命名一個名字,在這期間,當前運行的nginx進程不會停止,不影響應用運行。
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old
然後將上一步通過make編譯好的新版nginx二進製文件,拷貝到運行目錄
cp objs/nginx /usr/local/nginx/sbin/nginx
在源碼目錄根目錄下,執行更新安裝命令
make upgrade
注意:如果原來的相關配置文件中,寫有和ssl有關的配置信息,需要先暫時注釋掉,否則更新時會報錯。
更新完成後,執行
nginx -V
可以看到nginx已經更新到1.10.3版本。完成以上操作,就完成了nginx的更新,並已開啟對http2和https的最新支持。
四.修改相關nginx配置文件
在需要打開https協議支持的應用配置文件中,加入如下內容:
listen 443 ssl http2;
重啟nginx完成https設置。最後更新:2017-07-04 20:02:55