目录

简介

编译安装类似需求定制化的版本,用 yum 安装有些功能可能用不到大量冗余,另外就是没有现成的软件包像 PHP7 或版本过低。编译应用程序需要头文件和编译工具,安装软件组中 Development Tools 就可以了,避免一项一项安装。
在源码包中都会有 INSTALL, README 安装说明,可以看看注意事项。

先介绍这几个文件的意思,首先 configure 用于定制功能,比如安装位置,定制完成后将位置这些参数用 makefile.in 这个模板来生成 nmakefile 文件,make 项目管理工具会调用相关编译器,包括文件编译先后顺序,怎么编译需要什么功能最终是参照 makefile。

  • configure(由 autoconf)
  • makefile.in(由 automake 生成,在源码包中自带)
  • make
  • makefile(由 make 项目管理工具产出)

编译步骤

这里我用 PHP-7.3.7 举例编译配置 typecho。

1、./configure 配置要安装的选项和检查依赖

检查依赖工具,你编译需要什么这里会检测到。

几个选项:

  • --help #查看帮助信息,所有功能选项都在里面。
  • 系统类型
    • --prefix=PATH #默认安装路径
    • --sysconfdir=PATH #配置文件
  • 启用或禁止特性
    • --disable #启动
    • --enable #禁止
  • 启用扩展包
    • --with #启动
    • --without #关闭

编译 PHP7.3.7 注意把 pdo 加上,一会用它连接数据库。这里选项我参照 typecho 下载页面所需什么库来安装,其中 iconv 默认启用为了方便我还是把 mbstring 安上。

[root@localhost php-7.3.7]# ./configure --prefix=/usr/local/php --with-config-file-path=/etc --enable-fpm --with-fpm-systemd --enable-mysqlnd --with-mysqli --with-pdo-mysql 

哎呀报错了,其实和前面编译 Nginx 一样,缺少编译安装时需要的头文件,安上 systemd-devel libxml2-devel 就能解决,诺给你准备好了 yum -y install systemd-devel libxml2-devel

configure: error: Your system does not support systemd.
configure: error: libxml2 not found. Please check your libxml2 installation.

2、make 编译

CPU 多核心可以加上 -j num 多线程编译加快速度。

make -j N

3、make install 安装应用

这里我插一嘴,别一股脑 ./configure make && make install 不然编译出错程序还是用不了,一般错误是没有相关 devel 包或者版本过低,具体看提示信息。

当一个服务出现问题时,仔细查看屏幕上报错信息和日志比干着急有用。

编译后对程序做配置

安装完成后对一些文件做配置,类似 Windows 做快捷方式和注册表。

二进制程序链接

给二进制程序做好链接方便使用,避免每次加上 path 访问。

同样为了方便删除链接目录,也可链接所有文件。

ln -s install_dir/sbin /usr/include/app_name

设置环境变量,向 /etc/profile 文件,添加内容:

PATH=$PATH:/usr/local/xxx/sbin 

php-fpm 设置坏境变量。

echo PATH=$PATH:/usr/local/php/sbin > /etc/profile.d/php-fpm.sh
source /etc/profile.d/php-fpm.sh

重新加载刚刚配置的环境变量。

source /etc/profile/etc/profile
source /etc/profile.d/php-fpm.sh

在 /etc/profile.d/ 写一个 app_name.sh 添加内容:

PATH=$PATH:/usr/local/xxx/sbin

库文件

整个目录连接过去方便以后删除,也可链接所有文件。

ln -s install_dir/lib /usr/lib/app_name

在 /etc/ld.so.conf.d/ 建立一个 app_name.conf 配置中文件把 library 路径填写进去。

ldconfig -v 查看是否加载

头文件

为了方便删除链接目录,也可链接所有文件。

ln -s install_dir/include /usr/include/app_name 

帮助手册

CentOS6 添加路径信息。

/etc/man.conf

CentOS7 添加路径信息。

/etc/man_db.conf

配置 PHP

从源码目录复制 php.ini-production 到编译时指定目录 /etc 下更名为 php.ini

[root@localhost php-7.3.7]# cp php.ini-production /etc/php.ini

查看 PHP 有没有加载刚刚安装的扩展。

php -m | grep -Ei 'openssl|curl|mysqli|pdo_mysql'

为了安全,配置 php.ini 关闭版本信息。

expose_php = Off 

将 fpm 配置文件正确命名

cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf
[root@localhost php-7.3.7]# cd /usr/local/php/etc
[root@localhost etc]# cp php-fpm.conf.default php-fpm.conf
[root@localhost etc]# cp php-fpm.d/www.conf.default php-fpm.d/ww.conf
[root@localhost etc]# ls
pear.conf  php-fpm.conf  php-fpm.conf.default  php-fpm.d

