nginx嵌入式移植

文章详细介绍了如何在Linux环境下,使用arm-linux-gnueabihf-gcc交叉编译工具链来编译PCRE库和Nginx。首先下载并解压PCRE源码,然后配置并安装。接着,对Nginx进行交叉编译,应用了多个补丁以适应ARM架构,并指定了编译选项。最后,将编译后的Nginx打包并准备部署到ARM设备上。

1, 交叉编译PCRE库Nginx对PCRE库有依赖,PCRE(Perl Compatible Regular Expressions)是一个Perl库,包括Perl 兼容的正则表达式库。这些在执行正规表达式模式匹配时用与Perl 5同样的语法和语义是很有用的。

 下载: pcre-8.30.tar.bz2  (参考放置路劲:/home/workspace/web)

wget https://jaist.dl.sourceforge.net/project/pcre/pcre/8.30/pcre-8.30.tar.bz2

         tar  -jxvf  pcre-8.30.tar.bz2

         chmod  -Rf  777 pcre-8.30

         cd pcre-8.30

        ./configure CC=arm-linux-gnueabihf-gcc LD=arm-linux-gnueabihf-ld --host=arm-linux-gnueabihf --prefix=/home/root/satellite/WEB/nginx

         make

         make install

2. 交叉编译Nginx,Nginx不多做解释,假设"你懂的"。

进入官网:nginx: download

补丁a:nginx-1.0.15\auto\cc\conf

case $NGX_CC_NAME in

     51         arm-linux-gnueabihf-gcc)

     52             # gcc 2.7.2.3, 2.8.1, 2.95.4, egcs-1.1.2

     53             #     3.0.4, 3.1.1, 3.2.3, 3.3.2, 3.3.3, 3.3.4, 3.4.0, 3.4.2

     54             #     4.0.0, 4.0.1, 4.1.0

     55

     56             . auto/cc/gcc

     57         ;;

补丁b-1:nginx-1.0.15\auto\types\sizeof

           ----------------------------------------
          checking for $ngx_type size
          END
         ## Modify By XinTinG
         ngx_size=4

 补丁b-2:nginx-1.0.15\auto\types\sizeof

##ngx_test="$CC $CC_TEST_FLAGS $CC_AUX_FLAGS \

##          -o $NGX_AUTOTEST $NGX_AUTOTEST.c $NGX_LD_OPT $ngx_feature_libs"

##eval "$ngx_test >> $NGX_AUTOCONF_ERR 2>&1"

##if [ -x $NGX_AUTOTEST ]; then

##    ngx_size=`$NGX_AUTOTEST`

##    echo " $ngx_size bytes"

##fi

补丁c:nginx-1.0.15\auto\feature

        yes)

            # /bin/sh is used to intercept "Killed" or "Abort trap" messages

##            if /bin/sh -c $NGX_AUTOTEST >> $NGX_AUTOCONF_ERR 2>&1; then

                echo " found"

                ngx_found=yes

                if test -n "$ngx_feature_name"; then

                    have=$ngx_have_feature . auto/have

                fi

##            else

##                echo " found but is not working"

##            fi

        ;;

补丁d:nginx-1.0.15\configure

if test -z "$NGX_PLATFORM"; then

    echo "checking for OS"

##    NGX_SYSTEM=`uname -s 2>/dev/null`

##    NGX_RELEASE=`uname -r 2>/dev/null`

##    NGX_MACHINE=`uname -m 2>/dev/null`

补丁e:nginx-1.0.15\src\os\unix\ngx_time.h

#include <time.h>  #HCF

 #include <ngx_config.h>
 #include <ngx_core.h>

补丁f:nginx-1.0.15\src\os\unix\ngx_errno.h

#define NGX_EILSEQ        EILSEQ
  #define NGX_ENOMOREFILES  0
   #define NGX_SYS_NERR      1       // Modify By HCF

补丁gnginx-1.0.15/auto/cc/name

补丁hnginx-1.0.15\objs\Makefile

操作:

export CC=arm-linux-gnueabihf-gcc

export LD=arm-linux-gnueabihf-ld

export AR=arm-linux-gnueabihf-ar

export NGX_SYSTEM=linux

export NGX_RELEASE=3.2-XT5

export NGX_MACHINE=arm

