[转帖]Nginx源码编译安装

nginx,源码,编译,安装 · 浏览次数 : 0

小编点评

**编译配置参数** ``` --with-pcre-jit --with-compat --with-pcre-jit --with-compat --with-pcre-jit --with-compat ``` **添加第三方模块** ``` ./configure --add-module=../ngx_http_proxy_connect_module ``` **注册Nginx成为系统服务** ``` cat >/usr/lib/systemd/system/nginx.service ``` **启动Nginx服务** ``` cat >/usr/lib/systemd/system/nginx.service ```

正文

https://www.cnblogs.com/lizexiong/p/15012713.html

 

  Nginx 是一款优秀的开源软件,支持在 FreeBSD、Linux、Windows、macOS 等多种操作系统平台下编译及运行。CentOS 拥有良好的系统结构和工具软件生态环境,是一款基于 Linux 的非常流行的发行版本。CentOS 源自 RedHat 企业版,按照 Linux 的开源协议编译而成,在稳定性及技术的可持续性方面完全可以代替 RedHat 企业版,因此我们选择将CentOS 作为本教程的操作系统环境。

 

1.编译环境准备

1)操作系统的准备

  Nginx 是一款优秀的开源软件,是运行在操作系统上的应用程序,因此 Nginx 的性能依赖于操作系统及其对底层硬件的管理机制,为了使 Nginx 在运行时发挥最大的性能,需要对操作系统的服务配置和参数做一些调整。系统服务配置可用如下方式实现。

  ①系统服务安装

  CentOS 可用最小化安装,安装完毕后,用如下命令补充工具。

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

  ②DNS 缓存

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

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

  ③修改文件打开数限制

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

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

  注:更详细的文件数限制参考以下链接:https://www.cnblogs.com/lizexiong/p/13219456.html

 

2)Linux 内核参数

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

  /proc/sys 目录下的目录与内核参数类别如下表所示。

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

  Linux 系统环境下,所有的设备都被看作文件来进行操作,建立的网络连接数同样受限于操作系统的最大打开文件数。最大打开文件数会是系统内存的 10%(以 KB 来计算),称为系统级限制,可以使用sysctl -a | grep fs.file-max命令查看系统级别的最大打开文件数。

  同时,内核为了不让某个进程消耗掉所有的文件资源,也会对单个进程最大打开文件数做默认值处理,称之为用户级限制,默认值一般是 1024,使用ulimit -n命令可以查看用户级文件描述符的最大打开数。

  Nginx 是一款 Web 服务器软件,通过系统层面的网络优化可以提升 HTTP 数据传输的效率。HTTP 协议是基于 TCP/IP 通信协议传递数据的,了解 TCP 建立连接(三次握手)及进行数据传输的机制是优化网络相关内核参数的基础。相关术语说明如下。

    • SYN:建立连接标识;
    • ACK:确认接收标识;
    • FIN:关闭连接标识;
    • seq:当前数据包编号,在实际传输过程中,数据会被拆成多个数据包传输给接收端,接收端再通过该编号将多个数据包拼接为完整的数据;
    • ack:确认号,为上一个数据包的编号 +1。

 

  TCP 建立连接并进行数据传输的流程如下图所示,具体说明如下。

    • Client(下图中 ① 的位置)主动将请求报文(SYN=1,初始编号 seq=x)发送给 Server,将自己的状态更改为 SYN_SENT;
    • Server(下图中 ② 的位置)返回确认报文(SYN=1,ACK=1,确认号 ack=x+1,初始编号 seq=y),将自己的状态更改为 SYN_RCVD;
    • Client(下图中 ③ 的位置)返回确认报文(ACK=1,确认号 ack=y+1,编号 seq=x+1)给 Server,将自己的状态更改为 ESTABLISHED;
    • Server(下图中 ③ 的位置)收到确认报文后,将自己的状态更改为 ESTABLISHED,并与 Client 实现数据传输。

图:TCP建立连接

 

  数据传输完毕后,TCP 关闭连接流程如下图所示,具体说明如下。

    • 发起端(下图中 ① 的位置)主动将连接关闭报文(FIN=1,编号 seq=u)发送给响应端,将自己的状态更改为 FIN_WAIT_1;
    • 响应端(下图中 ② 的位置)返回确认报文(ACK=1,确认号 ack=u+1,编号 seq=v)给发起端,将自己的状态更改为 CLOSE_WAIT;
    • 发起端(下图中 ② 的位置)收到确认报文后,将自己的状态更改为 FIN_WAIT_2,等待响应端发送连接释放报文;
    • 响应端(下图中 ③ 的位置)发送连接释放报文(FIN=1,ACK=1,编号 seq=w,确认号 ack=u+1)给发起端,将自己的状态更改为 LAST-ACK;
    • 发起端(下图中 ④ 的位置)收到连接释放报文后,发送确认报文(ACK=1,seq=u+1,ack=w+1)给响应端,将自己的状态更改为 TIME_WAIT,系统会在等待 2 倍MSL(Maximum Segment Lifetime)时间后关闭连接,释放资源;
    • 响应端(下图中 ④ 的位置)收到确认报文后,关闭连接,释放资源;
    • 关闭连接的动作不限于 Client 和 Server,不同角色都可作为发起端主动发起关闭连接的请求;
    • 有时发起端也可以在下图中 ① 发送 reset 报文给响应端,不经过 ②、③、④ 步骤立刻关闭连接。

