Nginx 安装配置

1.1 Nginx 概述
1.1.1 Nginx 介绍

Nginx(engine X)由Igor Sysoev于2002年开发,分为社区版和商业版(nginx plus)。2019年3月11日,F5 Networks以6.7亿美元的价格收购了Nginx。Nginx是一款免费的、开源的、高性能HTTP和反向代理服务器,同时支持邮件代理服务器以及TCP/UDP代理服务器。它被设计用于解决C10K问题(10,000个并发连接),并且广泛应用于高流量网站中。

Nginx 官网:http://nginx.org

Nginx的其他二次发行版包括:

  • Tengine:由淘宝网发起的Web服务器项目,基于Nginx进行优化,添加了许多高级功能和特性,特别适合高访问量的网站。Tengine已经在大型网站如淘宝网、天猫商城中得到了充分检验。官网:http://tengine.taobao.org/

  • OpenResty:由章亦春团队开发的基于Nginx与Lua语言的高性能Web平台,官网:http://openresty.org/cn/

1.1.2 Nginx 功能介绍
  • 静态资源服务器:如html、图片、js、css、txt等。
  • 反向代理:支持HTTP/HTTPS协议。
  • 动态资源请求反向代理:结合FastCGI/uWSGI/SCGI等协议。
  • TCP/UDP协议转发:支持tcp/udp协议的请求转发。
  • 邮件代理:支持IMAP4/POP3协议的反向代理。
1.1.3 Nginx 基础特性
  • 模块化设计:具备良好的扩展性。
  • 高可靠性:支持热部署,不停机更新配置文件、升级版本和更换日志文件。
  • 低内存消耗:在10,000个keep-alive连接下,仅需2.5MB内存。
  • 事件驱动:支持AIO、mmap、sendfile等机制。
1.2 Nginx 架构和进程
1.2.1 Nginx 进程结构

Nginx采用多进程架构,由一个Master主进程和多个Worker工作进程组成。

  • 主进程(Master Process):负责接收外部操作信号,转发给Worker进程,并监控Worker进程的运行状态。它还负责读取Nginx配置文件,建立、绑定和关闭socket连接,管理和生成工作进程,并实现不中断服务的平滑升级和重启。

  • 工作进程(Worker Process):负责处理所有网络请求。每个Worker进程都是独立且平等的,通常设置为CPU核心数,以充分利用资源并减少上下文切换的损耗。Worker进程处理客户请求,将其送入各个功能模块,执行I/O调用,与后端服务器通信,并响应客户请求。

1.2.2 Nginx 进程间通信

Nginx的主进程与工作进程之间通过管道通信。主进程生成工作进程,并在启动时为每个进程建立单向管道,用于发送指令。Worker进程之间也可以通过共享内存或管道通信,但由于它们是隔离的,因此需要通过主进程来实现状态信息的共享。

1.2.3 Nginx 启动和 HTTP 连接建立

Nginx启动时,Master进程加载配置文件并初始化监听的socket。然后,Master进程通过fork出多个Worker进程,Worker进程之间竞争新的连接,成功的Worker进程通过三次握手建立Socket连接并处理请求。

1.3 Nginx 模块介绍

Nginx支持多种模块,模块化设计使其功能可以灵活扩展。

  • 核心模块:提供Nginx的基本运行功能,如错误日志记录、配置文件解析、事件驱动机制和进程管理。
  • 标准HTTP模块:处理HTTP协议的解析和管理。
  • 可选HTTP模块:扩展HTTP功能,如多媒体传输、GeoIP请求解析、网络传输压缩和SSL支持。
  • 邮件服务模块:支持POP3、IMAP和SMTP协议的邮件服务。
  • Stream服务模块:用于TCP协议代理的实现。
  • 第三方模块:用于扩展Nginx功能,如Json支持和Lua支持。
1.4 Nginx 安装
1.4.1 Nginx 版本和安装方式

Nginx主要有三个版本:

  • Mainline version:主要开发版本,一般为奇数版本号,如1.19。
  • Stable version:最新的稳定版本,一般为偶数版本号,如1.20。
  • Legacy versions:旧的稳定版本,如1.18。

Nginx可以通过yum或源码编译安装,推荐使用源码编译方式安装。虽然yum安装较为方便,但版本通常较旧,而源码编译可以更灵活地自定义安装路径和功能,以满足特定业务需求。


Nginx 编译安装
1. 安装所需依赖包
复制代码
dnf install gcc pcre-devel zlib-devel openssl-devel -y

