Nginx之编译及部署

1.编译环境准备

1.1 操作系统的准备

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

(1)系统服务安装

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

#1.安装扩展工具包epel yum源
[root@ansible01 ~]# yum -y install epel-release
已加载插件:langpacks, product-id, search-disabled-repos, subscription-manager
软件包 epel-release-7-14.noarch 已安装并且是最新版本
无须任何处理
#2.安装工具
[root@ansible01 ~]# yum install -y net-tools wget nscd lsof
已加载插件:langpacks, product-id, search-disabled-repos, subscription-manager
软件包 net-tools-2.0-0.25.20131004git.el7.x86_64 已安装并且是最新版本
软件包 wget-1.14-18.el7_6.1.x86_64 已安装并且是最新版本
软件包 lsof-4.87-6.el7.x86_64 已安装并且是最新版本
正在解决依赖关系
--> 正在检查事务
---> 软件包 nscd.x86_64.0.2.17-326.el7_9.3 将被 安装
--> 正在处理依赖关系 glibc = 2.17-326.el7_9.3,它被软件包 nscd-2.17-326.el7_9.3.x86_64 需要
--> 正在检查事务
---> 软件包 glibc.x86_64.0.2.17-317.el7 将被 升级
--> 正在处理依赖关系 glibc = 2.17-317.el7,它被软件包 glibc-common-2.17-317.el7.x86_64 需要
---> 软件包 glibc.x86_64.0.2.17-326.el7_9.3 将被 更新
--> 正在检查事务
---> 软件包 glibc-common.x86_64.0.2.17-317.el7 将被 升级
---> 软件包 glibc-common.x86_64.0.2.17-326.el7_9.3 将被 更新
......
已安装:
  nscd.x86_64 0:2.17-326.el7_9.3                                                                                                                                                           

作为依赖被升级:
  glibc.x86_64 0:2.17-326.el7_9.3                                                          glibc-common.x86_64 0:2.17-326.el7_9.3                                                         

完毕!

(2)DNC缓存

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

[root@ansible01 ~]# systemctl start nscd.service
[root@ansible01 ~]# systemctl enable nscd.service
Created symlink from /etc/systemd/system/multi-user.target.wants/nscd.service to /usr/lib/systemd/system/nscd.service.
Created symlink from /etc/systemd/system/sockets.target.wants/nscd.socket to /usr/lib/systemd/system/nscd.socket.

(3)修改文件打开数限制

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

[root@ansible01 ~]# echo -e "* soft nofile 65536# *号表示所用用户\n* hard nofile 65536">>/etc/security/limits.conf

1.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命令可以查看用户级文件描述符的最大打开数。

[root@ansible01 ~]# sysctl -a | grep fs.file-max
fs.file-max = 173152
sysctl: reading key "net.ipv6.conf.all.stable_secret"
sysctl: reading key "net.ipv6.conf.default.stable_secret"
sysctl: reading key "net.ipv6.conf.ens33.stable_secret"
sysctl: reading key "net.ipv6.conf.lo.stable_secret"
sysctl: reading key "net.ipv6.conf.virbr0.stable_secret"
sysctl: reading key "net.ipv6.conf.virbr0-nic.stable_secret"
[root@ansible01 ~]# ulimit -n
1024

2.Nginx源码编译

2.1 Nginx源码获取

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

[root@ansible01 ~]# mkdir -p /opt/data/source
[root@ansible01 ~]# cd /opt/data/source/
[root@ansible01 source]# wget http://nginx.org/download/nginx-1.27.0.tar.gz  
--2024-06-06 15:07:42--  http://nginx.org/download/nginx-1.27.0.tar.gz
正在解析主机 nginx.org (nginx.org)... 3.125.197.172, 52.58.199.22, 2a05:d014:5c0:2601::6, ...
正在连接 nginx.org (nginx.org)|3.125.197.172|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:1244887 (1.2M) [application/octet-stream]
正在保存至: "nginx-1.27.0.tar.gz"

100%[=================================================================================================================================================>] 1,244,887   17.8KB/s 用时 2m 10s 

2024-06-06 15:09:54 (9.35 KB/s) - 已保存 "nginx-1.27.0.tar.gz" [1244887/1244887])