图:TCP关闭连接

  CentOS 操作系统支持通过配置 sysctl.conf 文件中相关内核参数的方式实现对 proc/sys 目录下文件内容的调整。

 

2.Nginx源码编译

1)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

 

2)编译配置参数

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

编译配置参数 默认值/默认编译状态 参数说明
--prefix=PATH /usr/local 编译后代码的安装目录
--with-select_module 不编译 编译 select I/O 事件机制模块,在不支持 Nginx 默认 I/O 事件机制的操作系统下自动编译该模块
--without-select_module 编译 不编译 select I/O 事件机制模块
--with-poll_module 不编译 编译 poll/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-http_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_random_index_module 不编译  编译随机首页模块
--with-http_secure_link_module 不编译  编译请求连接安全检查模块
--with-http_degradation_module 不编译  编译内存不足响应模块
--with-http_slice_module 不编译  编译文件切片模块
--with-http_stub_status_module 不编译  编译运行状态模块
--without-http_charset_module 编译 不编译字符集转换模块
--without-http_gzip__module 编译 不编译 gzip 方式压缩输出模块
--without-http_ssi_module 编译 不编译 SSI 支持模块
--without-http_userid_module 编译 不编译 cookie 操作模块
--without-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_modul 编译 不编译 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 预处理模块

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

    • TCMalloc 是谷歌开源的一个内存管理分配器,优于 Glibc 的 malloc 内存管理分配器;
    • upstream 是被代理服务器组的 Nginx 内部标识,通常称为上游服务器;
    • 开启 pcre JIT 支持,可以提升处理正则表达式的速度。

  如上表所示,具有带--with前缀的编译配置参数的模块都不会被默认编译,若要使用该功能模块,需要使用提供的编译配置参数进行编译配置。相反,具有带--without前缀的编译配置参数的模块都会被默认编译,如果不想使用某个功能模块,在进行编译配置时添加带有--without前缀的参数即可。此处只列出了常用功能的编译配置参数,也可以通过编译配置命令的帮助参数获得更多的编译配置参数。

./configure --help

 

3)代码编译

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

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
复制代码

 

4)添加第三方模块

  此处只作为示例,可根据具体的需求灵活调整参数配置。编译后,默认安装目录为 /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

 

3.注册Nginx成为系统服务 

  Nginx 编译安装成功后,为了便于操作维护,建议把 Nginx 执行文件的路径添加到环境变量中,可以通过如下命令完成。

cat >/etc/profile.d/nginx.sh << EOF
PATH=$PATH:/usr/local/nginx/sbin
EOF
source /etc/profile

  在 CentOS 操作系统中,配置文件通常放在 /etc 目录下,建议将 Nginx 的 conf 目录软连接到 /etc 目录下。

ln -s /usr/local/nginx/conf /etc/nginx

  CentOS 系统环境中使用 systemd 进行系统和服务管理,可以按需守护进程,并通过 systemctl 命令进行 systemd 的监测和控制。为了方便 Nginx 应用进程的维护和管理,此处把 Nginx 注册成系统服务,由 systemd 进行服务管理,命令如下。

复制代码
cat >/usr/lib/systemd/system/nginx.service <<EOF
[Unit]                                                                                     # 记录service文件的通用信息
Description=The Nginx HTTP and reverse proxy server      # Nginx服务描述信息
After=network.target remote-fs.target nss-lookup.target  # Nginx服务启动依赖,在指定服务之后启动

[Service]                                                                                        # 记录service文件的service信息
Type=forking                                                                              # 标准UNIX Daemon使用的启动方式
PIDFile=/run/nginx.pid                                                                 # Nginx服务的pid文件位置
ExecStartPre=/usr/bin/rm -f /run/nginx.pid                                 # Nginx服务启动前删除旧的pid文件
ExecStartPre=/usr/local/nginx/sbin/nginx -t -q                           # Nginx服务启动前执行配置文件检测
ExecStart=/usr/local/nginx/sbin/nginx -g "pid /run/nginx.pid;"  # 启动Nginx服务
ExecReload=/usr/local/nginx/sbin/nginx -t -q                             # Nginx服务重启前执行配置文件检测
ExecReload=/usr/local/nginx/sbin/nginx -s reload -g "pid /run/nginx.pid;" 
                                                                                                      # 重启Nginx服务