首先,通过 dnf 包管理器安装 Nginx 编译所需的依赖库。这些依赖包括 gcc 编译器、pcre-devel(Perl Compatible Regular Expressions 开发库)、zlib-devel(压缩库开发文件)和 openssl-devel(OpenSSL 开发文件)。

2. 创建目录并解压 Nginx 源码包
复制代码
mkdir /nginx

创建一个名为 /nginx 的目录,用于存放 Nginx 源码包。将 nginx-1.24.0.tar.gz 文件放置在该目录中,并执行解压命令:

复制代码
tar zxf nginx-1.24.0.tar.gz
3. 创建 Nginx 运行用户
复制代码
useradd -s /sbin/nologin -M nginx

通过 useradd 命令创建一个名为 nginx 的系统用户。该用户将用于运行 Nginx,并且不允许登录系统(-s /sbin/nologin)且不创建家目录(-M)。

4. 进入 Nginx 源码目录
复制代码
cd nginx-1.24.0/

进入解压后的 nginx-1.24.0 目录,准备进行配置和编译。

5. 配置 Nginx
复制代码
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module

使用 ./configure 脚本配置 Nginx 安装路径和功能模块:

  • --prefix=/usr/local/nginx:指定 Nginx 安装路径。
  • --user=nginx--group=nginx:指定 Nginx 运行的用户和用户组。
  • --with-http_ssl_module:启用 HTTPS 支持。
  • --with-http_v2_module:启用 HTTP/2 支持。
  • --with-http_realip_module:启用 IP 透传功能。
  • --with-http_stub_status_module:启用状态监控页面。
  • --with-http_gzip_static_module:启用静态文件 Gzip 压缩支持。
  • --with-pcre:启用正则表达式支持。
  • --with-stream:启用 TCP 反向代理支持。
  • --with-stream_ssl_module:启用 TCP SSL 加密支持。
  • --with-stream_realip_module:启用 TCP 透传 IP 功能。
6. 编译并安装 Nginx
复制代码
make && make install

使用 make 命令编译源码并安装 Nginx 到指定的目录。

验证版本及编译参数
1. 配置环境变量
复制代码
vim ~/.bash_profile

编辑 ~/.bash_profile 文件,添加 Nginx 二进制文件的路径到系统环境变量中:

复制代码
export PATH=$PATH:/usr/local/nginx/sbin

保存并退出后,执行以下命令使配置生效:

复制代码
source ~/.bash_profile
2. 验证 Nginx 版本及编译参数
复制代码
nginx -V

使用 nginx -V 命令查看 Nginx 的版本号和编译时启用的模块。输出如下:

此命令验证了 Nginx 是否成功安装以及是否正确编译了所需模块。

3. 创建 Nginx 启动文件
复制代码
vim /lib/systemd/system/nginx.service

创建或编辑 Nginx 的 systemd 服务文件 /lib/systemd/system/nginx.service,内容如下:

复制代码
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

关键部分解释如下:

  • [Unit] 部分定义了服务的描述、依赖和启动顺序。
  • [Service] 部分定义了服务的启动类型、启动前的检查命令、启动命令、重载和停止命令。
  • [Install] 部分定义了服务在系统中的安装模式,通常为 multi-user.target

保存并退出编辑器后,执行以下命令重新加载 systemd 配置:

复制代码
systemctl daemon-reload
4. 启动 Nginx 服务
复制代码
systemctl start nginx

启动 Nginx 服务,检查服务状态以确保其成功运行:

复制代码
systemctl status nginx

正常情况下,输出将显示 Nginx 服务已启动并运行,且各个进程状态正常。

平滑升级

将旧Nginx二进制文件换成新Nginx程序文件(注意先备份)

向master进程发送USR2信号

master进程修改pid文件名加上后缀.oldbin,成为nginx.pid.oldbin

master进程用新Nginx文件启动新master进程成为旧master的子进程,系统中将有新旧两个Nginx主

进程共同提供Web服务,当前新的请求仍然由旧Nginx的worker进程进行处理,将新生成的master进

程的PID存放至新生成的pid文件nginx.pid

向旧的Nginx服务进程发送WINCH信号,使旧的Nginx worker进程平滑停止

向旧master进程发送QUIT信号,关闭老master,并删除Nginx.pid.oldbin文件

如果发现升级有问题,可以回滚∶向老master发送HUP,向新master发送QUIT

1. 解压源码包
复制代码
[root@Nginx ~]# tar zxf nginx-1.26.1.tar.gz 

功能 :将 nginx-1.26.1.tar.gz 文件解压到当前目录。tar 命令用于解压归档文件,zxf 参数表示使用 gzip 解压并提取文件。

2. 进入 Nginx 源码目录
复制代码
[root@Nginx ~]# cd nginx-1.26.1/

