Nginx 安装及升级
本文档主要做为需要安装或升级 Nginx 版本或者需要重新编译 Nginx 为其添加新模块时的参考。Nginx 服务常用配置说明
环境信息
- Centos 7 5.4.225-1
- nginx stable 1.24.0
编译安装 Nginx
编译安装 Nginx 之前,首先需要安装依赖包 [1]
pcre
cd /tmp |
zlib
cd /tmp |
openssl
cd /tmp |
编译安装 Nginx
下载 Nginx stable 版本编译安装
wget https://nginx.org/download/nginx-1.24.0.tar.gz |
要启用或者停用指定的 Nginx 自带模块,参考 Nginx 编译配置选项说明
此处编译配置添加第三方模块 nginx-module-vts
以支持 Prometheus。执行以下命令编译 Nginx 并添加第三方模块 nginx-module-vts
。Nginx 和 nginx-module-vts 版本兼容列表
wget https://github.com/vozlt/nginx-module-vts/archive/refs/tags/v0.2.2.tar.gz |
编译安装后的软件包,只需要安装好依赖,便可以迁移到其他机器上面使用,本文档编译安装后的软件包下载链接
为 Nginx 配置 systemd 管理配置文件
为了能使用 systemctl
管理源码编译安装的 nginx,可以为其使用以下配置文件将其托管到 systemd
[Unit] |
Prometheus 采集 Nginx 监控数据
参考步骤安装 nginx-module-vts
模块,以支持 Prometheus 采集 Nginx 统计数据。
如果要统计 Nginx 所有的 vhost 数据,则将 nginx-module-vts
模块相关配置放置于 http
模块内,否则可以在只想要监控(统计)的 vhost (server
配置段) 中添加配置。
nginx-module-vts
模块相关配置命令说明:
命令 | 说明 | 用法示例 |
---|---|---|
vhost_traffic_status_zone |
定义 vhost_traffic_status 模块使用的共享内存区域。用于存储虚拟主机的流量统计信息 |
vhost_traffic_status_zone shared_memory_name size; shared_memory_name 是共享内存区域的名称,size 是共享内存区域的大小。 |
vhost_traffic_status_filter_by_host |
按主机名过滤虚拟主机状态信息 默认会将流量全部计算到第一个 server_name 上;启用后,只会显示与请求的主机名匹配的虚拟主机状态信息。 |
vhost_traffic_status_filter_by_host on; |
vhost_traffic_status_filter_by_set_key |
根据自定义键值对来过滤虚拟主机的状态信息 | vhost_traffic_status_filter_by_set_key $host$request_uri; |
vhost_traffic_status_filter_by_set_zone |
过滤器使用的共享内存区域 | |
vhost_traffic_status_display |
用于显示虚拟主机状态信息的格式 支持 json 、CSV 和 html |
vhost_traffic_status_display_format html; |
vhost_traffic_status_display_format |
用于显示虚拟主机状态信息的字段格式。 可以选择显示的字段有:request、status、request_time、request_length、request_method、request_uri、request_length、request_time、request_time_counter、request_time_counter_overflows、request_time_min、request_time_max、request_time_avg、request_time_median、request_time_percentile。 |
vhost_traffic_status_display_format field1 field2 ...; |
为了获取所有域名的统计信息,在 Nginx 的 http
模块内添加以下配置:
http { |
重载配置后查看请求内容:
curl localhost:8888/status |
统计信息输出结果支持多种格式:
localhost:8888/status/format/json
- Jsonlocalhost:8888/status/format/html
- Htmllocalhost:8888/status/format/jsonp
- Jsonplocalhost:8888/status/format/prometheus
- Prometheuslocalhost:8888/status/format/control
- control
在 Prometheus 中添加以下 Targets 配置抓取 nginx-module-vts
模块暴露出的统计信息
- job_name: "Nginx" |
在 Prometheus 中检查抓取到的数据
常见错误
error while loading shared libraries
Nginx 编译安装成功后,启动报错
/usr/local/nginx-1.24.0/sbin/nginx -t |
问题原因 为 Nginx 在系统的库文件路径中未找到已经安装的 libpcre2-8.so.0
库文件。可以通过以下方式验证
- 搜索
libpcre2-8.so.0
,可以看到系统上已经存在此库文件/usr/local/lib/libpcre2-8.so.0
find / -name libpcre2-8.so.0
/usr/local/lib/libpcre2-8.so.0 - 检查此库文件是否在系统已加载的库文件中。执行以下命令搜索系统已经加载的库文件,发现没有
/usr/local/lib/libpcre2-8.so.0
ldconfig -p | grep libpcre
libpcre32.so.0 (libc6,x86-64) => /lib64/libpcre32.so.0
libpcre16.so.0 (libc6,x86-64) => /lib64/libpcre16.so.0
libpcreposix.so.0 (libc6,x86-64) => /lib64/libpcreposix.so.0
libpcrecpp.so.0 (libc6,x86-64) => /lib64/libpcrecpp.so.0
libpcre.so.1 (libc6,x86-64) => /lib64/libpcre.so.1 - 检查系统共享库文件的查找路径的配置文件
/etc/ld.so.conf
,发现其中不包括路径/usr/local/lib/
,因此位于此路径下的共享库文件无法被搜索到cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
要解决此问题,可以使用以下方法之一:
添加
/usr/local/lib/
到系统共享库查找路径配置文件/etc/ld.so.conf
/etc/ld.so.conf include ld.so.conf.d/*.conf
/usr/local/lib/执行以下命令,使配置生效
ldconfig
设置系统环境变量
LD_LIBRARY_PATH
,这个变量定义了系统共享库的查找目录。将/usr/local/lib
添加到此变量的值中,要永久生效需要将其写入配置文件,如~/.bash_profile
等export LD_LIBRARY_PATH="/usr/local/lib:$LD_LIBRARY_PATH"
创建符号链接
ln -s /usr/local/lib/libpcre2-8.so.0 /usr/local/nginx-1.24.0/sbin/libpcre2-8.so.0
或者
ln -s /usr/local/lib/libpcre2-8.so.0 /lib64/libpcre2-8.so.0
SSL modules require the OpenSSL library
执行以下命令执行编译前配置时报错 ./configure: error: SSL modules require the OpenSSL library.
:
./configure --prefix=/usr/local/nginx-1.24.0 \ |
此报错原因为未找到 OpenSSL 的库文件。
针对此场景,可以通过在编译配置时指定 OpenSSL 的源码中库文件的具体位置(--with-openssl=/tmp/openssl-1.1.1t
),参考以下命令
./configure --prefix=/usr/local/nginx-1.24.0 \ |
Error 127
Nginx 执行 make
命令时报错: /bin/sh: line 2: ./config: No such file or directory
./configure --prefix=/usr/local/nginx-1.24.0 \ |
错误信息表明在编译 nginx 时,make
命令无法找到 OpenSSL 的配置脚本 config
。此脚本位于 OpenSSL 的源码目录中。可以通过 --with-openssl=/tmp/openssl-1.1.1t
指定。
修改编译前的配置命令如下:
./configure --prefix=/usr/local/nginx-1.24.0 \ |
getpwnam(“nginx”) failed
nginx 报错
nginx: the configuration file /usr/local/nginx-1.24.0/conf/nginx.conf syntax is ok |
问题原因 为 nginx
用户不存在,创建 nginx
用户或者修改配置文件,使用已有的用户运行 nginx