Linux - 软件包管理之编译安装
目录
简介
编译安装类似需求定制化的版本,用 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
查看是否解析。
配置 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';
最后输入密码导入数据库。
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.ini
把mysqli.default_socket
选项填上mysql socket
文件绝对路径,这样就能以 socket 方式连接 MySQL ,修改后让 php-fpm 重新读取配置文件,决用那种你们自己取舍。
你心里可能犯嘀咕这个我怎么知道 socket 路径?这个请你学会用 Google 去查询(相比在群里请教个人还是倾向于自己查资料),不过我还是贴上一个查询方法。[root@localhost ~]# mysqld --verbose --help | grep ^socket
手动创建系统服务
每次开机后都要手动运行 sslocal -c ~/ss/ssserver.json
,太麻烦了,跟配置 server 一样把它也加入服务中去吧。
在 /etc/systemd/system/
创建文件 shadowsocks.service
添加如下内容
[Unit]
Description=Shadowsocks Client Service
After=network.target
[Service]
Type=simple
User=root
Restart=always
RestartSec=3
ExecStart=/usr/local/bin/sslocal -c /root/ss/ssserver.json
[Install]
WantedBy=multi-user.target
Description 是服务的介绍。
Restart=always,崩溃后自动重启服务。
RestartSec=3,崩溃后等待 3 秒在进行重启。
ExecStart 这行是服务启动时要执行的命令,命令要写绝对路径(可以用 type -a command 查看),命令后面是跟着你 ss 配置文件路径。
t
添加开机自启后,重启机器查看是否开启服务。
sudo systemctl daemon-reload #重新加载 systemd 配置文件以加载刚创建的服务配置,systemctl 没法操作服务配置的时候可以重新加载试试
systemctl enable shadowsocks #设置开机自启命令
systemctl start shadowsocks #启动命令
systemctl status shadowsocks #查看状态命令
参考链接
最近更新:
发布时间: