閱讀719 返回首頁    go 阿裏雲 go 技術社區[雲棲]


源碼編譯更新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,需要升級。

關於OpenSSL的定義

具體的操作步驟:

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

  上一篇:go  MyBatis是怎麼玩的
  下一篇:go  一名工程師對於深度學習的理解-神經網絡基礎ANN