[root@ansible01 source]# tar -zxvf nginx-1.27.0.tar.gz 
nginx-1.27.0/
nginx-1.27.0/man/
nginx-1.27.0/LICENSE
nginx-1.27.0/configure
nginx-1.27.0/auto/
nginx-1.27.0/CHANGES
nginx-1.27.0/CHANGES.ru
nginx-1.27.0/html/
nginx-1.27.0/contrib/
......
nginx-1.27.0/auto/types/value
nginx-1.27.0/auto/types/uintptr_t
nginx-1.27.0/auto/types/sizeof
nginx-1.27.0/man/nginx.8

2.2 编译配置参数

编译Nginx源码文件时,首先需要通过编译配置命 令configure进行编译配置。

参数名称 备注
--prefix=value 指向安装目录
--sbin-path 指向(执行)程序文件(nginx
--conf-path= 指向配置文件(nginx.conf
--error-log-path= 指向错误日志目录
--pid-path= 指向 pid 文件(nginx.pid
--lock-path= 指向 lock 文件(nginx.lock)(安装文件锁定,防止安装文件被别人利用,或自己误操作。)进程ID文件
--user= 指定程序运行时的用户名
--group= 指定程序运行时的用户组名
--builddir= 指向编译目录
--with-rtsig_module 启用 rtsig 模块支持(实时信号)
--with-select_module 启用 select 模块支持(一种轮询模式,不推荐在高载环境下使用)禁用:--without-select_module
--with-poll_module 启用 poll 模块支持(功能与 select 相同,与 select 特性相同,为一种轮询模式,不推荐在高载环境下使用)
--with-file-aio 启用 file aio 支持(一种 APL 文件传输格式)
--with-ipv6 启用 ipv6 支持
--add-module= 启用外部模块支持
--with-cc= 指向 C 编译器路径
--with-cpp= 指向 C 预处理路径
--with-cc-opt= 设置 C 编译器参数
--with-ld-opt= 设置连接文件参数
--with-cpu-opt= 指定编译的 CPU,可用的值为:pentium, pentiumpro, pentium3, pentium4, athlon, opteron, amd64, sparc32, sparc64, ppc64
--without-pcre 禁用 PCRE 库
--with-pcre 启用 PCRE 库
--with-pcre= 指向 PCRE 库文件目录
--with-pcre-opt= 在编译时为 PCRE 库设置附加参数
--with-md5= 指向 MD5 库文件目录(消息摘要算法第五版,用以提供消息的完整性保护)
--with-md5-opt= 在编译时为 MD5 库设置附加参数
--with-md5-asm 使用 MD5 汇编源
--with-sha1= 指向 sha1 库目录(数字签名算法,主要用于数字签名)
--with-sha1-opt= 在编译时为 sha1 库设置附加参数
--with-sha1-asm 使用 sha1 汇编源
--with-perl= 设定 perl 库文件路径
--with-zlib= 指向 zlib 库目录
--with-zlib-opt= 在编译时为 zlib 设置附加参数
--with-zlib-asm= 为指定的 CPU 使用 zlib 汇编源进行优化,CPU 类型为 pentium, pentiumpro
--with-libatomic 为原子内存的更新操作的实现提供一个架构
--with-libatomic= 指向 libatomic_ops 安装目录
--with-openssl= 指向 openssl 安装目录
--with-openssl-opt 在编译时为 openssl 设置附加参数
--with-debug 启用 debug 日志
--with-http_ssl_module 启用 ngx_http_ssl_module 支持(使支持 HTTPS 请求,需已安装 openssl)
--with-http_realip_module 启用 ngx_http_realip_module 支持(这个模块允许从请求标头更改客户端的 IP 地址值,默认为关)
--with-http_addition_module 启用 ngx_http_addition_module 支持(作为一个输出过滤器,支持不完全缓冲,分部分响应请求)
--with-http_xslt_module 启用 ngx_http_xslt_module 支持(过滤转换 XML 请求)
--with-http_image_filter_module 启用 ngx_http_image_filter_module 支持(传输 JPEG/GIF/PNG 图片的一个过滤器)(默认为不启用。GD 库要用到)
--with-http_geoip_module 启用 ngx_http_geoip_module 支持(该模块创建基于与 MaxMind GeoIP 二进制文件相配的客户端 IP 地址的 ngx_http_geoip_module 变量)
--with-http_sub_module 启用 ngx_http_sub_module 支持(允许用一些其他文本替换 Nginx 响应中的一些文本)
--with-http_dav_module 启用 ngx_http_dav_module 支持(增加 PUT、DELETE、MKCOL 创建集合,COPY 和 MOVE 方法)默认情况下为关闭,需编译开启
--with-http_flv_module 启用 ngx_http_flv_module 支持(提供寻求内存使用基于时间的偏移量文件)
--with-http_gzip_static_module 启用 ngx_http_gzip_static_module 支持(在线实时压缩输出数据流)
--with-http_random_index_module 启用 ngx_http_random_index_module 支持(从目录中随机挑选一个目录索引)
--with-http_secure_link_module 启用 ngx_http_secure_link_module 支持(计算和检查要求所需的安全链接网址)
--with-http_degradation_module 启用 ngx_http_degradation_module 支持(允许在内存不足的情况下返回204或444码)
--with-http_stub_status_module 启用 ngx_http_stub_status_module 支持(获取 Nginx 自上次启动以来的工作状态)
--without-http_charset_module 禁用 ngx_http_charset_module 支持(重新编码 WEB 页面,但只能是一个方向--服务器端到客户端,并且只有一个字节的编码可以被重新编码)
--without-http_gzip_module 禁用 ngx_http_gzip_module 支持(该模块同 --with-http_gzip_static_module 功能一样)
--without-http_ssi_module 禁用 ngx_http_ssi_module 支持(该模块提供了一个在输入端处理处理服务器包含文件(SSI)的过滤器,目前支持 SSI 命令的列表是不完整的)
--without-http_userid_module 禁用 ngx_http_userid_module 支持(该模块用来处理用来确定客户端后续请求的 cookie
--without-http_access_module 禁用 ngx_http_access_module 支持(该模块提供了一个简单的基于主机的访问控制。允许/拒绝基于 IP 地址)
--without-http_auth_basic_module 禁用 ngx_http_auth_basic_module(该模块是可以使用用户名和密码基于 HTTP 基本认证方法来保护你的站点或其部分内容)
--without-http_autoindex_module 禁用 ngx_http_autoindex_module 支持(该模块用于自动生成目录列表,只在 ngx_http_index_module 模块未找到索引文件时发出请求。)
--without-http_geo_module 禁用 ngx_http_geo_module 支持(创建一些变量,其值依赖于客户端的IP地址)
--without-http_map_module 禁用 ngx_http_map_module 支持(使用任意的键/值对设置配置变量)
--without-http_split_clients_module 禁用 ngx_http_split_clients_module 支持(该模块用来基于某些条件划分用户。条件如:ip地址、报头、cookies等等)
--without-http_referer_module 禁用 ngx_http_referer_module支持(该模块用来过滤请求,拒绝报头中 Referer 值不正确的请求)
--without-http_rewrite_module 禁用 ngx_http_rewrite_module ,链接重写
--without-http_proxy_module 禁用 ngx_http_proxy_module 支持(有关代理服务器)
--without-http_fastcgi_module 禁用 ngx_http_fastcgi_module 支持(该模块允许 Nginx 与 FastCGI 进程交互,并通过传递参数来控制 FastCGI 进程工作。 )FastCGI 一个常驻型的公共网关接口。
--without-http_uwsgi_module 禁用 ngx_http_uwsgi_module 支持(该模块用来医用uwsgi协议,uWSGI服务器相关)
--without-http_scgi_module 禁用 ngx_http_scgi_module支持
--without-http_memcached_module 禁用 ngx_http_memcached_module 支持(该模块用来提供简单的缓存,以提高系统效率)
-without-http_limit_zone_module 禁用 ngx_http_limit_zone_module 支持(该模块可以针对条件,进行会话的并发连接数控制)
--without-http_limit_req_module 禁用 ngx_http_limit_req_module 支持(该模块允许你对于一个地址进行请求数量的限制用一个给定的session或一个特定的事件)
--without-http_empty_gif_module 禁用 ngx_http_empty_gif_module 支持(该模块在内存中常驻了一个1*1的透明GIF图像,可以被非常快速的调用)
--without-http_browser_module 禁用 ngx_http_browser_module 支持
--without-http_upstream_ip_hash_module 禁用 ngx_http_upstream_ip_hash_module 支持(该模块用于简单的负载均衡)
--with-http_perl_module 启用 ngx_http_perl_module 支持(该模块使nginx可以直接使用perl或通过ssi调用perl)
--with-perl_modules_path= 设定 perl 模块路径
--http-log-path= 设定 access log 路径
--http-client-body-temp-path= 设定 HTTP 客户端请求临时文件路径
--http-proxy-temp-path= 设定 HTTP 代理临时文件路径
--http-fastcgi-temp-path= 设定 HTTP Fastcgi 临时文件路径
--http-uwsgi-temp-path= 设定 HTTP uwsgi 临时文件路径
--http-scgi-temp-path= 设定 HTTP scgi 临时文件路径
--without-http 禁用 HTTP server 功能
--without-http-cache 禁用 HTTP Cache 功能
--with-mail 启用 POP3/IMAP4/SMTP 代理模块支持
--with-mail_ssl_module 启用 ngx_mail_ssl_module 支持
--without-mail_pop3_module 禁用 POP3 协议
--without-mail_imap_module 禁用 IMAP 协议
--without-mail_smtp_module 禁用 SMTP 协议
--with-google_perftools_module 启用 ngx_google_perftools_module 支持(调试用,剖析程序性能瓶颈)
--with-cpp_test_module 启用 ngx_cpp_test_module 支持

2.3 代码编译

安装编译工具及依赖库,命令如下:

[root@ansible01 source]# yum install -y 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
已加载插件:langpacks, product-id, search-disabled-repos, subscription-manager
......
作为依赖被升级:
  krb5-libs.x86_64 0:1.15.1-55.el7_9  libxml2.x86_64 0:2.9.1-6.el7_9.6  libxml2-python.x86_64 0:2.9.1-6.el7_9.6  openssl.x86_64 1:1.0.2k-26.el7_9  openssl-libs.x86_64 1:1.0.2k-26.el7_9 
  xz.x86_64 0:5.2.2-2.el7_9           xz-libs.x86_64 0:5.2.2-2.el7_9    zlib.x86_64 0:1.2.7-21.el7_9            

完毕!

编译所有功能模块,命令如下:

./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。

2.4 添加第三方模块

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

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

./configure --addmodule=../ngx_http_proxy_connect_module

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

./configure --add-dynamic-module=../ngx_http_proxy_connect_module --with-compat

3. Nginx部署

3.1 环境配置

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

3.2 命令行参数

Nginx执行文件的命令行参数可以通过-h参数获 取,Nginx命令行参数如下:

Usage: nginx [-?hvVtTq] [-s signal] [-c
filename] [-p prefix] [-g directives]
Options:
-?,-h : this help
-v : show version and exit
-V : show version and configure
options then exit
-t : test configuration and exit
-T : test configuration, dump it and
exit
-q : suppress non-error messages
during configuration testing
-s signal : send signal to a master
process: stop, quit, reopen, reload
-p prefix : set prefix path (default:
/usr/local/openresty/nginx/)
-c filename : set configuration file
(default: conf/nginx.conf)
-g directives : set global directives out of
configuration file

3.3 注册系统服务

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 nsslookup.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服务运行状态命令

注:我们在实际应用中一般直接添加yum源后直接yum install -y nginx进行安装。

相关推荐
hjjdebug1 小时前
linux 下 signal() 函数的用法,信号类型在哪里定义的?
linux·signal
其乐无涯1 小时前
服务器技术(一)--Linux基础入门
linux·运维·服务器
Diamond技术流1 小时前
从0开始学习Linux——网络配置
linux·运维·网络·学习·安全·centos
写bug的小屁孩1 小时前
前后端交互接口(三)
运维·服务器·数据库·windows·用户界面·qt6.3
斑布斑布1 小时前
【linux学习2】linux基本命令行操作总结
linux·运维·服务器·学习
紅色彼岸花1 小时前
第六章:DNS域名解析服务器
运维·服务器
Spring_java_gg1 小时前
如何抵御 Linux 服务器黑客威胁和攻击
linux·服务器·网络·安全·web安全
✿ ༺ ོIT技术༻1 小时前
Linux:认识文件系统
linux·运维·服务器
恒辉信达1 小时前
hhdb数据库介绍(8-4)
服务器·数据库·mysql
会掉头发2 小时前
Linux进程通信之共享内存
linux·运维·共享内存·进程通信