文/劉旻昊
新采編發(fā)系統(tǒng)是由新華社技術(shù)局主持研發(fā),服務(wù)于新華社全社新聞采編報(bào)道日常業(yè)務(wù)的新一代新聞采編系統(tǒng),是2016年實(shí)施的新華全媒工程的重要組成,該系統(tǒng)提供信息匯聚、報(bào)道策劃、全媒生產(chǎn)、產(chǎn)品發(fā)布等四大類主要功能。面對業(yè)務(wù)需求變化快、運(yùn)維工作日趨復(fù)雜、IT運(yùn)維技術(shù)換代快等挑戰(zhàn),按照“要遵循新聞傳播規(guī)律和新興媒體發(fā)展規(guī)律,運(yùn)用互聯(lián)網(wǎng)技術(shù)體系,提升技術(shù)人員對先進(jìn)技術(shù)的自主掌控能力”的。
這就是新華全媒工程選擇Nginx作為Web服務(wù)器的主要原因。作為一個(gè)草根出身的軟件,Nginx在業(yè)界的鼎鼎大名也許你并不陌生。十多年前,它剛一誕生就出手不凡,很好地解決了傳統(tǒng)Web服務(wù)器Apache無法hold住的C10K的問題(即一臺物理服務(wù)器達(dá)到并發(fā)量1萬的時(shí)候,Apache就會承受不了)。
如今,在新華社新一代技術(shù)系統(tǒng)架構(gòu)中,Nginx作為接入層的重要環(huán)節(jié)扮演了至關(guān)重要的角色,通過自主掌控Nginx軟件的安裝配置,靈活運(yùn)用各種內(nèi)置、第三方模塊及自定義lua腳本,不僅可以完成基本的代理轉(zhuǎn)發(fā)和軟負(fù)載,還能通過對流量的多種控制處理實(shí)現(xiàn)認(rèn)證鑒權(quán)、SSL卸載、限速分流、接入審計(jì)等功能,以滿足用戶和應(yīng)用系統(tǒng)的多種需求。
Nginx是一款開源免費(fèi)的HTTP和反向代理服務(wù)器,它由俄羅斯人伊戈?duì)枴と饕蚓帉?,最早發(fā)布于2004年。十多年來,由于其出色的性能,Nginx在互聯(lián)網(wǎng)突飛猛進(jìn)的時(shí)代里飛速發(fā)展,根據(jù)W3Techs網(wǎng)站的報(bào)告,目前全球TOP 1000的網(wǎng)站中有接近六成在使用Nginx,包括Netflix, Dropbox, Wikipedia等,而排名第二的Apache僅占16.5%。Nginx最突出的特性包括高并發(fā)、輕量級、穩(wěn)定,這得益于它使用異步、非阻塞、事件驅(qū)動的方式處理請求,測試顯示它能處理高達(dá)Apache4倍之多的并發(fā)請求量,同時(shí)使用的內(nèi)存資源卻遠(yuǎn)低于Apache。
要使用Nginx,第一步要掌握Nginx的安裝:
在安裝Nginx之前,首先要安裝3個(gè)依賴軟件包:PCRE正則表達(dá)式庫,zlib壓縮庫和OpenSSL加密工具集,Nginx的配置、壓縮和ssl功能中需要用到這些軟件。
安裝Nginx包括3步,配置、編譯和安裝,首先需要在Nginx官網(wǎng)http://nginx.org/下載源碼包,一般建議使用穩(wěn)定版(Stable Version)。
圖1 全球Web服務(wù)器排名
在配置階段,由于Nginx使用高度模塊化的架構(gòu)設(shè)計(jì),需要手動設(shè)置各個(gè)模塊的開關(guān)選項(xiàng)。對于默認(rèn)關(guān)閉的Nginx內(nèi)置模塊,可以使用--with-module_name的方式開啟開關(guān),對于第三方模塊,可以使用--add-module=/path/to/module的方式加以集成。
啟用一些常用的內(nèi)置模塊的配置如下:
●--with-stream 四層協(xié)議轉(zhuǎn)發(fā)
●--with-http_ssl_module 支持https
●--with-http_gzip_static_module Gzip 靜態(tài)模塊
●--with-http_geoip_module GeoIP 模塊
●--with-http_flv_module 為FLV文件提供服務(wù)端偽流媒體支持
●--with-http_stub_status_module 狀態(tài)信息頁
Nginx有大量的第三方模塊,官網(wǎng)上提供了所有第三方模塊的清單:https://www.nginx.com/resources/wiki/modules/index.html,一些常用的第三方模塊包括:
●nginx_upstream_check_module 主動健康檢查
●nginx-sticky-module 會話保持
●ngx_log_if 日志過濾
使用make和make install,就完成編譯安裝了。
安裝完成后,還需要掌握Nginx的基本控制命令:
●nginx 啟動nginx
●nginx -s stop 立刻停止
●nginx -s quit 溫柔停止
●nginx -s reload 重載配置文件
了解完安裝和基本控制,來看看Nginx具體能扮演哪些角色吧:
應(yīng)用部署好了,如何讓用戶能訪問到呢?這正是Nginx反向代理的用武之地,用戶通過域名訪問的請求到達(dá)Nginx服務(wù)器后,Nginx可以根據(jù)域名和路徑區(qū)分這些請求并轉(zhuǎn)發(fā)給不同的后端服務(wù)器集群,即使用戶無法通過網(wǎng)絡(luò)直達(dá)這些后端服務(wù)器。Nginx四層和七層的代理分別使用ngx_stream_proxy_module和ngx_http_proxy_module模塊,都用proxy_pass URL的方式配置實(shí)現(xiàn)。
應(yīng)用服務(wù)器出問題了怎么辦?不要緊,將Nginx用做軟負(fù)載,能夠?qū)⒂绊懗潭冉档椭磷畹?。Nginx可以提供靈活多變的負(fù)載配置,包括輪詢、加權(quán)輪詢、IP哈希、主備等,用于滿足多樣的需求。此外,還可以通過集成nginx_upstream_check_module第三方模塊,進(jìn)一步實(shí)現(xiàn)基于tcp和http的主動健康檢查,讓Nginx的負(fù)載均衡能力如虎添翼。
并非所有的系統(tǒng)都全部面向互聯(lián)網(wǎng)開放,有的系統(tǒng)只允許辦公網(wǎng)絡(luò)訪問,還有的系統(tǒng)里某些頁面可以對互聯(lián)網(wǎng)開放,其他頁面則僅允許特定的內(nèi)部IP訪問,面對這些細(xì)粒度的訪問控制需求,通過使用ngx_http_access_module模塊,Nginx可以提供基于七層的靈活的黑白名單方式配置訪問控制策略。
有些應(yīng)用系統(tǒng)想要加把鎖,輸入正確的用戶名密碼才能訪問,nginx默認(rèn)自帶的認(rèn)證模塊就可以實(shí)現(xiàn),通過ngx_http_auth_basic_module模塊,結(jié)合htpasswd命令生成用戶名及對應(yīng)密碼數(shù)據(jù)庫文件,Nginx可以很輕松地實(shí)現(xiàn)這種認(rèn)證。另一種認(rèn)證方式也很流行,Nginx+Lua(類似Openresty)可以讓用戶在訪問業(yè)務(wù)系統(tǒng)之前先通過統(tǒng)一的用戶認(rèn)證系統(tǒng)登錄、過濾并鑒權(quán)。
近年來,HTTPS逐漸取代HTTP成為傳輸協(xié)議界的新寵,眾多互聯(lián)網(wǎng)網(wǎng)站開始從HTTP切換到HTTPS,以實(shí)現(xiàn)加密、可信訪問。Nginx的 ngx_http_ssl_module模塊對https提供了必要的支持,想要實(shí)施HTTPS的網(wǎng)站可以將證書安裝在Nginx服務(wù)器上,由Nginx進(jìn)行ssl密文數(shù)據(jù)流的卸載。
當(dāng)遇到真實(shí)的流量遠(yuǎn)遠(yuǎn)大于系統(tǒng)測試的可承載流量時(shí),一方面可能讓系統(tǒng)垮掉,另一方面可能擁堵出口帶寬,這時(shí)就必須進(jìn)行限流。限流是從上到下貫穿整個(gè)應(yīng)用的,接入層作為最外面的屏障,需要做好整個(gè)系統(tǒng)的限流。對于Nginx來講,限流有多種方式,可以使用ngx_http_core_module核心模塊對連接數(shù)進(jìn)行限制,也可以對訪問頻率進(jìn)行限制,還可以啟用過載保護(hù)sysgurad模塊。
可以通過搭建ELK平臺收集和分析接入層Nginx日志,實(shí)現(xiàn)可視化的接入審計(jì)及分析平臺,消息隊(duì)列可以采用Redis或Kafka。
除了上述種種應(yīng)用場景,Nginx還有一個(gè)運(yùn)維人員不可不知的炫酷操作——平滑升級。作為一個(gè)互聯(lián)網(wǎng)軟件,Nginx版本迭代升級比較頻繁,對運(yùn)維人員來說,為了享受新版本的新特性,免不了要對生產(chǎn)環(huán)境的Nginx進(jìn)行版本升級,而平滑升級操作可以在業(yè)務(wù)毫無感知的情況下完成,運(yùn)維人員只需在備份并替換sbin目錄下的可執(zhí)行文件后,使用kill -s USR2 `cat /path/to/nginx.pid`命令,讓Nginx開始新舊版本并行運(yùn)行,隨后再優(yōu)雅退出舊進(jìn)程即可。
看到這里,你有沒有躍躍欲試了呢,快去體驗(yàn)一下這款Web服務(wù)器神器吧。