功能:进入解压后的 Nginx 源码目录,以便进行配置和编译。

3. 解压额外的模块
复制代码
[root@Nginx ~]# tar zxf echo-nginx-module-0.63.tar.gz 

功能 :解压 echo-nginx-module-0.63.tar.gz 文件,该文件包含额外的 Nginx 模块。

4. 配置 Nginx
复制代码
[root@Nginx nginx-1.26.1]# ./configure --prefix=/usr/local/nginx --add-module=/root/echo-nginx-module-0.63 --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module

功能:配置 Nginx 编译选项。

  • --prefix=/usr/local/nginx:指定 Nginx 安装路径。
  • --add-module=/root/echo-nginx-module-0.63:添加第三方模块。
  • --user=nginx --group=nginx:设置运行 Nginx 的用户和用户组。
  • --with-http_ssl_module:启用 HTTPS 支持。
  • --with-http_v2_module:启用 HTTP/2 支持。
  • --with-http_realip_module:启用真实 IP 支持。
  • --with-http_stub_status_module:启用状态监控模块。
  • --with-http_gzip_static_module:启用静态文件 Gzip 压缩支持。
  • --with-pcre:启用 Perl 兼容正则表达式库。
  • --with-stream:启用流模块。
  • --with-stream_ssl_module:启用流 SSL 支持。
  • --with-stream_realip_module:启用流真实 IP 支持。
5. 编译 Nginx
复制代码
[root@Nginx nginx-1.26.1]# make

功能:编译 Nginx 源码,生成可执行文件。

6. 查看编译后的文件信息
复制代码
[root@Nginx nginx-1.26.1]# ll objs/nginx /usr/local/nginx/sbin/nginx
-rwxr-xr-x 1 root root 6177320 Aug 20 15:37 objs/nginx
-rwxr-xr-x 1 root root 5679504 Aug 20 15:00 /usr/local/nginx/sbin/nginx

功能 :列出 objs/nginx/usr/local/nginx/sbin/nginx 文件的信息,确认编译成功并显示文件大小和时间戳。

7. 替换 Nginx 可执行文件
复制代码
[root@Nginx sbin]# cp nginx nginx.1
[root@Nginx sbin]# cp -f /root/nginx-1.26.1/objs/nginx /usr/local/nginx/sbin

功能 :备份当前 Nginx 可执行文件 nginxnginx.1,然后将新编译的 nginx 文件复制到 /usr/local/nginx/sbin 目录中,替换旧的可执行文件。

8. 测试 Nginx 配置文件
复制代码
[root@Nginx sbin]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

功能:测试 Nginx 配置文件是否正确,确保配置语法无误。

9. 重新加载 Nginx 配置
复制代码
[root@Nginx sbin]# kill -USR2 36606
[root@Nginx sbin]# ps aux | grep nginx
root       36606  0.0  0.1   9840  2564 ?        Ss   15:08   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx      36607  0.0  0.2  13700  4852 ?        S    15:08   0:00 nginx: worker process
root       36608  0.0  0.4 235988  8876 pts/0    T    15:08   0:00 systemctl status nginx
root       42580  0.0  0.3   9876  6084 ?        S    15:50   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx      42581  0.0  0.2  13736  4764 ?        S    15:50   0:00 nginx: worker process
root       42583  0.0  0.1 221668  2292 pts/0    S+   15:50   0:00 grep --color=auto nginx
[root@Nginx sbin]# kill -WINCH 36606
[root@Nginx sbin]# kill -QUIT 36606

功能

  • kill -USR2 36606:发送 USR2 信号给旧的 Nginx 主进程,触发其重新加载配置。
  • ps aux | grep nginx:检查 Nginx 进程的状态。
  • kill -WINCH 36606:发送 WINCH 信号给旧的主进程,告诉它将工作进程切换到新的主进程。
  • kill -QUIT 36606:发送 QUIT 信号给旧的主进程,平稳退出。
10. 验证 Nginx 是否正常运行
复制代码
[root@Nginx sbin]# curl -I localhost
HTTP/1.1 200 OK
Server: nginx/1.26.1
Date: Tue, 20 Aug 2024 07:51:54 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Tue, 20 Aug 2024 07:00:22 GMT
Connection: keep-alive
ETag: "66c43f06-267"
Accept-Ranges: bytes

功能 :使用 curl 工具向 localhost 发送 HTTP 请求,检查 Nginx 是否正确响应,确保其正常运行并返回 HTTP 200 状态码。

