Nginx编译与WebUI

非基础Nginx操作

最新Nginx版本安装

如有安装的nginx旧版本,避免拓展冲突,建议完全删除后执行新安装,见文后:附录

安装官方的nginx

curl -fsSL https://nginx.org/keys/nginx_signing.key | sudo gpg --dearmor -o /etc/apt/keyrings/nginx.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/nginx.gpg] http://nginx.org/packages/ubuntu $(lsb_release -cs) nginx" | sudo tee /etc/apt/sources.list.d/nginx.list > /dev/null
sudo apt update

拓展包安装

# 1.安装必要的开发依赖包,无具体的内容,需自己按报错探索安装

# 2.查看原nginx编译输出,记下arguments:后的内容
nginx -V

# 3.下载nginx源码及相关拓展包源码
git clone https://github.com/openresty/headers-more-nginx-module.git
git clone https://github.com/leev/ngx_http_geoip2_module.git
...

# 4.进入nginx源码目录并执行configure
./configure [第2步获取的内容] + [拓展包内容]
以这种方式添加: --add-dynamic-module=../nginx-module-vts --add-dynamic-module=../headers-more-nginx-module --add-dynamic-module=../ngx_http_geoip2_module

# 5.执行modules编译输出
make modules

# 6.将输出的so文件复制到/usr/lib/nginx/modules/下
cp ./objs/*.so /usr/lib/nginx/modules/

# 7.在nginx.conf中通过load引入
load_module modules/ngx_http_geoip_module.so;

# 8.重启

通过接入PPA,获取最新Nginx版本 - 已经放弃维护

# 1. 安装必要工具
sudo apt install -y curl gnupg2 ca-certificates lsb-release ubuntu-keyring

# 2. 导入 Nginx 官方签名密钥
curl -fsSL https://nginx.org/keys/nginx_signing.key | sudo gpg --dearmor | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg > /dev/null

# 3. 添加 Nginx 官方稳定版源
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/ubuntu $(lsb_release -cs) nginx" | sudo tee /etc/apt/sources.list.d/nginx.list

# 4. 设置软件包优先级(可选,但推荐,可防止被系统自带源覆盖)
echo -e "Package: *\nPin: origin nginx.org\nPin-Priority: 900\n" | sudo tee /etc/apt/preferences.d/99nginx

# 5. 更新并安装
sudo apt update
sudo apt upgrade

# 6. 安装额外模块(如需要)
sudo apt install libnginx-mod-http-headers-more-filter \
  libnginx-mod-http-geoip2 \
  libnginx-mod-stream-geoip2

动态模块加载

参考:服务监控 - Nginx-vts-exporter小节

Nginx编译安装 - 费力

apt-get install nginx
apt-cache search libnginx
apt-get install libnginx-mod-http-geoip2 libnginx-mod-http-headers-more-filter libnginx-mod-http-image-filter libnginx-mod-http-xslt-filter libnginx-mod-mail libnginx-mod-stream libnginx-mod-stream-geoip2
mkdir webapps
apt-get update
apt-get upgrade
apt-get install -y build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev curl git
wget http://nginx.org/download/nginx-1.18.0.tar.gz
tar -zxvf nginx-1.18.0.tar.gz 
git clone https://github.com/chobits/ngx_http_proxy_connect_module
git clone https://github.com/leev/ngx_http_geoip2_module.git
apt-get install libmaxminddb0 libmaxminddb-dev
nginx -V
cd nginx-1.18.0/
patch -p1 < ../ngx_http_proxy_connect_module/patch/proxy_connect_rewrite_1018.patch
./configure --with-cc-opt='-g -O2 -ffile-prefix-map=/build/nginx-niToSo/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=../ngx_http_geoip2_module --with-http_addition_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_sub_module --add-dynamic-module=../ngx_http_proxy_connect_module --with-cc-opt="-Wno-deprecated-declarations"
make
cd /usr/sbin/
ll nginx
mv nginx nginx.bak
cp /opt/nginx-1.18.0/objs/nginx ./

NginxWebUI

启动命令

#!/bin/bash
/usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java \
-jar -Dfile.encoding=UTF-8 /opt/nginxWebUI/nginxWebUI.jar \
--server.port=8080 \
--project.home=/opt/nginxWebUI/ \
--spring.database.type=mysql \
--spring.datasource.url=jdbc:mysql://192.168.1.5:3306/nginxwebui \
--spring.datasource.username=root \
--spring.datasource.password=****** \
>/dev/null 2>&1

停止命令

#!/bin/sh
pid=$(ps -ef | grep nginxWebUI.jar | grep -v grep | awk '{print $2}')
if [ ! $pid ]; then
        echo "nginxWebUI.jar is not running"
        exit 0
fi
kill -9 $pid

nginx配置

server {
    server_name www.youcats.cn;
    listen 14700 ssl http2;
    listen [::]:14700 ssl http2;
    ssl_certificate /opt/webapps/ssl-docs/youcats.cn/youcats.cn_bundle.crt;
    ssl_certificate_key /opt/webapps/ssl-docs/youcats.cn/youcats.cn.key;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Host $http_host;
        proxy_set_header X-Forwarded-Port $server_port;
        proxy_set_header X-Forwarded-Proto $scheme;
        add_header Access-Control-Allow-Origin *;
        add_header Access-Control-Allow-Methods *;
        add_header Access-Control-Allow-Headers *;
        add_header Access-Control-Allow-Credentials true;
        if ($request_method = 'OPTIONS') {
            return 204;
        }
    }
}

附录:卸载已有的nginx

⚙️ 准备工作:停止并确认 Nginx 状态

在动手卸载前,最好先停止 Nginx 服务,并记录下当前的版本,方便和之后的新版本做个对比。

  1. 停止 Nginx 服务
    sudo systemctl stop nginx
    
  2. 检查当前版本(可选):使用以下命令记录下当前 Nginx 的版本号。
    nginx -v
    

    这条命令会输出类似 nginx version: nginx/1.18.0 (Ubuntu) 的信息。

🗑️ 第一步:彻底卸载 Nginx

为了让新安装的官方版本不与旧文件冲突,这里需要执行“彻底清理”,包括删除主程序、配置文件和一些可能会影响新安装的依赖包。

  1. 完全清除 Nginx 及其配置文件

    sudo apt purge nginx nginx-common nginx-core
    

    purge 命令会删除 Nginx 程序连同其配置文件(卸载后不会在系统中保留)。

  2. 删除所有 Nginx 相关的残留目录

    cp /etc/nginx /etc/nginx-bak -a
    sudo rm -rf /etc/nginx /var/log/nginx /var/cache/nginx
    

    这一步可以确保所有可能的残留文件都被彻底清除。

  3. 清理不再需要的依赖包

    sudo apt autoremove
    

    autoremove 命令会自动删除那些因为安装 Nginx 而被引入、但现在已经不再被任何软件需要的依赖包。

❌ 第二步:移除并清理旧的 PPA 源

这样能确保新安装的 Nginx 不会被旧的软件源信息干扰。

  1. 通过命令移除旧的 PPA 源
    如果你的 Nginx 是从 PPA 安装的,请将命令中的 ppa:nginx/stable 替换为你本地的实际 PPA 源名称。

    sudo add-apt-repository --remove ppa:nginx/stable
    

    这条命令会从系统的源列表中移除指定的 PPA。

  2. 手动查找并删除残留的源文件
    虽然 add-apt-repository --remove 很常用,但有时一些独立的 .list 文件可能会被遗漏。为了确保万无一失,可以手动检查并删除它们:

    cd /etc/apt/sources.list.d/ && sudo grep -l "nginx" *.list | xargs sudo rm
    

    这条命令组合会在 /etc/apt/sources.list.d/ 目录下,查找所有包含 “nginx” 的 .list 文件,并将其删除。

🌐 第三步:安装官方 Nginx 源

鉴于 Nginx 官方 PPA 已不再为 Ubuntu 22.04 及更高版本提供更新,我们将采用官方的 APT 仓库进行安装。

  1. 添加 Nginx 官方 GPG 密钥

    curl -fsSL https://nginx.org/keys/nginx_signing.key | sudo gpg --dearmor | sudo tee /etc/apt/keyrings/nginx-archive-keyring.gpg > /dev/null
    

    这一步是为了确保后续从官方源下载的软件包是经过签名、安全可信的。

  2. 添加 Nginx 官方软件源

    echo "deb [signed-by=/etc/apt/keyrings/nginx-archive-keyring.gpg] https://nginx.org/packages/ubuntu $(lsb_release -cs) nginx" | sudo tee /etc/apt/sources.list.d/nginx.list
    

    这条命令会创建配置文件 nginx.list,其中 $(lsb_release -cs) 会自动替换为你的系统代号(例如:jammy)。

  3. 设置源优先级(可选但建议)
    这样可以确保系统优先从 Nginx 官方源进行安装和更新,而不是 Ubuntu 自带的、版本较旧的源。

    echo -e "Package: nginx\nPin: release o=nginx\nPin-Priority: 1000" | sudo tee /etc/apt/preferences.d/nginx
    

    Pin-Priority: 1000 的设置,让 Nginx 官方源的优先级高于默认源。

  4. 更新软件包列表

    sudo apt update
    

    在执行安装前,需要更新软件源信息,让系统识别到刚才添加的官方源。

✅ 第四步:安装并验证 Nginx

  1. 安装 Nginx

    sudo apt install nginx
    

    现在安装的就是官方源中提供的最新版本的 Nginx 了。

  2. 尝试验证安装

    • 检查版本:运行 nginx -v,检查输出的版本号,确认已从官方源更新。
    • 查看服务状态:运行 sudo systemctl status nginx,确认服务是 active (running) 状态。

💡 几个小贴士

  • 如果遇到错误:如果安装过程中出现错误,可以尝试运行 sudo apt --fix-broken install 来修复一些潜在的依赖问题。
  • 未来如何升级:以后要升级 Nginx 就方便多了,只需执行 sudo apt update && sudo apt upgrade 即可。
  • 常用文件位置
    • 配置文件:/etc/nginx/
    • 网站根目录:/var/www/
    • 访问日志:/var/log/nginx/access.log
    • 错误日志:/var/log/nginx/error.log