Ubuntu通过apt install nginx安装好nginx后,如何添加模块?

Spring Wu 35 2022-10-26

背景

通过apt install nginx 安装好nginx后,需要添加ngx_http_lower_upper_case模块,因为通过apt安装没有源码包,需要添加nginx模块。添加模块则需要通过在源码包执行./configure xxxx --add-module=ngx_http_lower_upper_case命令来安装模块。

Nginx源码包下载

进入Nginx官网,选择对应的源码包,进行下载
image-1666748895781
复制链接地址后,到服务器上执行

curl -O https://nginx.org/download/nginx-1.18.0.tar.gz

解压压缩包

tar -xvzf nginx-1.18.0.tar.gz

进入解压好的文件夹

cd nginx-1.18.0

下载Nginx lower模块

git clone https://github.com/replay/ngx_http_lower_upper_case.git

执行./configure命令

查看nginx初始的安装参数,注意-V是大写的V

ubuntu@ip-10-0-128-94:~/nginx-1.18.0$ nginx -V
nginx version: nginx/1.18.0 (Ubuntu)
built with OpenSSL 3.0.2 15 Mar 2022
TLS SNI support enabled
configure arguments:
--with-cc-opt='-g -O2 -ffile-prefix-map=/build/nginx-qDpDX0/nginx-1.18.0=. -flto=auto -ffat-lto-objects -flto=auto -ffat-lto-objects -fstack-protector-strong -Wformat -Werror=format-security -fPIC -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -flto=auto -ffat-lto-objects -flto=auto -Wl,-z,relro -Wl,-z,now -fPIC' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-compat --with-debug --with-pcre-jit --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-threads --add-dynamic-module=/build/nginx-qDpDX0/nginx-1.18.0/debian/modules/http-geoip2 --with-http_addition_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_sub_module

复制configure arguments参数,后面添加 --add-module=~/ngx_http_lower_upper_case,具体模块根据需要添加的模块在服务器上的路径决定。
这是我的完整命令

./configure --with-cc-opt='-g -O2 -ffile-prefix-map=/build/nginx-qDpDX0/nginx-1.18.0=. -flto=auto -ffat-lto-objects -flto=auto -ffat-lto-objects -fstack-protector-strong -Wformat -Werror=format-security -fPIC -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -flto=auto -ffat-lto-objects -flto=auto -Wl,-z,relro -Wl,-z,now -fPIC' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-compat --with-debug --with-pcre-jit --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-threads --add-dynamic-module=/build/nginx-qDpDX0/nginx-1.18.0/debian/modules/http-geoip2 --with-http_addition_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_sub_module --add-module=/home/ubuntu/ngx_http_lower_upper_case

到刚刚解压后的nginx目录执行上面的命令。

解决报错

如果遇到缺少依赖的报错,根据报错提示选择执行以下命令

sudo apt-get install libpcre3 libpcre3-dev
sudo apt-get install gcc
sudo apt-get install libpcre3 libpcre3-dev
sudo apt-get install zlib1g zlib1g-dev
# Ubuntu14.04的仓库中没有发现openssl-dev,由下面openssl和libssl-dev替代
#apt-get install openssl openssl-dev
sudo apt-get install openssl 
sudo apt-get install libssl-dev
————————————————
版权声明:本文为CSDN博主「程序媛小雪」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_23832313/article/details/83578836

解决好报错后在nginx源码目录重新执行 ./configure xxxxx --add-module=xxx

编译并替换

执行./configure成功,执行make,千万不要执行make install
执行过程中可能遇到

cc1: all warnings being treated as errors make[1]: *** [objs/Makefile:924: objs/src/event/ngx_event_openssl.o] Error 1

这个错误,这时需要进入到nginx的源码目录的objs。

vim Makefile
将
CFLAGS =  -pipe  -O -W -Wall -Wpointer-arith -Wno-unused -Werror -g
后的 -Werror -g 去掉 变成
CFLAGS =  -pipe  -O -W -Wall -Wpointer-arith -Wno-unused
————————————————
版权声明:本文为CSDN博主「humanyr」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/humanyr/article/details/107405310

执行完上述操作,重新make
替换nginx

sudo cp /usr/sbin/nginx /usr/sbin/nginx.bak
sudo cp ./objs/nginx /usr/sbin/

执行时遇到

sudo cp ./objs/nginx /usr/sbin/
cp: cannot create regular file '/usr/sbin/nginx': Text file busy

原因是nginx此时还在运行,无法替换该文件,通过nginx -s stop停止nginx即可,停止后,重新执行cp。
最后替换完成,启动nginx即可

service start nginx