【運(yùn)維】Nginx網(wǎng)關(guān)與熱部署

Nginx簡介

Nginx是一個(gè)輕量級的Http服務(wù)器肺孤,Nginx包含一個(gè)單一的master進(jìn)程和多個(gè)worker進(jìn)程民效。所有這些進(jìn)程都是單線程,并且設(shè)計(jì)為同時(shí)處理成千上萬個(gè)連接。Nginx使用操作系統(tǒng)事件機(jī)制來快速響應(yīng)這些請求为流。
Nginx的master進(jìn)程負(fù)責(zé)讀取配置文件、處理套接字让簿、派生worker進(jìn)程敬察、打開日志文件和編譯嵌入式的Perl腳本。
Nginx的worker進(jìn)程運(yùn)行在一個(gè)忙碌的事件循環(huán)處理中尔当,用于處理進(jìn)入的連接莲祸。每一個(gè)Nginx模塊被構(gòu)筑在worker中蹂安,因此任何請求處理、過濾锐帜、處理代理的連接和更多的操作都在worker進(jìn)程中完成田盈。

image
# docker 中運(yùn)行的nginx
root 3699 3675 0 2018 ? 00:00:00 nginx: master process /opt/gitlab/embedded/sbin/nginx -p /var/opt/gitlab/nginx
systemd+ 3770 3699 0 2018 ? 00:16:35 nginx: worker process
systemd+ 3771 3699 0 2018 ? 00:17:19 nginx: worker process
systemd+ 3772 3699 0 2018 ? 00:15:19 nginx: worker process
systemd+ 3773 3699 0 2018 ? 00:24:05 nginx: worker process
systemd+ 3774 3699 0 2018 ? 00:01:45 nginx: cache manager process

Nginx 容器實(shí)例

為了方便擴(kuò)展和遷移,公司的nginx都跑在Docker環(huán)境中缴阎。Docker版的nginx可以一鍵遷移允瞧,自動(dòng)重啟,相當(dāng)于進(jìn)程守護(hù)蛮拔。
nginx官方鏡像不支持ssl述暂,目前的瀏覽器都把非https的網(wǎng)站標(biāo)識(shí)為不安全,因此支持https是非常必要的建炫,本文在marvambass/nginx-ssl-secure鏡像的基礎(chǔ)上做了部分修改畦韭,以滿足需要,鏡像下載地址為:https://hub.docker.com/r/cbbing/nginx-ssl-secure

實(shí)踐

docker-compose.yml文件

下面為最常用的nginx運(yùn)行的docker配置肛跌,對外開放80艺配,443端口,即http和https惋砂。

version: '2.1'
services:
  nginx:
    image: cbbing/nginx-ssl-secure
    volumes:
      - ./conf/conf.d/cer:/etc/nginx/external
      - ./conf/conf.d:/etc/nginx/conf.d
      - /mydata/logs/nginx_logs:/var/log/nginx
    ports:
      - 80:80
      - 443:443
    restart: always

說明:
讀取conf配置妒挎,映射到宿主機(jī)的conf/conf.d文件夾
讀取cer證書,映射到宿主機(jī)的conf/conf.d/cer文件夾
日志文件映射到宿主機(jī)的/mydata/logs/nginx_logs
restart設(shè)置為always西饵,相當(dāng)于進(jìn)程守護(hù)酝掩,宕掉后自動(dòng)重啟。

conf配置

平時(shí)打交道最多的就是conf文件眷柔,熱部署期虾。
一個(gè)典型的conf文件如下:

upstream xxx_api{
    server 10.105.10.1:992 ;    #api03
}

server {
    listen 80;
    server_name api.xxx.com;
    client_max_body_size 50M;
    location / {
        add_header X-Cache-Status $upstream_cache_status;
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_connect_timeout 500s;
        proxy_read_timeout 500s;
        proxy_send_timeout 500s;
        proxy_pass http://xxx_api;
    }
    
    access_log  /var/log/nginx/xxx_api_http.log  main;
}

