教你像个大佬一样从源码编译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...

相关推荐
Lw老王要学习7 小时前
25_05_02Linux架构篇、第1章_03安装部署nginx
linux·运维·nginx·架构·云计算·it
Hello.Reader12 小时前
NGINX `ngx_http_auth_request_module` 模块详解基于子请求的认证授权方案
运维·nginx·http
lml485616 小时前
Nginx安全防护与HTTPS部署实战
nginx·安全·https
惊起白鸽45016 小时前
nginx安全防护与HTTPS部署实战
nginx·安全·https
Hello.Reader17 小时前
NGINX `ngx_http_browser_module` 深度解析与实战
运维·nginx·http
伤不起bb17 小时前
Nginx 安全防护与Https 部署实战
nginx·安全·https
GISer_Jing19 小时前
阿里云前端Nginx部署完,用ip地址访问却总访问不到,为什么?检查安全组是否设置u为Http(80)!
前端·nginx·阿里云
遇见火星1 天前
基于Docker的内网穿透实战:frp 0.68 + Nginx最佳实践
nginx·docker·容器·frp·内网穿透
Hello.Reader2 天前
NGINX 的 ngx_http_auth_jwt_module模块
运维·nginx·http
程序猿不脱发22 天前
什么是负载均衡?NGINX是如何实现负载均衡的?
运维·nginx·负载均衡