设置 Nginx、PHP-FPM 开机自启并启动服务。

[root@localhost bin]# systemctl enable nginx
[root@localhost bin]# systemctl start nginx
[root@localhost bin]# cp /usr/local/src/php-7.3.7/sapi/fpm/php-fpm.service /etc/systemd/system
[root@localhost fpm]# systemctl enable php-fpm
Created symlink from /etc/systemd/system/multi-user.target.wants/php-fpm.service to /usr/lib/systemd/system/php-fpm.service.
[root@localhost fpm]# systemctl start php-fpm

配置 Nginx 解析 PHP 文件

编辑 nginx_conf 配置 FastCGI,只要匹配到 php 文件就把它交给 php-fpm 去解析。

其实你不应该复制粘贴一把嗦,至少要弄懂每个字段代表的意思,不然出错只能干瞪眼。

    location / {
    root   /usr/share/nginx/html;
    index index.php index.html index.htm;
}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    location ~ \.php$ {
    root           html;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include        fastcgi_params;
}

这里有个坑是 fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; 中的 scripts 需要改为 $document_root,这个变量代表这站点根目录(root),当然你也可以填绝对路径。

让 Nginx 重新读取并应用配置文件 nginx -s reload,访问 phpinfo 查看是否解析。

Nginx + PHP 搭建成功.png

配置 MariaDB

编译安装时搞不定它配置文件,下载官方编译好的安装包,又会出现各种找不到错误信息。

/usr/local/mysql/bin/mysqld: /lib64/libstdc++.so.6: version `CXXABI_1.3.8' not found 
/usr/local/mysql/bin/mysqld: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found
/usr/local/mysql/bin/mysqld: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found

无奈启用第二个没有灵魂的方案,配置官方软件源,安装成功后,设置开机自启。

systemctl enable mariadb
systemctl start mariadb

根据引导程序安全配置数据库,每一步骤提示都很详尽就不截图了。

mysql_secure_installation

目前 WebServer 和 Database 都放在一台服务器上,为了减小攻击面 3306 端口应该只让本机访问,真实场景很可能是 WebServer 和 Database 分别各在服务器上(站库分离),那数据库可以做权限设置只允许某台机器连接 3306 端口。

由于不需要应用服务器连接我们,所以只绑定在本地环回端口,编辑 /etc/my.cnf[client-server] 组下添加 bind-address = 127.0.0.1,相反填 0.0.0.0 端口就会绑定到所有网卡上。

重启服务,修改成功。

[root@localhost ~]# netstat -pantu | grep 3306
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      2711/mysqld 

更甚可以限制数据库用户权限,比如只允许来自 localhost 主机连接的 gbb 账户查 test 数据库下所有表。

GRANT SELECT ON test.* to 'gbb'@'localhost';

当你更新、删除、插入数据就会报错。

MariaDB [test]> insert into testdatatable values('lisi', 88);
MariaDB [test]> delete from testdatatable where name='zhangdsan';
MariaDB [test]> update testdatatable set age=22 where name='zhangdsan';

gbb用户无权新增删除数据.png

最后输入密码导入数据库。

mysql < raingray.sql -uroot -p

Tips:

PHP 查询数据如果用的是 mysqli_connect 连接数据库,数据库 HOST 填 localhost 无法查询数据,换成为什么127.0.0.1就行,不明觉厉?在 Linux 中的 /etc/hosts 配置有解析文件,localhost 应该解析成 127.0.0.1 才对——对进程之间通信完全不了解,这样理解完全错误。
经过查询发现,PHP 官方对 mysqli_connect 函数 HOST 参数的解释是传入 localhost 就使用通道连接数据库而不是 TCP/IP,采用通道连接这个是 Windows 专属。官方另一篇文章给出了示例为什么出现这个问题以及解决方案。

最终我怎么解决?用 IP 是一种解决方法,或者在 php.inimysqli.default_socket 选项填上 mysql socket 文件绝对路径,这样就能以 socket 方式连接 MySQL ,修改后让 php-fpm 重新读取配置文件,决用那种你们自己取舍。
你心里可能犯嘀咕这个我怎么知道 socket 路径?这个请你学会用 Google 去查询(相比在群里请教个人还是倾向于自己查资料),不过我还是贴上一个查询方法。

[root@localhost ~]# mysqld --verbose --help | grep ^socket

参考链接

最近更新:

发布时间:

摆哈儿龙门阵