server {
    listen 443;
    server_name api.xxx.com;
    ssl on;
    ssl_certificate conf.d/cer/1_api.xxx.com_bundle.crt;
    ssl_certificate_key conf.d/cer/2_api.xxx.com.key;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照這個(gè)協(xié)議配置
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照這個(gè)套件配置
    ssl_prefer_server_ciphers on;
    client_max_body_size 50M;
    location / {
        add_header X-Cache-Status $upstream_cache_status;
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_connect_timeout 500s;
        proxy_read_timeout 500s;
        proxy_send_timeout 500s;
        proxy_pass http://xxx_api;
    }

    access_log  /var/log/nginx/xxx_api_https.log  main;
}

第一部分upstream,可以定義多個(gè)后端服務(wù)器驯嘱,通過IPHash/最小連接/輪詢/加權(quán)輪詢/主備等策略實(shí)現(xiàn)負(fù)載均衡镶苞。
第二部分server,是域名訪問的配置項(xiàng)鞠评,包括端口茂蚓,具體域名,location中轉(zhuǎn)設(shè)置項(xiàng)
第三部分log剃幌,是日志存儲(chǔ)的路徑聋涨。日志的格式在nginx.conf中定義的。

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status [$request_body] $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for"';

也可以只定義一個(gè)443端口负乡,80端口通過如下方式重定義:

server
{
    listen 80;
    server_name api.xxx.com;
    rewrite ^/(.*) https://api.xxx.com/$1 permanent;
}

API網(wǎng)關(guān)

一套成熟的API網(wǎng)關(guān)包括如下幾個(gè)方面:


image

API管理包括:

  • 定義和發(fā)布
  • 安全
  • 流量控制
  • 持續(xù)監(jiān)控與維護(hù)
  • API分析

負(fù)載均衡

upstream api{
    least_conn;
    server 10.105.19.5:891 ;
    server 10.105.19.5:892 ;
    server 10.105.19.5:893 ;
    server 10.105.19.5:894 ;
}

這里運(yùn)行了4個(gè)api服務(wù)牍白,通過最小連接策略調(diào)用。

[root@VM_196_57_centos ~]# docker ps
2c8792e403bf "/bin/sh -c 'gunic..." 3 days ago Up 3 days 0.0.0.0:891->8000/tcp p891_api_1
2c8792e403ba "/bin/sh -c 'gunic..." 3 days ago Up 3 days 0.0.0.0:892->8000/tcp p892_api_1
2c8792e403bb "/bin/sh -c 'gunic..." 3 days ago Up 3 days 0.0.0.0:893->8000/tcp p893_api_1
2c8792e403bc "/bin/sh -c 'gunic..." 3 days ago Up 3 days 0.0.0.0:894->8000/tcp p894_api_1
image

靜態(tài)網(wǎng)頁服務(wù)器

靜態(tài)文件配置demo.conf

server
{
    listen 80;
    server_name www.xxx.com;

    location / {
        root    /home/demo;
        index   login.html;
    }
    access_log  /var/log/nginx/demo_http.log  main;
}

server {
    listen 443;
    server_name www.xxx.com;
    ssl on;
    ssl_certificate conf.d/cer/1_www.xxx.com_bundle.crt;
    ssl_certificate_key conf.d/cer/2_www.xxx.com.key;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照這個(gè)協(xié)議配置
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照這個(gè)套件配置
    ssl_prefer_server_ciphers on;
    client_max_body_size 50M;
    location / {
        root    /home/demo;
        index   login.html;
    }
    access_log  /var/log/nginx/demo_https.log  main;
}

這個(gè)配置即以/home/demo目錄為靜態(tài)文件目錄抖棘,不過/home/demo是容器內(nèi)的路徑茂腥,需要映射到宿主機(jī)目錄/mydata/demo狸涌,實(shí)現(xiàn)動(dòng)態(tài)更新。

