新采编发系统是由新华社技术局主持研发,服务于新华社全社新闻采编报道日常业务的新一代新闻采编系统,是2016年实施的“新华全媒工程”的重要组成部分,该系统提供信息汇聚、报道策划、全媒生产、产品发布等四大类主要功能。新供稿系统是“新华全媒工程”的另一个重要组成部分,是落实新华社供稿线路优化调整升级工作方案的核心技术建设工程,系统于2017年5月上线,创新性地将大数据智能推荐、即时通讯、APP客户端等技术运用于通讯社供稿服务,引领新华社供稿服务跻身世界先进水平。为了落实领导关于“遵循新闻传播规律和新兴媒体发展规律,运用互联网技术体系,提升技术人员对先进技术的自主掌控能力”的要求,新采编发系统项目组采用了先进、开放的互联网技术架构,为系统上线后的自主运维提供了充足空间和发挥余地。
这就是Nginx作为Web服务器进入新采编发系统项目组视线的主要原因。作为一个草根出身的软件,Nginx在业界的鼎鼎大名也许你并不陌生。十多年前,它刚一诞生就出手不凡,很好地解决了传统Web服务器Apache无法hold住的C10K的问题(即一台物理服务器达到并发量1万时,Apache就会承受不了)。
在新华社新一代技术系统架构中,Nginx作为接入层的重要环节扮演了至关重要的角色,通过自主掌控Nginx软件的安装配置,灵活运用各种内置、第三方模块及自定义lua脚本,不仅可以完成基本的代理转发和软负载,还能通过对流量的多种控制处理实现认证鉴权、SSL卸载、限速分流、接入审计等功能,以满足用户和应用系统的多种需求。
Nginx是一款开源免费的HTTP和反向代理服务器,它由俄罗斯人伊戈尔·塞索耶夫编写,最早发布于2004年。十多年来,由于其出色的性能,Nginx在互联网突飞猛进的时代里飞速发展,根据W3Techs网站的报告,目前全球TOP 1000的网站中有接近六成在使用Nginx,包括Netflix, Dropbox, Wikipedia等,而排名第二的Apache仅占16.5%。Nginx最突出的特性包括高并发、轻量级、稳定,这得益于它使用异步、非阻塞、事件驱动的方式处理请求,测试显示它能处理高达Apache4倍之多的并发请求量,同时使用的内存资源却远低于Apache。
图 全球Web服务器排名
要使用Nginx,第一步要掌握Nginx的安装:
在安装Nginx之前,首先要安装3个依赖软件包:PCRE正则表达式库,zlib压缩库和OpenSSL加密工具集,Nginx的配置、压缩和ssl功能中需要用到这些软件。
安装Nginx包括3步,配置、编译和安装,首先需要在Nginx官网http://nginx.org/下载源码包,一般建议使用稳定版(Stable Version)。
在配置阶段,由于Nginx使用高度模块化的架构设计,需要手动设置各个模块的开关选项。对于默认关闭的Nginx内置模块,可以使用--with-module_name的方式开启开关,对于第三方模块,可以使用--add-module=/path/to/module的方式加以集成。
启用一些常用的内置模块的配置如下:
--with-stream 四层协议转发
--with-http_ssl_module 支持https
--with-http_gzip_static_module Gzip静态模块
--with-http_geoip_module GeoIP模块
--with-http_flv_module 为FLV文件提供服务端伪流媒体支持
--with-http_stub_status_module 状态信息页
Nginx有大量的第三方模块,官网上提供了所有第三方模块的清单: 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具体能扮演哪些角色吧:
1. 反向代理
应用部署好了,如何让用户能访问到呢?这正是Nginx反向代理的用武之地,用户通过域名访问的请求到达Nginx服务器后,Nginx可以根据域名和路径区分这些请求并转发给不同的后端服务器集群,即使用户无法通过网络直达这些后端服务器。Nginx四层和七层的代理分别使用ngx_stream_proxy_module和ngx_http_proxy_module模块,都用proxy_pass URL的方式配置实现。
2. 负载均衡
应用服务器出问题了怎么办?不要紧,将Nginx用做软负载,能够将影响程度降低至最低。Nginx可以提供灵活多变的负载配置,包括轮询、加权轮询、IP哈希、主备等等,用于满足多样的需求。此外,还可以通过集成nginx_upstream_check_module第三方模块,进一步实现基于tcp和http的主动健康检查,让Nginx的负载均衡能力如虎添翼。
3. 访问控制
并非所有的系统都全部面向互联网开放,有的系统只允许办公网络访问,还有的系统里某些页面可以对互联网开放,其它页面则仅允许特定的内部IP访问,面对这些细粒度的访问控制需求,通过使用ngx_http_access_module模块,Nginx可以提供基于七层的灵活的黑白名单方式配置访问控制策略。
4. 认证鉴权
有些应用系统想要加把锁,输入正确的用户名密码才能访问,nginx默认自带的认证模块就可以实现,通过ngx_http_auth_basic_module模块,结合htpasswd命令生成用户名及对应密码数据库文件,Nginx可以很轻松地实现这种认证。另一种认证方式也很流行,Nginx+Lua(类似Openresty)可以让用户在访问业务系统之前先通过统一的用户认证系统登录、过滤并鉴权。
5、SSL卸载
近年来,HTTPS逐渐取代HTTP成为传输协议界的新宠,众多互联网网站开始从HTTP切换到HTTPS,以实现加密、可信访问。Nginx的 ngx_http_ssl_module模块对https提供了必要的支持,想要实施HTTPS的网站可以将证书安装在Nginx服务器上,由Nginx进行ssl密文数据流的卸载。
6、限速限流
当遇到真实的流量远远大于系统测试的可承载流量时,一方面可能让系统垮掉,另一方面可能拥堵出口带宽,这时就必须进行限流。限流是从上到下贯穿整个应用的,接入层作为最外面的屏障,需要做好整个系统的限流。对于Nginx来讲,限流有多种方式,可以使用ngx_http_core_module核心模块对连接数进行限制,也可以对访问频率进行限制,还可以启用过载保护sysgurad模块。
7、接入审计
可以通过搭建ELK平台收集和分析接入层Nginx日志,实现可视化的接入审计及分析平台,消息队列可以采用Redis或Kafka。
除了上述种种应用场景,Nginx还有一个运维人员不可不知的炫酷操作——平滑升级。作为一个互联网软件,Nginx版本迭代升级比较频繁,对运维人员来说,为了享受新版本的新特性,免不了要对生产环境的Nginx进行版本升级,而平滑升级操作可以在业务毫无感知的情况下完成,运维人员只需在备份并替换sbin目录下的可执行文件后,使用kill -s USR2 `cat /path/to/nginx.pid`命令,让Nginx开始新旧版本并行运行,随后再优雅退出旧进程即可。看到这里,你有没有跃跃欲试了呢,快去体验一下这款Web服务器神器吧。(完)(作者单位:新华社通信技术局技术实验室)