编译环境准备

操作系统的准备

  Nginx 是一款优秀的开源软件,是运行在操作系统上的应用程序,因此 Nginx 的性能依赖于操作系统及其对底层硬件的管理机制,为了使 Nginx 在运行时发挥最大的性能,需要对操作系统的服务配置和参数做一些调整。系统服务配置可用如下方式实现。
(1)系统服务安装
  CentOS 7 可用最小化安装,安装完毕后,用如下命令补充工具。

yum -y install epel-release                     # 安装扩展工具包yum源
yum -y install net-tools wget nscd lsof            # 安装工具

(2)DNS 缓存
  编辑 /etc/resolv.conf 配置 DNS 服务器,打开 NSCD 服务,缓存 DNS,提高域名解析响应速度。

systemctl start nscd.service                    # 启动NSCD服务
systemctl enable nscd.service

(3)修改文件打开数限制
  操作系统默认单进程最大打开文件数为 1024,要想实现高并发,可以把单进程的文件打开数调整为 65536。

echo "* soft nofile 65536                             # *号表示所用用户
\* hard nofile 65536" >>/etc/security/limits.conf

Linux内核参数

  Linux 系统是通过proc文件系统实现访问内核内部数据结构及改变内核参数的,proc 文件系统是一个伪文件系统,通常挂载在 /proc 目录下,可以通过改变 /proc/sys 目录下文件中的值对内核参数进行修改。/proc/sys 目录下的目录与内核参数类别如表 1 所示。
表1 /proc/sys 目录下的目录与内核参数类别

目录内核参数类别
fs文件系统
kernelCPU、进程
net网络
vm内存

  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三次握手

Nginx 源码编译

Nginx 源码获取

Nginx 源码可通过官网直接下载,源码获取命令如下:

mkdir -p /opt/data/source
cd /opt/data/source
wget http://nginx.org/download/nginx-1.17.4.tar.gz
tar zxmf nginx-1.17.4.tar.gz