version: '2.1'
services:
  nginx:
    image: cbbing/nginx-ssl-secure
    volumes:
      - ./conf/conf.d/cer:/etc/nginx/external
      - ./conf/conf.d:/etc/nginx/conf.d
      - /mydata/logs/nginx_logs:/var/log/nginx
      - /mydata/demo:/home/demo

    ports:
      - 80:80
      - 443:443

熱部署

更新了conf文件后最岗,執(zhí)行nginx -t帕胆,先排查語法錯(cuò)誤,通過后執(zhí)行nginx -s reload重新加載配置文件實(shí)現(xiàn)熱部署般渡。

nginx熱部署的方式時(shí)惶楼,等舊的worker執(zhí)行完成后kill掉,以更新后的配置啟動(dòng)新的worker

[root@VM_231_16_centos ~]# docker exec -it nginxnew_nginx_1 nginx -t
nginx: [emerg] duplicate upstream "myweb" in /etc/nginx/conf.d/power.xxx.conf:3
nginx: configuration file /etc/nginx/nginx.conf test failed

[root@VM_231_16_centos ~]# docker exec -it nginxnew_nginx_1 nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

[root@VM_231_16_centos ~]# docker exec -it nginxnew_nginx_1 nginx -s reload

參考

http://www.reibang.com/p/5eab0f83e3b4
What Is API Management?
https://cloud.tencent.com/document/product/628/11755
https://cloud.tencent.com/developer/article/1149103
https://zhuanlan.zhihu.com/p/34943332
https://www.infoq.cn/article/comparing-api-gateway-performances

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末诊杆,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子何陆,更是在濱河造成了極大的恐慌晨汹,老刑警劉巖,帶你破解...
    沈念sama閱讀 223,002評論 6 519
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贷盲,死亡現(xiàn)場離奇詭異淘这,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)巩剖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,357評論 3 400
  • 文/潘曉璐 我一進(jìn)店門铝穷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人佳魔,你說我怎么就攤上這事曙聂。” “怎么了鞠鲜?”我有些...
    開封第一講書人閱讀 169,787評論 0 365
  • 文/不壞的土叔 我叫張陵宁脊,是天一觀的道長。 經(jīng)常有香客問我贤姆,道長榆苞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,237評論 1 300
  • 正文 為了忘掉前任霞捡,我火速辦了婚禮坐漏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘碧信。我一直安慰自己扔傅,他們只是感情好蒜撮,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,237評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般舵匾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上帚屉,一...
    開封第一講書人閱讀 52,821評論 1 314
  • 那天,我揣著相機(jī)與錄音檐什,去河邊找鬼。 笑死弱卡,一個(gè)胖子當(dāng)著我的面吹牛乃正,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播婶博,決...
    沈念sama閱讀 41,236評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼瓮具,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了凡人?” 一聲冷哼從身側(cè)響起名党,我...
    開封第一講書人閱讀 40,196評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎挠轴,沒想到半個(gè)月后传睹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,716評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡岸晦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,794評論 3 343
  • 正文 我和宋清朗相戀三年欧啤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片启上。...
    茶點(diǎn)故事閱讀 40,928評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡邢隧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出冈在,到底是詐尸還是另有隱情倒慧,我是刑警寧澤,帶...
    沈念sama閱讀 36,583評論 5 351
  • 正文 年R本政府宣布包券,位于F島的核電站迫靖,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏兴使。R本人自食惡果不足惜系宜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,264評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望发魄。 院中可真熱鬧盹牧,春花似錦、人聲如沸励幼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,755評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽苹粟。三九已至有滑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間嵌削,已是汗流浹背毛好。 一陣腳步聲響...
    開封第一講書人閱讀 33,869評論 1 274
  • 我被黑心中介騙來泰國打工望艺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人肌访。 一個(gè)月前我還...
    沈念sama閱讀 49,378評論 3 379
  • 正文 我出身青樓找默,卻偏偏與公主長得像,于是被迫代替她去往敵國和親吼驶。 傳聞我的和親對象是個(gè)殘疾皇子惩激,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,937評論 2 361

推薦閱讀更多精彩內(nèi)容