【运维】Nginx网关与热部署

Nginx简介

Nginx是一个轻量级的Http服务器,Nginx包含一个单一的master进程和多个worker进程。所有这些进程都是单线程,并且设计为同时处理成千上万个连接。Nginx使用操作系统事件机制来快速响应这些请求。
Nginx的master进程负责读取配置文件、处理套接字、派生worker进程、打开日志文件和编译嵌入式的Perl脚本。
Nginx的worker进程运行在一个忙碌的事件循环处理中,用于处理进入的连接。每一个Nginx模块被构筑在worker中,因此任何请求处理、过滤、处理代理的连接和更多的操作都在worker进程中完成。

image
# docker 中运行的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 容器实例

为了方便扩展和迁移,公司的nginx都跑在Docker环境中。Docker版的nginx可以一键迁移,自动重启,相当于进程守护。
nginx官方镜像不支持ssl,目前的浏览器都把非https的网站标识为不安全,因此支持https是非常必要的,本文在marvambass/nginx-ssl-secure镜像的基础上做了部分修改,以满足需要,镜像下载地址为:https://hub.docker.com/r/cbbing/nginx-ssl-secure

实践

docker-compose.yml文件

下面为最常用的nginx运行的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配置,映射到宿主机的conf/conf.d文件夹
读取cer证书,映射到宿主机的conf/conf.d/cer文件夹
日志文件映射到宿主机的/mydata/logs/nginx_logs
restart设置为always,相当于进程守护,宕掉后自动重启。

conf配置

平时打交道最多的就是conf文件,热部署。
一个典型的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; #按照这个协议配置
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置
    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,可以定义多个后端服务器,通过IPHash/最小连接/轮询/加权轮询/主备等策略实现负载均衡。
第二部分server,是域名访问的配置项,包括端口,具体域名,location中转设置项
第三部分log,是日志存储的路径。日志的格式在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"';

也可以只定义一个443端口,80端口通过如下方式重定义:

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

API网关

一套成熟的API网关包括如下几个方面:


image

API管理包括:

  • 定义和发布
  • 安全
  • 流量控制
  • 持续监控与维护
  • API分析

负载均衡

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 ;
}

这里运行了4个api服务,通过最小连接策略调用。

[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

静态网页服务器

静态文件配置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; #按照这个协议配置
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置
    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;
}

这个配置即以/home/demo目录为静态文件目录,不过/home/demo是容器内的路径,需要映射到宿主机目录/mydata/demo,实现动态更新。

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文件后,执行nginx -t,先排查语法错误,通过后执行nginx -s reload重新加载配置文件实现热部署。

nginx热部署的方式时,等旧的worker执行完成后kill掉,以更新后的配置启动新的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

参考

https://www.jianshu.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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容