编译配置参数

  编译 Nginx 源码文件时,首先需要通过编译配置命令 configure 进行编译配置。编译配置命令 `configure 的常用编译配置参数如表 2 所示。
表2 Nginx 中 configure 命令的常用编译配置参数

编译配置参数默认值/默认编译状态参数说明
--prefix=PATH/usr/local编译后代码的安装目录
--with-select_module不编译编译 select I/O 事件机制模块,在不支持 Nginx默认 I/O 事件机制的操作系统下自动编译该模块
--without-select_module编译不编译 select I/O 事件机制模块
--with-poll_module不编译编译 poll I/O 事件机制模块,在不支持 Nginx 默认 I/O 事件机制的操作系统下自动编译该模块
--without-poll_module编译不编译 poll I/O 事件机制模块
--with-threads不编译启用线程池支持
--with-file-aio不编译启用 AIO 支持
--with-http_ssl_module不编译编译 SSL 模块
--with-http_v2_module不编译编译 HTTP/2 魔魁啊
--with-http_realip_module不编译编译 HTTP 的真实 IP 模块
--with-http_addition_module不编译编译相应内容追加模块
--with-xslt_module不编译编译 XSLT 样式表转换模块
--with-http_xslt_module=dynamic——动态编译 XSLT 样式表转换 XML 响应模块
--with-http_image_filter_module编译编译图像转换模块
--with-http_image_filter_module=dynamic——动态编译图像转换模块
--with-http_geoip_module编译编译客户端 IP 解析城市地址模块
--with-http_geoip_module=dynamic——动态编译客户端 IP 解析城市地址模块
--with-http_sub_module不编译编译字符串替换模块
--with-http_dav_module不编译编译 WebDAV 协议支持模块
--with-http_flv_module不编译编译 FLV 文件伪流媒体服务器支持模块
--with-http_mp4_module不编译编译 MP4 文件伪流媒体服务器支持模块
--with-http_gunzip_module不编译编译 gzip 压缩兼容模块
--with-http_gzip_static_module不编译编译发送 gz 预压缩文件数据模块
--with-http_auth_request_module不编译编译请求认证模块
--with-http_access_module编译不编译基于 IP 的访问控制模块
--without-http_auth_basic_module编译不编译 HTTP 基本认证模块
--without-http_mirror_module编译不编译访问镜像模块
--without-http_autoindex_module编译不编译自动目录索引模块
--without-http_geo_module编译不编译根据客户端 IP 创建变量模块
--without-http_map_module编译不编译变量映射模块
--without-http_split_clients_module编译不编译自定义客户请求分配模块
--without-http_referer_module编译不编译 referer 操作模块
--without-http_rewrite_module编译不编译 rewrite 规则模块
--without-http_proxy_module编译不编译代理功能模块
--without-http_fastcgi_module编译不编译 FastCGI 支持模块
--without-http_uwsgi_module编译不编译 uWSGI 支持模块
--without-http_scgi_module编译不编译 SCGI 支持模块
--without-http_grpc_module编译不编译 gRPC 支持模块
--without-http_memcached_module编译不编译 Memcached 服务访问模块
--without-http_limit_conn_module编译不编译并发送连接数控制模块
--without-http_limit_req_module编译不编译单 IP 请求数限制模块
--without-http_empty_gif_module编译不编译空 GIF 图片模块
--without-http_browser_module编译不编译客户端浏览器识别模块
--without-http_upstream_hash_module编译不编译 hash 负载均衡器算法模块
--without-http_upstream_ip_hash_module编译不编译 HTTP 协议 ip_hash 负载均衡模块
--without-http_upstream_least_conn_module编译不编译最少连接数算法负载均衡模块
--without-http_upstream_random_module编译不编译随机选择算法负载均衡模块
--without-http_upstream_keepalive_module编译不编译负载均衡后端长连接支持模块
--without-http_upstream_zone_module编译不编译负载均衡共享内存支持模块
--with-http_perl_module编译编译 Perl 脚本支持模块
--with-http_perl_module=dynamic编译动态编译 Perl 脚本支持模块
--with-stream不编译编译 TCP/UDP 代理模块
--with-stream=dynamic——动态编译 TCP/UDP 代理模块
--with-stream_ssl_module不编译编译 TCP/UDP 代理 SSL 支持模块
--with-stream_realip_module不编译编译 TCP/UDP 代理真实 IP 模块
--with-stream_geoip_module不编译编译地域信息解析模块
--with-stream_geoip_module=dynamic——动态编译地域信息解析模块
--with-stream_ssl_preread_module不编译编译 TCP/UDP 代理的 SSL 预处理模块
--with-google_perftools_module不编译编译 Google 的 TCMalloc 内存管理支持模块
--with-cpp_test_module不编译编译 C++ 兼容测试模块
--add-module=PATH——添加第三方模块
--add-dynamic-module=PATH——添加第三方动态模块
--with-ld-opt——设置附加的编译参数
--with-pcre-jit——pcre JIT 支持,该功能可以提升处理正则表达式的速度
--with-compat——启用动态模块兼容模式
--with-debug——打开调试日志

  对于表2,有以下三点说明。

  • TCMalloc 是谷歌开源的一个内存管理分配器,优于 Glibc 的 malloc 内存管理分配器。
  • upstream 是被代理服务器组的 Nginx 内部标识,通常称为上游服务器。
  • 开启 pcre JIT 支持,可以提升处理正则表达式的速度。
    如表 2 所示,具有带“--with”前缀的编译配置参数的模块都不会被默认编译,若要使用该功能模块,需要使用提供的编译配置参数进行编译配置。相反,具有带“--without”前缀的编译配置参数的模块都会被默认编译,如果不想使用某个功能模块,在进行编译配置时添加带有“--without”前缀的参数即可。此处只列出了常用功能的编译配置参数,也可以通过编译配置命令的帮助参数获得更多的编译配置参数。
./configure --help

代码编译

  安装编译工具及依赖库,脚本如下:

yum -y install gcc 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_module=dynamic \
    --with-http_image_filter_module=dynamic \
    --with-http_geoip_module=dynamic \
    --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-stream=dynamic \
    --with-stream_ssl_module \
    --with-stream_realip_module \
    --with-stream_geoip_module=dynamic \
    --with-stream_ssl_preread_module \
    --with-compat  \
    --with-pcre-jit
make && make install

  此处只作为示例,可根据具体的需求灵活调整参数配置。编译后,默认安装目录为 /usr/local/nginx。

添加第三方模块

  Nginx的功能是以模块方式存在的,同时也支持添加第三方开发的功能模块。执行 configure 时,通过 --add-module=PATH 参数指定第三方模块的代码路径,在 make 时就可以进行同步编译了。
  添加第三方静态模块的方法如下:

./configure --add-module=../ngx_http_proxy_connect_module

  添加第三方动态模块的方法如下:

./configure --add-dynamic-module=../ngx_http_proxy_connect_module \
    --with-compat
最后修改:2021 年 10 月 06 日 03 : 36 PM
如果觉得我的文章对你有用,请随意赞赏