教你像个大佬一样从源码编译Nginx实现自定义安装模块(2024)

简介

以二进制文件形式(或者apt)安装的Nginx能满足大部分的场景需求,但这样也造成可能安装了你不需要的模块或者又没有安装你需要的模块,那么可以通过从Nginx源码编译安装的方式,实现根据自己的需求来选择所要安装的Nginx模块。

Nginx官网有从源码安装的文档,只要你照着它的文档一步步的去做,那就肯定。。。会报错。🙉

那怎样才能完成编译安装呢,阅读完这篇文章你就懂了!👍

系统环境

本文以Ubuntu系统为例说明,其他的Linux发行版也能够参照操作。

安装依赖

  1. 检查系统中是否有gcc编译工具
sh 复制代码
gcc --version
  1. 如果没有的话,先安装gcc
sh 复制代码
sudo apt update
sudo apt install build-essential
  1. 安装PCRE
sh 复制代码
wget github.com/PCRE2Project/pcre2/releases/download/pcre2-10.42/pcre2-10.42.tar.gz
tar -zxf pcre2-10.42.tar.gz
cd pcre2-10.42
./configure
make
sudo make install
  1. 安装zlib
sh 复制代码
wget https://github.com/madler/zlib/releases/download/v1.2.13/zlib-1.2.13.tar.gz
tar -zxf zlib-1.2.13.tar.gz
cd zlib-1.2.13
./configure
make
sudo make install

官网文档上zlib的下载链接是无效的,因为zlib在上个月(2024年1月)发布了新版,旧版链接被移除,但Nginx的文档没有更新。为了不引起可能的版本问题,这里我用zlib在GitHub上的旧版链接进行下载。

  1. 安装OpenSSL
sh 复制代码
wget http://www.openssl.org/source/openssl-1.1.1v.tar.gz
tar -zxf openssl-1.1.1v.tar.gz
cd openssl-1.1.1v
./config --prefix=/usr
make
sudo make install

在官网安装文档中,这里突然给了个Mac下的编译配置命令,也没有给任何注释,所以要修改为上面的命令才能安装。(注意:config是全小写的,而不是官网文档中的大写Configure)

下载源码

sh 复制代码
wget https://nginx.org/download/nginx-1.24.0.tar.gz
tar zxf nginx-1.24.0.tar.gz
cd nginx-1.24.0

你也可以从官网页面上下载源码,打开这个下载页面:

然后在Stable version下点击当前最新的稳定版nginx-1.24.0链接,不要去下面Source Code那栏中找,那地方找到的源码与这个源码的目录结构不同,所以安装方法也不同。

编译安装

  1. 安装配置

在这里就可以进行模块选择了。比如,我只要http、ssl以及tcp四层转发,那么用下面的命令进行安装配置:

sh 复制代码
./configure \
--sbin-path=/usr/local/nginx/nginx \
--conf-path=/usr/local/nginx/nginx.conf \
--pid-path=/usr/local/nginx/nginx.pid \
--http-log-path=/var/log/nginx/access.log \
--error-log-path=/var/log/nginx/error.log \
--with-pcre=../pcre2-10.42 \
--with-zlib=../zlib-1.2.13 \
--with-openssl=../openssl-1.1.1v \
--with-stream \
--with-stream_ssl_preread_module \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module

具体有哪些模块,可以打开这个链接查看,根据自己的需求选择安装。

  1. 编译源码
sh 复制代码
make
sudo make install
  1. 列出安装的模块
sh 复制代码
sudo /usr/local/nginx/nginx -V
  1. 启动Nginx
sh 复制代码
sudo /usr/local/nginx/nginx
  1. 停止Nginx
sh 复制代码
sudo /usr/local/nginx/nginx -s quit

OK,到这里就完成了Nginx的编译安装!👏

报错排除

  1. 编译报错:configure: error: no acceptable C compiler found in $PATH

缺少gcc编译环境,安装gcc编译工具:

sh 复制代码
sudo apt update
sudo apt install build-essential
  1. 下载zlib报错:ERROR 404: Not Found

zlib 1.2.13的下载地址为:github.com/madler/zlib...

  1. 安装OpenSSL报错:cc: error: unrecognized command-line option '-arch'

安装时的配置参数不正确,在Linux中的命令是:./config --prefix=/usr

  1. OpenSSL报错:error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory

这是可能在编译安装完OpenSSL后,调用OpenSSL相关方法时报的错,解决方法:

sh 复制代码
export LD_LIBRARY_PATH=/usr/local/lib:/usr/local/lib64
sudo ldconfig

参考资料

docs.nginx.com/nginx/admin...

nginx.org/en/download...

nginx.org/en/docs/con...

stackoverflow.com/questions/4...

相关推荐
苹果醋310 小时前
Vue3组合式API应用:状态共享与逻辑复用最佳实践
java·运维·spring boot·mysql·nginx
华无丽言12 小时前
如何简单实现发版不影响客户使用?nginx负载
linux·nginx
令狐少侠201116 小时前
ai之对接电信ds后端服务,通过nginx代理转发https为http,对外请求,保持到达第三方后请求头不变
nginx·ai·https
DuelCode2 天前
Windows VMWare Centos Docker部署Springboot 应用实现文件上传返回文件http链接
java·spring boot·mysql·nginx·docker·centos·mybatis
dyj0952 天前
【Rancher Server + Kubernets】- Nginx-ingress日志持久化至宿主机
运维·nginx·rancher
PanZonghui2 天前
Centos项目部署之Nginx部署项目
linux·nginx
Hellc0072 天前
Nginx 高级 CC 与 DDoS 防御策略指南
运维·nginx·ddos
小皮侠2 天前
nginx的使用
java·运维·服务器·前端·git·nginx·github
梁bk3 天前
[Nginx]反向代理和负载均衡
运维·nginx·负载均衡
绝不偷吃3 天前
FastDFS分布式储存
linux·nginx