ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Nginx应用与运维——Nginx编译及部署(编译)

Nginx应用与运维——Nginx编译及部署(编译) Nginx编译及部署1、编译环境准备1.1、操作系统的准备1.1.1、系统服务安装1.1.2、DNS缓存1.1.3、修改文件打开数限制1.2、Linux内核参数2、Nginx源码编译2.1、Nginx源码获取2.2、编译配置参数2.3、代码编译2.4、添加第三方模块3、Tengine源码编译3.1、Tengine源码获取3.2、编译配置参数3.3、代码编译3.4、Tengine集成的模块4、OpenResty源码编译4.1、OpenResty源码获取4.2、编译配置参数4.3、代码编译4.4、OpenResty集成的模块Nginx是一款优秀的开源软件支持在FreeBSD、Linux、Windows、macOS等多种操作系统平台下编译及运行。CentOS拥有良好的系统结构和工具软件生态环境是一款基于Linux的非常流行的发行版本。CentOS源自RedHat企业版按照Linux的开源协议编译而成在稳定性及技术的可持续性方面完全可以代替RedHat企业版因此我们选择将它CentOS作为全书的操作系统环境。本书采用的系统版本是CentOS 64位7.2版本。编译过程中非指定版本的软件均使用CentOS官方提供的yum源依赖库提供的版本。非Nginx的二进制执行文件的安装、执行路径为CentOS的系统默认路径。本书默认读者已经掌握CentOS的使用因此不会对其作深入介绍。虽然Mail模块也是Nginx的一个重要功能模块但为了重点介绍Nginx的HTTP相关功能本书不会介绍Mail模块的相关内容。1、编译环境准备1.1、操作系统的准备Nginx是一款优秀的开源软件是运行在操作系统上的应用程序因此Nginx的性能依赖于操作系统及其对底层硬件的管理机制为了使Nginx在运行时发挥最大的性能需要对操作系统的服务配置和参数做一些调整。系统服务配置可用如下方式实现。1.1.1、系统服务安装CentOS可用最小化安装安装完毕后用如下命令补充工具。yum-yinstallepel-release# 安装扩展工具包yum源yuminstallnet-toolswgetnscdlsof# 安装工具1.1.2、DNS缓存编辑/etc/resolv.conf配置DNS服务器打开NSCD服务缓存DNS提高域名解析响应速度。systemctl start nscd.service# 启动NSCD服务systemctlenablenscd.service1.1.3、修改文件打开数限制操作系统默认单进程最大打开文件数为1024要想实现高并发可以把单进程的文件打开数调整为65536。echo* soft nofile 65536 # *号表示所用用户 \* hard nofile 65536/etc/security/limits.conf1.2、Linux内核参数Linux系统是通过proc文件系统实现访问内核内部数据结构及改变内核参数的proc文件系统是一个伪文件系统通常挂载在/proc目录下可以通过改变/proc/sys目录下文件中的值对内核参数进行修改。/proc/sys目录下的目录与内核参数类别如下表所示。Linux系统环境下所有的设备都被看作文件来进行操作建立的网络连接数同样受限于操作系统的最大打开文件数。最大打开文件数会是系统内存的10%以KB来计算​称为系统级限制可以使用sysctl -a | grep fs.file-max命令查看系统级别的最大打开文件数。同时内核为了不让某个进程消耗掉所有的文件资源也会对单个进程最大打开文件数做默认值处理称之为用户级限制默认值一般是1024使用ulimit -n命令可以查看用户级文件描述符的最大打开数。文件相关内核参数可参见Linux相关图书。Nginx是一款Web服务器软件通过系统层面的网络优化可以提升HTTP数据传输的效率。HTTP协议是基于TCP/IP通信协议传递数据的了解TCP建立连接三次握手及进行数据传输的机制是优化网络相关内核参数的基础。相关术语说明如下。SYN建立连接标识。ACK确认接收标识。FIN关闭连接标识。seq当前数据包编号在实际传输过程中数据会被拆成多个数据包传输给接收端接收端再通过该编号将多个数据包拼接为完整的数据。ack确认号为上一个数据包的编号1。TCP建立连接并进行数据传输的流程如图所示具体说明如下。1)Client图中①主动将请求报文SYN1初始编号seqx发送给Server将自己的状态更改为SYN_SENT。2)Server图中②返回确认报文SYN1, ACK1确认号ackx1初始编号seqy​将自己的状态更改为SYN_RCVD。3)Client图中③返回确认报文ACK1确认号acky1编号seqx1给Server将自己的状态更改为ESTABLISHED。4)Server图中③收到确认报文后将自己的状态更改为ESTABLISHED并与Client实现数据传输。数据传输完毕后TCP关闭连接流程如图所示具体说明如下。1)发起端图中①主动将连接关闭报文FIN1编号sequ发送给响应端将自己的状态更改为FIN_WAIT_1。2)响应端图中②返回确认报文ACK1确认号acku1编号seqv给发起端将自己的状态更改为CLOSE_WAIT。3)发起端图中②收到确认报文后将自己的状态更改为FIN_WAIT_2等待响应端发送连接释放报文。4)响应端图中③发送连接释放报文FIN1,ACK1编号seqw确认号acku1给发起端将自己的状态更改为LAST-ACK。5)发起端图中④收到连接释放报文后发送确认报文(ACK1, sequ1, ackw1)给响应端将自己的状态更改为TIME_WAIT系统会在等待2倍MSL(Maximum Segment Lifetime)时间后关闭连接释放资源。6)响应端图中④收到确认报文后关闭连接释放资源。7)关闭连接的动作不限于Client和Server不同角色都可作为发起端主动发起关闭连接的请求。8)有时发起端也可以在图中①发送reset报文给响应端不经过②、③、④步骤立刻关闭连接。CentOS操作系统支持通过配置sysctl.conf文件中相关内核参数的方式实现对proc/sys目录下文件内容的调整网络相关内核参数可参见Linux相关图书。2、Nginx源码编译2.1、Nginx源码获取Nginx源码可通过官网直接下载源码获取命令如下mkdir-p/opt/data/sourcecd/opt/data/sourcewgethttp://nginx.org/download/nginx-1.17.4.tar.gztarzxmf nginx-1.17.4.tar.gz2.2、编译配置参数编译Nginx源码文件时首先需要通过编译配置命令configure进行编译配置。编译配置命令configure的常用编译配置参数如表所示。对于上表有以下三点说明。TCMalloc是谷歌开源的一个内存管理分配器优于Glibc的malloc内存管理分配器。upstream是被代理服务器组的Nginx内部标识通常称为上游服务器。开启pcre JIT支持可以提升处理正则表达式的速度。如表所示具有带“–with”前缀的编译配置参数的模块都不会被默认编译若要使用该功能模块需要使用提供的编译配置参数进行编译配置。相反具有带“–without”前缀的编译配置参数的模块都会被默认编译如果不想使用某个功能模块在进行编译配置时添加带有“–without”前缀的参数即可。此处只列出了常用功能的编译配置参数也可以通过编译配置命令的帮助参数获得更多的编译配置参数。./configure--help2.3、代码编译安装编译工具及依赖库脚本如下yum-yinstallgcc pcre-devel zlib-devel openssl-devel libxml2-devel\libxslt-devel gd-devel GeoIP-devel jemalloc-devel libatomic_ops-devel\perl-devel perl-ExtUtils-Embed编译所有功能模块脚本如下./configure\--with-threads\--with-file-aio\--with-http_ssl_module\--with-http_v2_module\--with-http_realip_module\--with-http_addition_module\--with-http_xslt_moduledynamic\--with-http_image_filter_moduledynamic\--with-http_geoip_moduledynamic\--with-http_sub_module\--with-http_dav_module\--with-http_flv_module\--with-http_mp4_module\--with-http_gunzip_module\--with-http_gzip_static_module\--with-http_auth_request_module\--with-http_random_index_module\--with-http_secure_link_module\--with-http_degradation_module\--with-http_slice_module\--with-http_stub_status_module\--with-streamdynamic\--with-stream_ssl_module\--with-stream_realip_module\--with-stream_geoip_moduledynamic\--with-stream_ssl_preread_module\--with-compat\--with-pcre-jitmakemakeinstall此处只作为示例可根据具体的需求灵活调整参数配置。编译后默认安装目录为/usr/local/nginx。2.4、添加第三方模块Nginx的功能是以模块方式存在的同时也支持添加第三方开发的功能模块。执行configure时通过–add-modulePATH参数指定第三方模块的代码路径在make时就可以进行同步编译了。添加第三方静态模块的方法如下./configure --add-module../ngx_http_proxy_connect_module添加第三方动态模块的方法如下./configure --add-dynamic-module../ngx_http_proxy_connect_module\--with-compat3、Tengine源码编译3.1、Tengine源码获取Tengine目前的版本是Tengine 2.3.2据其官网介绍该版本继承了Nginx 1.17.3版本的所有特性并兼容了Nginx的配置参数。Tengine开发了很多自有模块同时也集成了很多优秀的第三方模块源代码可以通过Tengine的官方网站获得获取命令如下mkdir-p/opt/data/sourcecd/opt/data/sourcewgethttp://tengine.taobao.org/download/tengine-2.3.2.tar.gztarzxmf tengine-2.3.2.tar.gz3.2、编译配置参数Tengine比开源版Nginx增加了一些编译配置参数。Tengine增加的编译配置参数如表所示。对于上表有以下两点说明。jemalloc是Facebook开源的一个内存管理分配器。Nginx原有编译配置参数参见2.2节。3.3、代码编译代码编译过程如下。# 安装编译依赖yum-yinstallgcc pcre-devel zlib-devel openssl-devel libxml2-devel\libxslt-devel gd-devel GeoIP-devel yajl-devel jemalloc-devel\libatomic_ops-devel luajit luajit-devel perl-devel perl-ExtUtils-Embed# 执行编译配置./configure# 代码编译及安装makemakeinstall安装Lua或LuaJIT都可以LuaJIT是Lua的高效版本推荐安装LuaJIT。编译完成后默认安装目录为/usr/local/nginx。3.4、Tengine集成的模块Tengine自带的模块都存储在源码目录的modules文件中用户可根据需要通过编译配置参数–add-module进行选择。模块说明如表所示。上述模块功能说明来源于源码中的说明文档具体使用方法可参照源码中的说明文档。Tengine编译完成后可使用nginx -m命令查看所有已经加载的模块static标识是静态编译的shared标识是动态编译的。4、OpenResty源码编译4.1、OpenResty源码获取OpenResty当前源码版本是1.15.8.2集成的Nginx版本是Nginx 1.15.8版本。其源码可通过官网直接获取获取命令如下mkdir-p/opt/data/sourcecd/opt/data/sourcewgethttps://openresty.org/download/openresty-1.15.8.2.tar.gztarzxmf openresty-1.15.8.2.tar.gz4.2、编译配置参数OpenResty是Nginx的扩展版其在编译配置参数上也进行了清晰的区分分为Nginx原有编译配置参数和扩展编译配置参数两部分扩展编译配置参数如表所示。对于上表有以下几点说明。扩展的功能模块都是被默认编译的可以通过设置表中的参数选择不编译。DTrace是基于系统底层的性能监控技术可监测函数级别的内存、CPU性能数据。Nginx原有编译配置参数参见2.2节的相关内容。4.3、代码编译OpenResty代码编译如下yum-yinstallgcc pcre-develmakezlib-devel openssl-devel libxml2-devel\libxslt-devel gd-devel GeoIP-devel libatomic_ops-devel luajit\luajit-devel perl-devel perl-ExtUtils-Embed ./configure\--with-threads\--with-file-aio\--with-http_ssl_module\--with-http_v2_module\--with-http_realip_module\--with-http_addition_module\--with-http_xslt_moduledynamic\--with-http_image_filter_moduledynamic\--with-http_geoip_moduledynamic\--with-http_sub_module\--with-http_dav_module\--with-http_flv_module\--with-http_mp4_module\--with-http_gunzip_module\--with-http_gzip_static_module\--with-http_auth_request_module\--with-http_random_index_module\--with-http_secure_link_module\--with-http_degradation_module\--with-http_slice_module\--with-http_stub_status_module\--with-streamdynamic\--with-stream_ssl_module\--with-stream_realip_module\--with-stream_geoip_moduledynamic\--with-stream_ssl_preread_module gmakegmakeinstall编译完成后默认安装目录为/usr/local/openresty。Nginx安装在/usr/local/openresty/nginx目录下。4.4、OpenResty集成的模块在OpenResty中使用Lua是非常方便的既可以在配置文件中通过OpenResty定义的指令区域直接编写Lua语法命令也可以通过引用方式调用外部Lua脚本文件。OpenResty提供了很多非常实用的Nginx模块和Lua支持库模块说明如下表所示。各模块的详细功能和使用方法请参见官方网站的相关介绍。
返回列表