尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Nginx 安装配置

Nginx 安装配置 1.1 Nginx 概述###### 1.1.1 Nginx 介绍Nginxengine X由Igor Sysoev于2002年开发分为社区版和商业版nginx plus。2019年3月11日F5 Networks以6.7亿美元的价格收购了Nginx。Nginx是一款免费的、开源的、高性能HTTP和反向代理服务器同时支持邮件代理服务器以及TCP/UDP代理服务器。它被设计用于解决C10K问题10,000个并发连接并且广泛应用于高流量网站中。Nginx 官网http://nginx.orgNginx的其他二次发行版包括*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-develPerl Compatible Regular Expressions 开发库、zlib-devel压缩库开发文件和openssl-develOpenSSL 开发文件。##### 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 --usernginx --groupnginx --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 安装路径。*--usernginx和--groupnginx指定 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] DescriptionThe NGINX HTTP and reverse proxy server Aftersyslog.target network-online.target remote-fs.target nss-lookup.target Wantsnetwork-online.target [Service] Typeforking 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 PrivateTmptrue [Install] WantedBymulti-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. 解压源码包 [rootNginx ~]# tar zxf nginx-1.26.1.tar.gz功能将nginx-1.26.1.tar.gz文件解压到当前目录。tar命令用于解压归档文件zxf参数表示使用 gzip 解压并提取文件。#### 2. 进入 Nginx 源码目录 [rootNginx ~]# cd nginx-1.26.1/功能进入解压后的 Nginx 源码目录以便进行配置和编译。#### 3. 解压额外的模块 [rootNginx ~]# tar zxf echo-nginx-module-0.63.tar.gz功能解压echo-nginx-module-0.63.tar.gz文件该文件包含额外的 Nginx 模块。#### 4. 配置 Nginx [rootNginx nginx-1.26.1]# ./configure --prefix/usr/local/nginx --add-module/root/echo-nginx-module-0.63 --usernginx --groupnginx --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添加第三方模块。*--usernginx --groupnginx设置运行 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 [rootNginx nginx-1.26.1]# make功能编译 Nginx 源码生成可执行文件。#### 6. 查看编译后的文件信息 [rootNginx 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 可执行文件 [rootNginx sbin]# cp nginx nginx.1 [rootNginx sbin]# cp -f /root/nginx-1.26.1/objs/nginx /usr/local/nginx/sbin功能备份当前 Nginx 可执行文件nginx为nginx.1然后将新编译的nginx文件复制到/usr/local/nginx/sbin目录中替换旧的可执行文件。#### 8. 测试 Nginx 配置文件 [rootNginx 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 配置 [rootNginx sbin]# kill -USR2 36606 [rootNginx 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 --colorauto nginx [rootNginx sbin]# kill -WINCH 36606 [rootNginx sbin]# kill -QUIT 36606功能*kill -USR2 36606发送 USR2 信号给旧的 Nginx 主进程触发其重新加载配置。*ps aux | grep nginx检查 Nginx 进程的状态。*kill -WINCH 36606发送 WINCH 信号给旧的主进程告诉它将工作进程切换到新的主进程。*kill -QUIT 36606发送 QUIT 信号给旧的主进程平稳退出。#### 10. 验证 Nginx 是否正常运行 [rootNginx 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 服务 [rootNginx sbin]# pkill nginx * 使用pkill nginx命令停止所有 Nginx 进程。##### 2. 备份并替换 Nginx 可执行文件 [rootNginx sbin]# cp nginx nginx.1 [rootNginx sbin]# ls nginx nginx.1 nginx.2 nginx nginx.1 nginx.2 * 创建了nginx.1文件作为nginx文件的备份。* 列出当前目录下的nginx、nginx.1和nginx.2文件。 [rootNginx sbin]# cp /usr/local/nginx/sbin/nginx.1 /usr/local/nginx/sbin/nginx cp: overwrite ‘/usr/local/nginx/sbin/nginx’? y * 使用cp命令将nginx.1文件复制为nginx文件并确认覆盖已存在的nginx文件。##### 3. 检查 Nginx 进程 [rootNginx sbin]# ps aux | grep nginx [rootNginx 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 --colorauto nginx * 使用ps aux | grep nginx命令检查当前运行的 Nginx 进程。##### 4. 启动 Nginx 服务 [rootNginx sbin]# systemctl start nginx [rootNginx 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 (codeexited, status0/SUCCESS) Process: 42633 ExecStart/usr/local/nginx/sbin/nginx (codeexited, status0/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 服务 [rootNginx 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
返回列表