Linux系统简单源码安装NGINX版本1.28.0
由于我的Linux系统yum源过旧,nginx版本维持在1.21.5,使用源码安装NGINX最新版本。
一、先安装依赖工具:
sudo yum install -y gcc gcc-c++ make automake autoconf libtool zlib-devel openssl-devel
pcre-devel pcre2-devel
二、下载NGINX源码
下载的源码放置在/tmp下,系统重启后自动清理,避免残留
cd /tmp
wget https://nginx.org/download/nginx-1.28.0.tar.gz
tar -zxvf nginx-1.28.0.tar.gz
cd nginx-1.28.0
三、配置、编译、安装
预编译:
./configure
--prefix=/usr/share/nginx \ #用于指定NGINX安装后的根目录路径#
--sbin-path=/usr/sbin/nginx \ #用于指定NGINX主程序(二进制文件)的安装路径#
--conf-path=/etc/nginx/nginx.conf \ #用于指定NGINX主配置文件的安装位置#
--with-http_ssl_module \ #用于启用HTTPS协议支持#
--with-http_v2_module #启用HTTP/2协议#
这些编译参数只是简易版本,能够实现最基础的网页发布,旨在记录安装流程。
反向代理、负载均衡等功能需要另外添加参数。如下:

在我的Linux环境中预编译时有依赖项not found,下面是我缺失的部分。

checking for sys/filio.h ... not found 该头文件用于BSD类系统的文件IO控制,Linux系统不适用
checking for /dev/poll ... not found /dev/poll是Solaris系统提供的事件通知机制,Linux使用epoll
checking for kqueue ... not found kqueue是BSD类系统的事件通知机制,Linux不适用
checking for crypt() ... not found crypt()是C标准中的密码加密函数,用于生成和校验密码
checking for F_READAHEAD ... not found F_READAHEAD是Linux内核的文件预读控制标志,用于优化大文件读取性能
checking for F_NOCACHE ... not found Linux内核的文件操作标志,用于控制文件IO是否绕过系统缓存
checking for directio() ... not found FreeBSD系统特有的函数,用于控制文件IO是否绕过系统缓存
checking for SO_SETFIB ... not found FreeBSD/Solaris等BSD类系统的套接字选项
checking for SO_ACCEPTFILTER ... not found FreeBSD系统的套接字选项,用于优化TCP连接
checking for SO_BINDANY ... not found FreeBSD系统的套接字选项,用于监听任意网络接口的特定端口
checking for IP_BINDANY ... not found IP_BINDANY允许套接字绑定到未分配IP的网络接口
checking for IP_RECVDSTADDR ... not found IP_RECVDSTADDR 允许接收数据包的目标地址(用于多 IP 主机)
checking for IP_SENDSRCADDR ... not found IP_SENDSRCADDR 允许指定发送数据包的源地址
checking for IP_DONTFRAG ... not found IP_DONTFRAG 禁止 IP 数据包分片
checking for setproctitle() ... not found 该函数是非标准函数,用于动态修改进程的命令行标题
checking for struct dirent.d_namlen ... not found
d_namlen是结构体dirent中的一个字段,用于存储文件名的长度(字节数)
若./configure最后显示Configuration summary且无报错,可继续编译。
但本着好奇的心理,以防万一,针对非版本不同导致的依赖项缺失做出处理。
crypt():C标准中的密码加密函数,用于生成和校验用户密码(如auth_basic模块),如果需要使用密码认证,则需要解决此问题,。
crypt()函数源于libcrypt开发库,缺失是因为用户未安装libcrypt库,或者就是链接失败了。
使用find /usr -name "libcrypt*"命令检查libcrypt库是否安装。

验证安装之后,说明问题是libcrypt开发库已装但预编译检测不到。核心是让编译工具正确找到库的头文件和链接库。
在./configure时,通过参数强制指定libcrypt路径,例如:
./configure
--with-ld-opt="-L/usr/lib64 -lcrypt" \ 传递链接器去指定路径搜索库,解决库文件找不到的问题
...\
F_READAHEAD:Linux系统的一个文件操作标志,用于向内核提示预读文件内容,提高I/O性能。通常不影响后续的编译安装运行,F_READAHEAD不可用的情况,NGINX会自动使用sendfile()或者splice()等高效的文件传输机制。
F_NOCACHE:Linux系统文件操作标志,用于控制I/O是否绕过系统缓存。可能是系统版本过旧,或者系统的fcntl.h头文件版本过旧,未定义。F_NOCACHE未定义的话,NGINX会自动降级使用其他的方式控制I/O(如O_DIRECT),不会因F_NOCACHE缺失而崩溃。
IP_BINDANY、IP_RECVDSTADDR、IP_SENDSRCADDR、IP_DONTFRAG四个用于控制网络套接字的行为。
这几个宏应该在/usr/include/linux/in.h或者/usr/include/netinet/in.h。
我搜索了一下,在头文件中不包含这四个宏定义,可能是openeluer可能因定制化或者安全策略移除了部分头文件定义,也可能是我的kernel-devel或net-tools-devel包未正确安装,版本与内核不匹配,头文件路径异常等等。有几种解决方法:在in.h中手动添加宏定义,自建一个库文件,在预编译的时候链接上去,或者更为麻烦的去检查版本、内核、数据包的问题。这里选择自建一个nginx_ip_opts.h库文件。

之后再在预编译阶段包含这个库即可。
./configure --with-cc-opt="*-include $(pwd)/nginx_ip_opts.h" ...
checking for setproctitle() ... not found 是NGINX在编译配置进程标题设置的功能,用以动态修改进程的命令标题。
可能是由于系统不支持或者检测失败,头文件缺失或者不完整
没有这个函数,nginx会自动降级使用其他方式显示进程标题,不会因setproctitle()缺失而崩溃。
struct dirent.d_namlen : Linux中struct dirent结构体的一个字段,用于表示文件名长度。
这个缺失NGINX会自动降级使用其他方式获取文件名长度(如strlen()),不会因d_namlen缺失而崩溃。
经过了解,上述警告都属于常见警告,无需处理,只有crypt()在需要密码加密时才有用。
make && sudo make install
之后编译就顺利编译成功,我们先暂时关闭防火墙,启动NGINX,用浏览器访问到默认页面就说明安装成功。

好像出现了意外情况,我们访问IP没有出现默认页面,报了403forbidden,这往往是缺失页面导致的错误。

配置文件中显示网站理应出现index.html,我们打开/usr/share/nginx/html/目录,发现里面只有一个api目录,没有index.html,我们新建一个,并往其中写入内容。

此时刷新网页

成功!

浙公网安备 33010602011771号