为不同的目标硬件编译 Apache mod_ssl(硬件功能不支持 SSE2 错误)

为不同的目标硬件编译 Apache mod_ssl(硬件功能不支持 SSE2 错误)

我正在一台机器(“构建”机器)上构建和打包以下内容,并尝试在其他机器(“目标”机器)上安装和使用,其中一些机器具有不同的处理器。

  • OpenSSL 0.9.8l
  • Apache 2.2.14
  • Tomcat 连接器 1.2.28

据我所知,问题在于构建机器的 CPU 能力比目标机器强,导致二进制文件无法在目标机器上执行。我尝试使用配置和编译器标志来禁用有问题的指令,但没有成功。

最终我收到此错误:

$ ./apachectl start 
httpd: /usr/local/apache-2.2.14/conf/httpd.conf 第 58 行语法错误:
无法将 /usr/local/apache2/modules/mod_ssl.so 加载到服务器:ld.so.1:httpd:
致命:/usr/local/openssl/lib/libssl.so.0.9.8:硬件功能不受支持:
0x1000 [ SSE2 ]

以下是我的完整构建过程。可以查看每个命令的完整输出这里。由于我的 SF 声誉不足,我无法直接链接到他们每个人。

建造机器

$ echo $PATH
/usr/bin:/usr/ccs/bin:/usr/sfw/bin:/opt/sfw/bin:/usr/sbin

$ isainfo -v
32-bit i386 applications
        pause sse2 sse fxsr mmx cmov sep cx8 tsc fpu 

$ uname -a
SunOS bsiausstgdb02 5.10 Generic_120012-14 i86pc i386 i86pc

目标机器

$ isainfo -v
32-bit i386 applications
        sse fxsr mmx cmov sep cx8 tsc fpu 

$ uname -a
SunOS bsiausdevweb01 5.10 Generic_120012-14 i86pc i386 i86pc

编译 OpenSSL 0.9.8l

$ CC=/usr/bin/cc
$ export CC

$ CFLAGS="-xarch=sse"
$ export CFLAGS

$ ./Configure \
solaris-x86-cc \
shared \
no-asm \
no-sse2 \
-xarch=sse \
--openssldir=/usr/local/openssl-0.9.8l

查看完整输出: openssl-配置.txt

$ make && make test

查看完整输出: openssl-制作和测试.txt

$ sudo make install

查看完整输出: openssl-make-install.txt

编译Apache 2.2.14

$ CC=/usr/bin/cc
$ export CC

$ CFLAGS="-xarch=sse"
$ export CFLAGS

$ ./configure \
--prefix=/usr/local/apache-2.2.14 \
--with-mpm=prefork \
--enable-so \
--enable-unique-id=shared \
--enable-rewrite=shared \
--enable-spelling=shared \
--enable-info=shared \
--enable-headers=shared \
--enable-deflate=shared \
--enable-expires=shared \
--enable-unique-id=shared \
--enable-speling=shared \
--enable-ssl=shared \
--with-ssl=/usr/local/openssl

查看完整输出: apache-配置.txt

$ make

查看完整输出: apache-make.txt

$ sudo make install

查看完整输出: apache-make-install.txt

编译 Tomcat Connectors 1.2.28

$ CC=/usr/bin/cc
$ export CC

$ CFLAGS="-xarch=sse"
$ export CFLAGS

$ cd native
$ ./configure \
--with-apxs=/usr/local/apache2/bin/apxs

查看完整输出: tomcat-连接器配置.txt

$ make

查看完整输出: tomcat-连接器-make.txt

$ sudo make install

查看完整输出: tomcat-连接器-make-install.txt

测试

此时,构建机器上的一切都将正常工作。一旦我打包这些文件并将它们安装在目标机器上,在启用 mod_ssl 的情况下启动 Apache 时就会出现此错误。

$ ./apachectl start
httpd: /usr/local/apache-2.2.14/conf/httpd.conf 第 58 行语法错误:
无法将 /usr/local/apache2/modules/mod_ssl.so 加载到服务器:ld.so.1:httpd:
致命:/usr/local/openssl/lib/libssl.so.0.9.8:硬件功能不受支持:
0x1000 [ SSE2 ]

答案1

以下是我在 Solaris 10 上成功构建和安装 Apache httpd-2.4.10 和 OpenSSL openssl-1.0.1j 的步骤。

  1. 下载以下软件
    openssl-1.0.1j.tar.gz
    httpd-2.4.10.tar.gz
    apr-1.5.1.tar.gz
    apr-util-1.5.4.tar.gz
    pcre-8.36.tar.gz

  2. 验证 Make 和 CC
    默认情况gcc下为/usr/sfw/bin/gccmake/usr/ccs/bin/make

    在 PATH 中包含以下内容
    usr/local/ssl/bin:/usr/sfw/bin:/usr/local/bin:/usr/ccs/bin

    在 LD_LIBRARY_PATH 中包含以下内容
    /usr/local/lib:/usr/local/ssl/lib

  3. 构建并安装 openssl-1.0.1j
    解压并解压 openssl-1.0.1j.tar.gz 并按/usr/local/openssl-1.0.1j
    顺序执行以下命令。shared 参数非常重要,这样它才能与 httpd-2.4.10 构建链接以启用 SSL。

    $ cd /usr/local/openssl-1.0.1j
    $ ./config shared
    $ make
    $ make test
    $ make install
    

    默认情况下,它将 openssl 安装在 /usr/local/ssl

  4. 安装 pcre-8.36 将 pcre-8.36.tar.gz 解压到 /usr/local/pcre-8.36

    按顺序执行以下命令

    $ cd /usr/local/ pcre-8.36
    $ ./configure 
    $ make
    $ make install
    

    默认情况下,make install安装包的命令在 下 /usr/local/bin,包含文件在 下/usr/local/include,等等。

  5. 构建并安装httpd-2.4.10

    解压并解压 httpd-2.4.10.tar.gz 到/usr/local/httpd-2.4.10

    解压并解压 apr-1.5.1.tar.gz 并将/usr/local/httpd-2.4.10/srclib
    /usr/local/apr-1.5.1 重命名为/usr/local/apr

    解压并解压 apr-util-1.5.4.tar.gz 并将/usr/local/httpd-2.4.10/srclib
    /usr/local/apr-util 重命名为/usr/local/apr-util

    按顺序执行以下命令

    $ ./configure --prefix=/usr/local/apache2 --with-included-apr --enable-so –enable-ssl=shared --with-ssl=/usr/local/ssl
    $ make
    $ make install
    

    它安装在/usr/local/apache2

安装已完成。要启用 SSL 和代理,请取消/usr/local/apache2/conf/httpd.conf注释以下行

LoadModule socache_shmcb_module modules/mod_socache_shmcb.so

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
LoadModule proxy_scgi_module modules/mod_proxy_scgi.so
LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_express_module modules/mod_proxy_express.so

LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
LoadModule ssl_module modules/mod_ssl.so

Include conf/extra/httpd-ssl.conf

现在您可以像平常一样处理 httpd-ssl.conf 来完成配置。

答案2

我通过在具有与目标机器相当的硬件的机器上构建软件包并使用 Sun Studio CC 编译器而不是 gcc 来解决此问题。

相关内容