./configure --with-http_stub_status_module --prefix=/home/root/satellite/WEB/nginx --with-pcre=/home/workspace/web/pcre-8.30 --with-cc-opt="-O2 -Wall -Wpointer-arith -I/home/root/satellite/WEB/nginx/include" --with-ld-opt="-L/home/root/satellite/WEB/nginx/lib"  --without-http_gzip_module

make CPU=arm

make install

cd /home/root/satellite/WEB/

tar -zcvf nginx.tar.gz nginx

nginx.tar.bz2  解压到arm板linux shell控制台中home/root/satellite/WEB文件夹;

/home/root/satellite/WEB/nginx/conf/nginx.conf

user  root;

http {  

   #access_log  logs/access.log  main;                                       

    access_log off;

error_log /dev/null;

}      

Nginx 服务从 x86 环境移植到 **ARM 架构的 Ubuntu(如树莓派、嵌入式设备等)** 是一个常见的需求。你可能已经有一个现成的 Nginx 安装包或配置,现在希望在 ARM 上运行它。 下面我将详细说明如何完成 **Nginx 的跨平台移植与服务化部署**,包括: - 编译 or 直接安装? - 如何迁移原有配置? - 如何创建 systemd 服务? - 常见问题和解决方案 --- ## ✅ 一、确认目标环境信息(ARM Ubuntu) 首先确认你的 ARM 设备信息: ```bash uname -m # 输出应为:aarch64(ARM64) 或 armv7l(ARM32) ``` ```bash lsb_release -a # 确认是 Ubuntu 版本(如 20.04, 22.04 等) ``` > ⚠️ 注意:ARM 和 x86 的二进制不兼容!不能直接拷贝 x86 的 `nginx` 可执行文件到 ARM 上运行。 --- ## ✅ 二、方法选择:编译 vs 包管理安装 | 方法 | 是否推荐 | 说明 | |------|----------|------| | ✅ 使用 `apt` 安装标准版 | ✔️ 推荐(新手) | 快速、稳定、自动集成 systemd | | ✅ 自定义编译(带参数/路径) | ✔️ 推荐(高级用户) | 移植特定功能、路径一致 | | ❌ 直接复制 x86 的 nginx 二进制 | ✘ 不可行 | 架构不同,无法运行 | --- ## ✅ 方法一:使用 APT 安装(最简单) 适用于通用场景。 ```bash # 更新软件源 sudo apt update # 安装 nginx sudo apt install nginx -y # 启动并设置开机自启 sudo systemctl enable nginx sudo systemctl start nginx # 检查状态 systemctl status nginx ``` > 默认安装路径: > - 可执行文件:`/usr/sbin/nginx` > - 配置目录:`/etc/nginx/` > - 网站根目录:`/var/www/html` > - 日志:`/var/log/nginx/` > - systemd 单元:`/lib/systemd/system/nginx.service` 📌 **优点**:自带服务管理、日志轮转、安全更新 📌 **缺点**:路径固定,不易“完全移植”旧结构 --- ## ✅ 方法二:交叉编译 or 本地编译(完整移植) 如果你想把原来某个定制化的 Nginx(比如带 RTMP 模块、特定路径 `/opt/at606-nginx`)完整迁移到 ARM 上,请按以下步骤操作。 ### 步骤 1:安装依赖 ```bash sudo apt update sudo apt install build-essential \ libpcre3-dev \ zlib1g-dev \ libssl-dev \ wget \ curl \ git -y ``` ### 步骤 2:下载 Nginx 源码(建议 1.24.x 或 1.26.x) ```bash cd /tmp wget https://nginx.org/download/nginx-1.26.0.tar.gz tar -zxvf nginx-1.26.0.tar.gz cd nginx-1.26.0 ``` ### 步骤 3:配置编译选项(关键!模拟原环境) 假设你要移植到 `/opt/at606-nginx`: ```bash ./configure \ --prefix=/opt/at606-nginx \ --sbin-path=/opt/at606-nginx/sbin/nginx \ --conf-path=/opt/at606-nginx/conf/nginx.conf \ --error-log-path=/opt/at606-nginx/logs/error.log \ --http-log-path=/opt/at606-nginx/logs/access.log \ --pid-path=/opt/at606-nginx/logs/nginx.pid \ --lock-path=/opt/at606-nginx/logs/nginx.lock \ --with-http_ssl_module \ --with-http_v2_module \ --with-http_realip_module \ --with-http_stub_status_module \ --without-http_ssi_module \ --without-http_scgi_module \ --without-http_uwsgi_module ``` 📌 提示:你可以通过在原机器上运行 `nginx -V` 查看原始编译参数。 ### 步骤 4:编译并安装 ```bash make -j$(nproc) sudo make install ``` 完成后目录结构如下: ``` /opt/at606-nginx/ ├── conf/ │ └── nginx.conf ├── sbin/ │ └── nginx ├── logs/ └── html/ ``` --- ## ✅ 步骤 4:迁移原有配置文件 如果你有原来的 `nginx.conf`,可以复制过来: ```bash sudo cp /path/to/your/old/nginx.conf /opt/at606-nginx/conf/nginx.conf ``` 测试配置是否正确: ```bash sudo /opt/at606-nginx/sbin/nginx -p /opt/at606-nginx -t ``` > 💡 `-p` 指定前缀路径,否则会报错找不到 conf 目录 --- ## ✅ 步骤 5:创建 systemd 服务(重要!实现开机启动) 创建服务文件: ```bash sudo nano /lib/systemd/system/at606-nginx.service ``` 内容如下(已优化): ```ini [Unit] Description=AT606 Nginx HTTP Server After=network.target Wants=network.target [Service] Type=forking PIDFile=/opt/at606-nginx/logs/nginx.pid ExecStart=/opt/at606-nginx/sbin/nginx -p /opt/at606-nginx -c conf/nginx.conf ExecReload=/opt/at606-nginx/sbin/nginx -p /opt/at606-nginx -s reload ExecStop=/opt/at606-nginx/sbin/nginx -p /opt/at606-nginx -s quit TimeoutStopSec=10 Restart=on-failure User=www-data Group=www-data # 安全增强(可选) NoNewPrivileges=true PrivateTmp=true ProtectSystem=strict ProtectHome=true ReadWritePaths=/opt/at606-nginx/html /opt/at606-nginx/logs [Install] WantedBy=multi-user.target ``` ### 启用服务: ```bash # 重载 systemd sudo systemctl daemon-reload # 设置开机自启 sudo systemctl enable at606-nginx.service # 启动服务 sudo systemctl start at606-nginx.service # 查看状态 sudo systemctl status at606-nginx.service ``` --- ## ✅ 步骤 6:权限与用户设置 确保 `www-data` 用户对目录有访问权限: ```bash sudo chown -R www-data:www-data /opt/at606-nginx sudo chmod -R 755 /opt/at606-nginx ``` 如果需要写入日志或上传文件: ```bash sudo chmod -R 775 /opt/at606-nginx/logs ``` --- ## ✅ 测试访问 ```bash curl http://localhost ``` 或者浏览器访问设备 IP 地址。 查看错误日志: ```bash journalctl -u at606-nginx.service -f # 或 tail -f /opt/at606-nginx/logs/error.log ``` --- ## ✅ 常见问题及解决 | 问题 | 原因 | 解决方案 | |------|------|-----------| | `nginx: [emerg] open() "/opt/at606-nginx/logs/nginx.pid" failed` | 权限不足或目录不存在 | 创建 logs 目录并授权 | | `Job for at606-nginx.service failed` | 配置错误或端口被占用 | 运行 `nginx -t` 测试配置 | | `Address already in use` | 端口 80/443 被占用 | `sudo netstat -tulnp \| grep :80` 找冲突进程 | | `Permission denied` | SELinux/AppArmor 限制(少见) | 暂时关闭测试,或添加策略 | | `Command not found` | PATH 未包含 `/opt/at606-nginx/sbin` | 添加软链接:<br>`sudo ln -s /opt/at606-nginx/sbin/nginx /usr/local/bin/nginx` | --- ## ✅ 总结:完整流程图 ``` [准备 ARM Ubuntu] ↓ [安装编译工具链] ↓ [下载 Nginx 源码] ↓ [配置 ./configure 参数] ↓ [make && make install] ↓ [迁移 nginx.conf 配置] ↓ [创建 systemd 服务] ↓ [启动 + enable + 测试] ↓ ✅ 成功运行于 ARM! ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值