zoukankan      html  css  js  c++  java
  • CentOS 7 编译安装 apache/httpd 和 php7

    CentOS 7.6 编译安装 apache/httpd 和 php7

    基础环境

    • 阿里云-轻量应用服务器 CentOS 7.6

    • 目标 PHP 版本:7.4.13

    • 目标 apache/httpd 版本:2.4.46

    下载源码包

    php 镜像:http://php.p2hp.com

    apache 官网:http://httpd.apache.org/download.cgi,官网下载页会提示可用下载镜像

    cd /data/Downloads/
    
    wget https://mirrors.sohu.com/php/php-7.4.13.tar.gz
    wget https://mirrors.tuna.tsinghua.edu.cn/apache/httpd/httpd-2.4.46.tar.gz
    
    tar -zxvf php-7.4.13.tar.gz
    tar -zxvf httpd-2.4.46.tar.gz
    

    准备安装

    编译安装 php

    cd /data/Downloads/php-7.4.13
    

    查看配置参数

    ./configure --help
    

    编译配置

    • 指定安装目录:
    ./configure --prefix=/usr/local/php74
    
    • 指定配置文件路径 php.ini (安装完毕后查看配置文件信息:php --ini
    --with-config-file-path=/etc/php74
    
    • 指定配置文件目录 */etc
    --sysconfdir=/etc/php74
    
    • 启用 php-fpm,暂时未使用,但是在后续的操作中顺路查询了后续开启的方法,得到的结果是不可编译添加,只能初始编译开启
    --enable-fpm
    
    • (废弃)执行 make,报错:未找到 sqlite3,因基本使用不到 sqlite,故使用 ./configure --help | grep sqlite 查看相关编译参数后,添加参数:
    --without-sqlite3 --without-pdo-sqlite
    
    • 其他
    --with-apxs2=/usr/local/apache24/bin/apxs
    
    • 编译安装,根据报错依次安装:
    yum install libxml2-devel sqlite-devel
    make
    make install
    

    安装后配置

    # 配置可直接执行的 php 命令,这里是 php74
    ln -s /usr/local/php7.4/bin/php /usr/local/bin/php74
    # 配置可直接执行的 php-fpm 命令,这里是 php74-fpm
    ln -s /usr/local/php7.4/sbin/php-fpm /usr/local/bin/php74-fpm
    
    # 暂未使用
    cp /usr/local/php7.4/etc/php-fpm.conf.default /usr/local/php7.4/etc/php-fpm.conf
    # 暂未使用
    cp /usr/local/php7.4/etc/php-fpm.d/www.conf.default /usr/local/php7.4/etc/php-fpm.d/www.conf
    # 复制配置文件,该处可能会有问题
    cp /data/Downloads/php-7.4.13/php.ini-development | php.ini-production /usr/local/php7.4/etc/php.ini
    

    安装 Composer

    composer 不在正常的 php 编译流程之中,只是测试使用时引出了后续的操作

    官网

    # 下载,可使用 wget / curl 等
    php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
    
    # 创建安装目录,composer 安装工具无法自动创建
    mkdir /usr/local/composer
    
    # 安装,指定安装目录,指定安装文件名
    php composer-setup.php --install-dir=/usr/local/composer --filename=composer
    # 创建可执行文件软链接
    ln -s /usr/local/composer/composer.phar /usr/local/bin/composer
    
    # 与第一个操作对应,暂时不明
    php -r "unlink('composer-setup.php');"
    

    报错 Unable to find the wrapper "https" - did you forget to enable it when you configured PHP?,结合百度(参考链接)和 ./configure --help | grep openssl

    解决方法一:可以在配置阶段重新添加以下参数进行配置后,重新配置、编译、安装:

    --with-openssl
    

    解决方法二:编译模块的方法添加(参考链接

    查看之前的编译参数

    cat -n /data/Downloads/php-7.4.13/config.nice

    php74 -i | grep configure

    php74 -r "phpinfo();" | grep configure

    已编译安装的 php 添加模块

    openssl 为例

    切换到解压的源目录下的 /data/php-7.4.13/ext/openssl,执行

    /usr/local/php7.4/bin/phpize
    

    报错 Cannot find config.m4. Make sure that you run '/usr/local/php7.4/bin/phpize' in the top level source directory of the module

    ls 查看,没有 config.m4,但是有 config0.m4,将该文件复制或移动并重命名(参考链接)为 config.m4

    重新执行 phpize

    报错 Cannot find autoconf

    安装

    yum install autoconf
    

    再次执行 phpize

    当前目录下生成 configure 等文件,执行

    ./configure
    

    报错 configure: error: Cannot find php-config. Please use --with-php-config=PATH

    执行

    ./configure --with-php-config=/usr/local/php7.4/bin/php-config
    

    报错

    no package 'openssl' found
    

    执行 openssl version 发现是有 openssl 的,查看 ./configure --help | grep openssl,添加参数后执行

    ./configure --with-php-config=/usr/local/php7.4/bin/php-config --with-openssl
    

    再次报错 no package 'openssl' found,安装 yum install openssl-devel (参考链接) 后执行

    ./configure --with-php-config=/usr/local/php7.4/bin/php-config
    

    编译安装,make,输出

    Libraries have been installed in:
       /data/php-7.4.13/ext/openssl/modules
    

    make install,输出

    Installing shared extensions: /usr/local/php7.4/lib/php/extensions/no-debug-non-zts-20190902/
    

    查看 php 启用的模块

    php74 -m
    php74-fpm -m
    

    此时若修改 php.ini 中开启 openssl 以及 extension_dir 无果,原因可能是配置文件的问题,详情

    php 编译默认配置文件路径是 /usr/local/php7.4/lib,而不是 etc,查看 php 配置文件信息(参考链接

    php74 --ini
    Configuration File (php.ini) Path: /usr/local/php7.4/lib
    Loaded Configuration File:         (none)
    Scan for additional .ini files in: (none)
    Additional .ini files parsed:      (none)
    

    解决方法一:直接使用 lib 作为配置文件目录,搞一份 php.ini 文件过去,以后修改这个

    解决方法一ln -s /usr/local/php7.4/etc/php.ini /usr/local/php7.4/lib/php.ini

    解决方法三:重新编译 php,加上参数(参考链接

    --with-config-file-path=/usr/local/php7.4/etc
    

    编译安装 apache/httpd

    cd /data/Downloads/httpd-2.4.46
    

    查看编译参数

    ./configure --help
    

    编译配置

    指定安装目录、启用 SSL、启用动态模块加载
    ./configure
    --prefix=/usr/local/apache2.4
    --sysconfdir=/etc/httpd
    --enable-ssl
    --enable-so
    --enable-module=shared
    

    根据报错依次安装

    yum install -y apr-devel apr-util-devel pcre-devel openssl-devel
    

    编译安装

    make && make install
    

    安装后配置

    ln -s /usr/local/apache2.4/bin/apachectl /usr/local/bin/apachectl
    ln -s /usr/local/apache2.4/bin/httpd /usr/local/bin/httpd
    

    基本服务管理

    apachectl start/stop/restart/status
    # status 使用有问题,暂未解决
    
    systemctl start 报错 lynx 未找到:yum install lynx
    

    start 报错 AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using {ip}. Set the 'ServerName' directive globally to suppress this message,配置文件中配置域名即可

    /usr/local/apache2.4/conf/httpd.conf
    ServerName domain.com:80
    

    访问网站页面输出:It works!

    • 站点配置文件
    mkdir /etc/httpd/conf.d
    
    /etc/httpd/httpd.conf
    IncludeOptional conf.d/*.conf
    

    配置服务管理

    cp /usr/local/apache2.4/bin/apachectl /etc/init.d/httpd
    
    /etc/init.d/httpd 中
    #!/bin/sh 下添加
    # chkconfig: 35 70 30 # 这三项参数暂时不明原理
    # description:...
    
    chkfonfig --add httpd
    

    此时可用 systemctl 管理 httpd

    httpd 开机启动

    chkconfig --add httpd 后貌似已经可以开机自启

    已编译安装的 apache 添加模块

    该处涉及到 apache 模块的动态加载和静态加载,后续有需要再补充

    目前的处理就是直接修改配置文件 /usr/local/apache2.4/conf/httpd.conf

    查看 apache 加载的模块

    查看编译时编译的模块,静态加载的

    apachectl -l
    

    查看所有模块,所有的

    apachectl -t -D DUMP_MODULES
    

    关联 apache/httpd 和 php

    重新完整编译(成功),或仅添加参数编译(未尝试)

    ./configure --prefix=/usr/local/php7.4 --without-sqlite3 --without-pdo-sqlite 
    -enable-fpm --with-apxs2=/usr/local/apache2.4/bin/apxs/
    

    执行 make 报错

    collect2: error: ld returned 1 exit status
    make: *** [sapi/cli/php] Error 1
    

    执行 make clean 后重新 make && make install参考链接

    编译后,在 /usr/local/apache2.4/modules/ 目录会多出 libphp7.so,同时 /usr/local/apache2.4/conf/httpd.conf 最后会多出 LoadModule php7_module modules/libphp7.so,再加上

    AddType application/x-httpd-php .php
    AddType application/x-httpd-php-source .phps
    

    并修改

    <IfModule dir_module>
        DirectoryIndex index.html index.php
    </IfModule>
    

    编辑 /usr/local/apache2.4/hotdocs/index.php <?php phpinfo(); ?> 进行关联测试

    yum 安装 httpd

    因为涉及 selinux 的相关配置不是很熟悉,又想用 selinux 的安全上下文等来限制 apache,而且在编译安装过程中对部分目录和文件的作用比较熟悉了,最后采用了 yum 安装的方式

    yum install httpd -y
    systemctl start httpd
    systemctl enable httpd
    
    # 禁用默认的测试页面
    # 将 /etc/httpd/conf.d/welcome.html 中的内容全部注释,不要移除该文件,该文件中的注释说了 升级的时候会重建该文件
    
    # 修改网站目录后后重新设置 selinux 安全上下文
    chcon -u system_u -r object_r -t httpd_sys_content_t -Rv /srv/website/
    # 添加配置文件后重新设置 selinux 安全上下文
    chcon -u system_u -r object_r -t httpd_config_t -Rv /etc/httpd/conf.d/*.conf
    
    chown -R 修改所属用户和组
    chmod -R 修改详细权限
    cp -r 递归复制
    

    其他相关问题

    libsystemd

    php 编译安装 --enable-fpm --with-fpm-systemd 报错 no package 'libsystemd' found

    yum install systemd-devel

    主域名访问正确,子域名访问错误

    IncludeOptional 方式时,配置文件路径,采用全路径试试

    子域名访问正确,主域名访问错误

    阿里云 DNS 解析除设置 * 泛解析外,还需要增加主域名解析 @

    ARP 未找到

    yum install arp 找不到包:你确定需要的是 arp 而不是 apr ?

    安装 semanage

    查找提供该功能的软件包(参考链接

    yum provides semanage

    yum install policycoreutils-python

    semanage 相关命令

    • 查看所有的安全上下文
    semanage fcontext -l
    

    getsebool

    setsebool -P

    mysqli 扩展

    如 openssl,但是会出现加载失败的问题,Unable to load dynamic library 'mysqli' undefined symbol: mysqlnd_global_stats,编译添加的时候加上 --with-mysqli=/usr/bin/mysql_config,可以通过 find 命令查找 mysql_config 路径,目前不知道原来有没有,因为在尝试过程中执行了一次 yum install mysql-devel参考链接

    其他非相关临时记录

    微信小程序测试跳过域名和 HTTPS 校验

    在微信开发者工具中,右上角详情设置中,本地设置,勾选:不校验合法域名、web-view(业务域名)、TLS 版本以及 HTTPS 证书,(参考链接 最下方)

    跳过域名校验

    在微信开发者工具中,可以临时开启 开发环境不校验请求域名、TLS版本及HTTPS证书 选项,跳过服务器域名的校验。此时,在微信开发者工具中及手机开启调试模式时,不会进行服务器域名的校验。

    在服务器域名配置成功后,建议开发者关闭此选项进行开发,并在各平台下进行测试,以确认服务器域名配置正确。

    如果手机上出现 “打开调试模式可以发出请求,关闭调试模式无法发出请求” 的现象,请确认是否跳过了域名校验,并确认服务器域名和证书配置是否正确。

    Wordpress 连接阿里云 RDS 失败

    我的问题应该不是数据库和连接的问题,通过查看 apache 站点日志,报错是

    [日期时间] [php7:warn] [pid...] [client...] PHP Warning:  preg_match(): Allocation of JIT m
    emory failed, PCRE JIT will be disabled. This is likely caused by security restrictions. Either grant PHP permission to allocate executa
    ble memory, or set pcre.jit=0 in /../wp-includes/load.php on line 43
    

    设置了 pcre.jit=0,无果,后猜到可能是 selinux 的权限问题,所以直接改了 yum 安装的 httpd 为编译安装,这里后来反应过来应该先把 selinux 关掉试试,反正是成了

    不行,又改回去了,不信试不成

    • 正确原因,查看 selinux 日志

    tail /var/log/audit/audit.log | grep httpd

    type=AVC msg=audit(...): avc:  denied  { name_connect } for  pid=... comm="httpd" dest=3306 scontext=system_u:system_rhttpd_t:s0 tcontext=system_u:object_r:mysqld_port_t:s0 tclass=tcp_socket permissive=0
    

    根据其中一条大概猜是 selinux + httpd + mysql 的问题,因为未使用本地 mysql,检索词:selinux 允许 httpd 连接远程数据库,解决方案(参考链接):

    setsebool -P httpd_can_network_connect=on
    
  • 相关阅读:
    SQL群集多实例卸载、安装
    Java 数组的 12 个方法
    Java 容器
    RDA 升级
    DVB条件接收系统多密技术的设计与实现
    perl数组的长度与元素个数
    TS流解析 四
    Python中操作myslq的方法
    DVB-subtitle解析流程浅
    JAVA回调机制(CallBack)详解
  • 原文地址:https://www.cnblogs.com/zhaojjiang/p/14136353.html
Copyright © 2011-2022 走看看