回滚
Nginx 服务回滚与测试
1. 停止 Nginx 服务
复制代码
[root@Nginx sbin]# pkill nginx
  • 使用 pkill nginx 命令停止所有 Nginx 进程。
2. 备份并替换 Nginx 可执行文件
复制代码
[root@Nginx sbin]# cp nginx nginx.1
[root@Nginx sbin]# ls nginx nginx.1 nginx.2
nginx  nginx.1  nginx.2
  • 创建了 nginx.1 文件作为 nginx 文件的备份。

  • 列出当前目录下的 nginxnginx.1nginx.2 文件。

    root@Nginx sbin\]# cp /usr/local/nginx/sbin/nginx.1 /usr/local/nginx/sbin/nginx cp: overwrite '/usr/local/nginx/sbin/nginx'? y

3. 检查 Nginx 进程
复制代码
[root@Nginx sbin]# ps aux | grep nginx
[root@Nginx sbin]# ps aux | grep nginx
root       36608  0.0  0.4 235988  8876 pts/0    T    15:08   0:00 systemctl status nginx
root       42628  0.0  0.1 221668  2352 pts/0    S+   16:05   0:00 grep --color=auto nginx
  • 使用 ps aux | grep nginx 命令检查当前运行的 Nginx 进程。
4. 启动 Nginx 服务
复制代码
[root@Nginx sbin]# systemctl start nginx
[root@Nginx sbin]# systemctl status nginx
  • 使用 systemctl start nginx 命令启动 Nginx 服务。
  • 使用 systemctl status nginx 命令检查 Nginx 服务的状态。
5. 检查 Nginx 服务状态输出
复制代码
● nginx.service - The NGINX HTTP and reverse proxy server
     Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
     Active: active (running) since Tue 2024-08-20 16:06:27 CST; 5s ago
    Process: 42632 ExecStartPre=/usr/local/nginx/sbin/nginx -t (code=exited, status=0/SUCCESS)
    Process: 42633 ExecStart=/usr/local/nginx/sbin/nginx (code=exited, status=0/SUCCESS)
   Main PID: 42634 (nginx)
      Tasks: 2 (limit: 10800)
     Memory: 3.1M
        CPU: 12ms
     CGroup: /system.slice/nginx.service
             ├─42634 "nginx: master process /usr/local/nginx/sbin/nginx"
             └─42635 "nginx: worker process"

Aug 20 16:06:27 Nginx.tinminglee.org systemd[1]: Starting The NGINX HTTP and reverse proxy server...
Aug 20 16:06:27 Nginx.tinminglee.org nginx[42632]: nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
Aug 20 16:06:27 Nginx.tinminglee.org nginx[42632]: nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
Aug 20 16:06:27 Nginx.tinminglee.org systemd[1]: Started The NGINX HTTP and reverse proxy server.
  • 显示了 Nginx 服务的状态,确认服务已启动并运行。
  • 确认了 Nginx 配置文件的语法正确,并且测试成功。
  • 显示了 Nginx 的主进程(PID 42634)和工作者进程(PID 42635)。
6. 测试 Nginx 服务
复制代码
[root@Nginx sbin]# curl -I localhost
HTTP/1.1 200 OK
Server: nginx/1.24.0
Date: Tue, 20 Aug 2024 08:06:54 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Tue, 20 Aug 2024 07:00:22 GMT
Connection: keep-alive
ETag: "66c43f06-267"
Accept-Ranges: bytes
相关推荐
明月心95226 分钟前
NFS CENTOS系统 安装配置
linux·运维·centos
Raymond运维32 分钟前
MySQL 8.0源码编译安装(二)
linux·运维·mysql
延凡科技40 分钟前
延凡科技光伏清洗预测系统
大数据·运维·人工智能·科技·无人机·智慧城市
gogogo出发啦2 小时前
JVM快速入门
linux·运维·jvm
wayuncn2 小时前
16核32G硬件服务器租用需要多少钱
运维·服务器·服务器租用·裸金属服务器·物理服务器租用·物理机租用·idc服务商
木雷坞2 小时前
docker国内镜像源列表
运维·docker·容器
Hoxy.R2 小时前
一次“无告警”的服务器宕机分析:从无迹可寻到精准定位
运维·服务器
小孙姐2 小时前
Linux-Day11.WEB服务,虚拟主机
linux·运维·服务器
iLoyalty3 小时前
防御保护07-08
运维·服务器
zzywxc7873 小时前
深入探讨AI在测试领域的三大核心应用:自动化测试框架、智能缺陷检测和A/B测试优化,并通过代码示例、流程图和图表详细解析其实现原理和应用场景。
运维·人工智能·低代码·架构·自动化·流程图·ai编程