ExecStop=/bin/kill -s HUP $MAINPID                                          # 关闭Nginx服务
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true

[Install]                                                           # 记录service文件的安装信息
WantedBy=multi-user.target                        # 多用户环境下启用
EOF

systemctl enable nginx                            # 将Nginx服务注册为系统启动后自动启动
systemctl start nginx                               # 启动Nginx服务命令
systemctl reload nginx                            # reload Nginx服务命令
systemctl stop nginx                               # stop Nginx服务命令
systemctl status nginx                            # 查看Nginx服务运行状态命令
复制代码

编译 select I/O 事件机制模块,在不支持 Nginx 默认 I/O 事件机制的操作系统下自动编译该模块

与[转帖]Nginx源码编译安装相似的内容:

[转帖]Nginx源码编译安装

https://www.cnblogs.com/lizexiong/p/15012713.html Nginx 是一款优秀的开源软件,支持在 FreeBSD、Linux、Windows、macOS 等多种操作系统平台下编译及运行。CentOS 拥有良好的系统结构和工具软件生态环境,是一款基于 Lin

[转帖]5.Nginx常遇问题入坑出坑整理

https://cloud.tencent.com/developer/article/2129777?areaSource=105001.10&traceId=zTlrks12HlQGZpAUZE_y4 0x00 Nginx 安装与编译 1.在Ubuntu系统上进行Nginx源码编译安装时指定了–

[转帖]Nginx优化与防盗链

目录 一、配置Nginx隐藏版本号1、第一种方法修改配置文件2、第二种方法修改源码文件,重新编译安装 二、修改Nginx用户与组三、配置Nginx网页缓存时间四、实现Nginx的日志分割五、配置Nginx实现连接超时六、更改Nginx运行进程数七、配置Nginx实现网页压缩功能八、配置Nginx防盗

[转帖]nginx源码编译及优化

Apache与nginx的区别 apache: 进程,稳定模块超多,基本想到的都可以找到少bug ,nginx 的bug 相对较多 nginx: 线程,快,不稳定。多线程是共享的,一个线程出问题,其他的也会受牵连。7层调度,反向代理能力强。CDN这块nginx也用的多轻量级,同样起web 服务,比a

[转帖]Nginx(5):进程绑定CPU:从nginx源码里给你刨功能出来

https://cloud.tencent.com/developer/article/1886150?from=article.detail.1767994&areaSource=106000.11&traceId=akXSS578NgvCLH6Eiqbla 希望打开这篇对你有所帮助。 文章目录

[转帖]nginx的ip_hash算法

概念 根据用户请求的ip,利用算法映射成hash值,分配到特定的tomcat服务器中。主要是为了实现负载均衡,只要用户ip固定,则hash值固定,特定用户只能访问特定服务器,解决了session的问题。 源码分析 ip_hash算法的处理代码位于src\http\modules\ngx_http_u

[转帖]探索惊群 ③ - nginx 惊群现象

https://wenfh2020.com/2021/09/29/nginx-thundering-herd/ nginx kernel 本文将通过测试,重现 nginx(1.20.1) 的惊群现象,并深入 Linux (5.0.1) 内核源码,剖析惊群原因。 1. nginx 惊群现象 2. 原因

[转帖]【官方文档】Nginx负载均衡学习笔记(三) TCP和UDP负载平衡官方参考文档

本章介绍如何使用NGINX Plus和NGINX开放源代理和负载平衡TCP和UDP流量。 目录 介绍先决条件配置反向代理配置TCP或UDP负载平衡被动健康监控 选择负载平衡方法配置会话持久性 主动健康监控 怎么运行的先决条件基本配置微调健康检查使用匹配配置块进行微调健康检查 TCP的微调健康检查UD

[转帖]nginx版本对比

https://www.cnblogs.com/lizexiong/p/15003543.html Nginx(发音同“engine x”)是一个高性能的反向代理和 Web 服务器软件,最初是由俄罗斯人 Igor Sysoev 开发的。Nginx 的第一个版本发布于 2004 年,其源代码基于双条款

[转帖]nginx版本对比

https://www.cnblogs.com/lizexiong/p/15003543.html Nginx(发音同“engine x”)是一个高性能的反向代理和 Web 服务器软件,最初是由俄罗斯人 Igor Sysoev 开发的。Nginx 的第一个版本发布于 2004 年,其源代码基于双条款