我又回来了,感觉自己还是太懒了,好久没写博客了,这次要把前阵子参考网上编译安装 lnmp 的教程然后结合自己在此过程中遇到的问题进行下总结,记录。
我以前一直是直接 yum 安装的,系统是 centos7,所以想尝试下编译安装,了解下具体的安装过程,还是很有必要的。lnmp 主要是指 linux + nginx + mysql + php,现在已经是在 linux 系统下了,所以要安装配置的是 nginx + mysql + php 了,下面是具体步骤:
1、安装 nginx:
先安装 nginx 的依赖:
yum -y install gcc gcc-c++ openssl openssl-devel cyrus-sasl-md5
接着安装 nginx,我把下载下来的软件包都放在 /usr/local/src 目录下,可自主选择。
为了避免上传文件到服务器的过程,所以直接使用 wget 进行下载,方便。
先下载 pcre 和 zlib:
wget https://downloads.sourceforge.net/project/pcre/pcre/8.42/pcre-8.42.tar.gz
wget http://www.zlib.net/fossils/zlib-1.2.11.tar.gz
再到 nginx 官网下载 nginx 包:
wget http://nginx.org/download/nginx-1.14.2.tar.gz
下载完成后进行解压:
tar -zxvf nginx-1.14.2.tar.gz
tar -zxvf pcre-8.42.tar.gz
tar -zxvf zlib-1.2.11.tar.gz
之后进入解压目录进行编译(解压后当前目录下会有 configure 文件,--prefix 配置安装的路径(位置),--with-pcre和--with-zlib分别是上面下载解压的 pcre 和 zlib 包的路径):
cd nginx-1.14.2
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-pcre=../pcre-8.42 --with-zlib=../zlib-1.2.11
编译完成就进行构建和安装:
make
make install
或者
make && make install
安装完毕后得使用绝对路径启动 nginx 服务:
/usr/local/nginx/sbin/nginx
#查看服务状态
ps -ef | grep nginx
成功开启 nginx 服务的效果图类似下面:
直接在浏览器地址栏输入服务器 ip 或 域名即可访问,得到如下图的结果即正常:
现在启动 nginx 需要使用绝对路径,比较麻烦,所以将 nginx 的启动命令(路径)配置到系统全局变量文件(/etc/profile)内即可。在文件底部添加:(使用分号":"分割之前的系统变量)
export PATH="$PATH:/usr/local/nginx/sbin"
保存退出后执行以下语句是配置生效:
source /etc/profile
现在就可以直接使用 nginx 命令启动 nginx 服务了。
nginx -s reload #重启nginx服务
nginx -t #测试nginx配置文件是否正常
将 nginx 服务添加到开机自启动:
系统启动脚本 /etc/rc.local
,这个文件是系统启动后会自动执行的。进入此文件添加如下语句》
#启动命令和 -c 配置文件的路径
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf &
重启服务器再使用如下命令查看 nginx 服务是否启动:
ps -ef | grep nginx
#如若未正常启动,则可能是该文件执行权限问题,可以给文件添加其他人执行的权限:
chmod o+x /etc/rc.local,之后重启服务器试试。
正常效果图如下:
当使用 nginx -s reopen 会报如下错误的时候可以如下图解决:
nginx.conf 配置文件去掉下图 pid 前的注释符号"#",保存退出 :wq。
再执行 nginx -s reopen 未出现上述错误即可。
2、安装 php
第一步也是安装必要的依赖:
yum -y install gcc gcc-c++ libxml2 libxml2-devel autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel
执行后如果出现错误类似(https://blog.csdn.net/zhuxiang203/article/details/38779779),意思是存在多个库版本,我这边是 glib2 多了个 32 位的版本,而系统是 64 位的,因此需要将其删除。大家根据具体提示进行删除。
#使用此命令查看发现 glib2 确实存在多个版本
rpm -qa|grep glib2
#删除上面命令执行结果中不需要的版本
rpm --erase --nodeps glib2-2.46.2-4.el7.i686
删除不需要的版本后重新执行上述安装命令出现如下提示即可:
完成上一步操作之后先下载 php 包:
#下载
wget http://am1.php.net/distributions/php-7.3.0.tar.gz
#解压
tar -zxvf php-7.3.0.tar.gz
进入解压目录 cd php-7.3.0 进行编译:
--with-config-file-path=php.ini_path #此配置项指定 php.ini 存放路径
#编译命令配置如下:
./configure --prefix=/usr/local/php-fpm --enable-fpm --with-zlib --with-pdo-mysql --enable-mbstring --with-gd --with-png-dir=/usr/lib64 --with-jpeg-dir=/usr/lib64 --with-freetype-dir=/usr/lib64
--with-config-file-path=/usr/local/php-fpm/etc --with-fpm-user=work --with-fpm-group=work
安装:
make
make install
或者
make && make install
make 之后出现如图表示构建完成,可自行选择是否执行 make test 测试(耗时会有点久),可以跳过,继续 make install。
安装完成可以查看下php.ini 文件位置:
在 php-fpm 的 etc 目录下复制一份 php-fpm.conf.default 作为 php-fpm 的配置文件:
cp php-fpm.conf.default php-fpm.conf
在 /usr/local/php-fpm/etc/php-fpm.d 具体看你安装路径找php-fpm.d,复制 www.conf.default 作为 www.conf。
cp www.conf.default www.conf
编辑 php-fpm.conf 去掉 ;pid = run/php-fpm.pid 前的“;”号。
检查对应的 user 和 group 是否为咋们之前编译配置的用户和组,之前没配置就自行加上去。我这边是php-fpm.conf 里面 include (包含)了 php-fpm.d/*.conf 于是我就去找到对应的 conf 文件,这里是 www.conf(上面复制 www..conf.default 的),在里面检查 user 和 group。
接着启动 php-fpm 如下图操作:
自己创建个 php 文件,执行:
发现直接使用 php 命令执行是不行滴,因此需要将 php 具体执行命令的路径配置个别名为 php ,或者参照上面 nginx 的方法配置。这里介绍另一种方法:在文件 ~/.bash_profile 文件内配置 php 为具体执行命令的别名:
vi ~/.bash_profile
#配置执行命令的别名然后保存退出
alias php=/usr/local/php-fpm/bin/php
#执行以下命令使配置生效
source ~/.bash_profile
在 /usr/local/nginx/conf 目录下找到 nginx.conf (nginx 配置文件),查看 web 的根目录,如下图 root 对应的 html 即是 nginx 根目录下的 html 目录。
如上图红色标记的文字,假如是未改动之前的 scripts 则访问 /usr/local/nginx/html 目录下的 php 文件进行测试则会报错找不到文件(File not found.),可以在 /usr/local/nginx/conf 找到 fastcgi.conf 查看 fastcgi_param 的配置参数如下图:
所以将 nginx.conf 里的该参数做上上图的修改即可运行正常如下图:
上面运行正常后,接下来配置 php 开启、关闭服务等的便捷命令。
在 /etc/init.d 目录下新建自启动文件,名为 php-fpm,内容如下(配置的路径自己根据情况修改即可):
#! /bin/sh
### BEGIN INIT INFO
# Provides: php-fpm
# Required-Start: $remote_fs $network
# Required-Stop: $remote_fs $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: starts php-fpm
# Description: starts the PHP FastCGI Process Manager daemon
### END INIT INFO
prefix=/usr/local/php-fpm
exec_prefix=${prefix}
php_fpm_BIN=${exec_prefix}/sbin/php-fpm
php_fpm_CONF=${prefix}/etc/php-fpm.conf
php_fpm_PID=${prefix}/var/run/php-fpm.pid
php_opts="--fpm-config $php_fpm_CONF --pid $php_fpm_PID"
wait_for_pid () {
try=0
while test $try -lt 35 ; do
case "$1" in
'created')
if [ -f "$2" ] ; then
try=''
break
fi
;;
'removed')
if [ ! -f "$2" ] ; then
try=''
break
fi
;;
esac
echo -n .
try=`expr $try + 1`
sleep 1
done
}
case "$1" in
start)
echo -n "Starting php-fpm "
$php_fpm_BIN --daemonize $php_opts
if [ "$?" != 0 ] ; then
echo " failed"
exit 1
fi
wait_for_pid created $php_fpm_PID
if [ -n "$try" ] ; then
echo " failed"
exit 1
else
echo " done"
fi
;;
stop)
echo -n "Gracefully shutting down php-fpm "
if [ ! -r $php_fpm_PID ] ; then
echo "warning, no pid file found - php-fpm is not running ?"
exit 1
fi
kill -QUIT `cat $php_fpm_PID`
wait_for_pid removed $php_fpm_PID
if [ -n "$try" ] ; then
echo " failed. Use force-quit"
exit 1
else
echo " done"
fi
;;
status)
if [ ! -r $php_fpm_PID ] ; then
echo "php-fpm is stopped"
exit 0
fi
PID=`cat $php_fpm_PID`
if ps -p $PID | grep -q $PID; then
echo "php-fpm (pid $PID) is running..."
else
echo "php-fpm dead but pid file exists"
fi
;;
force-quit)
echo -n "Terminating php-fpm "
if [ ! -r $php_fpm_PID ] ; then
echo "warning, no pid file found - php-fpm is not running ?"
exit 1
fi
kill -TERM `cat $php_fpm_PID`
wait_for_pid removed $php_fpm_PID
if [ -n "$try" ] ; then
echo " failed"
exit 1
else
echo " done"
fi
;;
restart)
$0 stop
$0 start
;;
reload)
echo -n "Reload service php-fpm "
if [ ! -r $php_fpm_PID ] ; then
echo "warning, no pid file found - php-fpm is not running ?"
exit 1
fi
kill -USR2 `cat $php_fpm_PID`
echo " done"
;;
*)
echo "Usage: $0 {start|stop|force-quit|restart|reload|status}"
exit 1
;;
esac
接下来配置 php-fpm 服务:
先给刚才创建的文件 755 权限,具体几步操作如下:
# 设置权限
chmod 755 /etc/init.d/php-fpm
# php-fpm加入服务
chkconfig --add php-fpm
# php-fpm 2345 级别下设置为启动
chkconfig php-fpm on
# 查看php-fpm服务当前配置
chkconfig --list php-fpm
php-fpm 0:off 1:off 2:on 3:on 4:on 5:on 6:off
如图:
此时便能使用如下命令控制 php-fpm 服务开闭状态的切换了:
# 启动
service php-fpm start
# 关闭
service php-fpm stop
# 重启
service php-fpm restart
# 平滑重启
service php-fpm reload
# 检查配置文件
service php-fpm configtest
# 执行结果
Usage: /etc/init.d/php-fpm {start|stop|force-quit|restart|reload|status}
此处 php-fpm 服务的配置具体参考博文地址:https://www.jb51.net/article/138992.htm
3、编译安装 mysql
到 mysql 官网选择相应版本,如下图,一开始选错了,左边是错误的选择,右边是正确的选择,然后复制下载路径或者直接下载后上传到服务器,我这里使用 wget 直接获取源码包,所以需要复制到下载的地址。
与之前的不同,mysql 编译安装前的构建要使用 cmake。
我一开始是选择如左上图所示的压缩包,结果在 cmake 构建时出错了,百度完原因后才改选右上图的压缩包。如下图:
# 下载 mysql,统一将源码都放在一个目录比如(/usr/local/src)
wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.24.tar.gz
# 解压
tar -zxvf mysql-5.7.24.tar.gz
接下来要用 cmake 编译安装,未安装则先安装 cmake。
# yum 安装 cmake
yum -y install cmake
# cmake
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/local/mysql/data -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci
心想这下估计可以了吧,结果出现了新错误如下:
根据提示可以在 cmake 后添加配置参数运行后会在配置的目录下下载需要的 boost ,所以完整的 cmake 命令如下:
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/local/mysql/data -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DDOWNLOAD_BOOST=1 -DWITH_BOOST=/usr/local/boost
然鹅事情并不顺利,下载 boost 包超时失败。
于是就根据上图提示的下载路径自己去刚才 cmake 配置的 boost 包将存放的位置下载对应包,命令如下,下载成功如下图:
# 进入存放路径
cd /usr/local/boost
# 下载对应包
wget http://sourceforge.net/projects/boost/files/boost/1.59.0/boost_1_59_0.tar.gz
# 解压
tar -zxvf boost_1_59_0.tar.gz
于是继续执行上面的 cmake 命令,结果还报错----如下:
如上图所示,提示缺少 Curses 库,然后结合自己的系统是 Centos(属于Redhat)所以选择下载的包名是 ncurses-devel。
rm -f CMakeCache.txt
yum -y install ncurses-devel
再次执行上述 cmake 命令终于成功。
此时可以执行如下命令进行安装了。
make && make install
时间会有点久,可以去干点其它事。成功如下图:
到此就把 mysql 编译安装完成了,接下来就是配置 mysql 。
先进入mysql 安装目录(/usr/local/mysql).
# 创建mysql组
groupadd mysql
# 添加 mysql 用户并让它属于 mysql 用户组
useradd -r -g mysql mysql
# 将所有的目录都改成 mysql 用户和 mysql 组 (安装好后默认都是root)
chown -R mysql:mysql ./
结果发现 mysql5.7 版本的没有 data 目录。于是自己手动创建 data 目录。
# 创建 data 数据目录
mkdir data
# 修改用户和用户组为 mysql
chown -R mysql:mysql data
# basedir 为mysql 的路径,datadir 为mysql的 data 包,里面存放着mysql自己的包,如user.
bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
此处需要注意记录生成的临时密码(iy&Qkw,S!060),如下图:
继续执行如下命令:
bin/mysql_ssl_rsa_setup --datadir=/usr/local/mysql/data
# 进入 support-files
cd support-files
# 此 mysql 版本无 my-default.cnf,于是手动创建,内容如下:
vi my-default.cnf
# 进入编辑模式输入以下内容并保存退出
# device on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html
# *** DO NOT EDIT THIS FILE. It's a template which will be copied to the
# *** default location during install, and will be replaced if you
# *** upgrade to a newer version of MySQL.
[mysqld]
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
# 一般配置选项
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
#socket = /temp/mysqld.sock
socket = /var/run/mysqld/mysqld.sock
character-set-server=utf8
#下面是可选项,要不要都行,如果出现启动错误,则全部注释掉,
#保留最基本的配置选项,然后尝试添加某些配置项后启动,检测配置项是否有误
back_log = 300
max_connections = 3000
max_connect_errors = 50
table_open_cache = 4096
max_allowed_packet = 32M
#binlog_cache_size = 4M
max_heap_table_size = 128M
read_rnd_buffer_size = 16M
sort_buffer_size = 16M
join_buffer_size = 16M
thread_cache_size = 16
query_cache_size = 128M
query_cache_limit = 4M
ft_min_word_len = 8
thread_stack = 512K
transaction_isolation = REPEATABLE-READ
tmp_table_size = 128M
#log-bin=mysql-bin
long_query_time = 6
server_id=1
innodb_buffer_pool_size = 1G
innodb_thread_concurrency = 16
innodb_log_buffer_size = 16M
innodb_log_file_size = 512M
innodb_log_files_in_group = 3
innodb_max_dirty_pages_pct = 90
innodb_lock_wait_timeout = 120
innodb_file_per_table = on
[mysqldump]
quick max_allowed_packet = 32M
[mysql]
no-auto-rehash
socket = /var/run/mysqld/mysqld.sock
default-character-set=utf8
safe-updates
[myisamchk]
key_buffer = 16M
sort_buffer_size = 16M
read_buffer = 8M
write_buffer = 8M
[mysqlhotcopy]
interactive-timeout
[mysqld_safe]
open-files-limit = 8192
[client]
loose-default-character-set = utf8
将它复制到 /etc/ 目录下:
# 复制 mysql 配置文件
cp my-default.cnf /etc/my.cnf
# 复制 mysql 服务文件
cp mysql.server /etc/init.d/mysqld
# 修改 basedir=自己的路径,修改 datadir=自己的路径。
vim /etc/init.d/mysqld
# 我自己修改如下
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
现在就启动 mysql 服务试试:
bin/mysqld_safe --user=mysql&
结果报错如下:
解决如下:
继续执行上面的命令,若出现下图结果即正常。
可能出现错误:
后来发现是 /var/run/mysqld 目录的权限问题,解决如下:
使用 root 用户和上面的初始化密码登录。
修改 mysql 的 root 密码和访问的 Host,目前只有本地 localhost 可以访问,修改为远程也可以访问。
报错原因:mysql 运行在 safe-updates模式下,该模式会导致非主键条件下无法执行update或者delete命令,执行命令如下命令
# 设置安全更新模式设置(0-不限制)
SET SQL_SAFE_UPDATES = 0;
# 更新
update user set Host = '%' where user = 'root';
# 还原安全更新模式设置
SET SQL_SAFE_UPDATES = 1;
flush privileges; 作用是使修改立即生效,无需重启 mysql 服务。
重启 mysql 服务,测试本机电脑远程连接数据库服务器。下图分别是未修改前(不允许远程访问),修改后(允许远程访问)。
现在服务器使用 mysql 简写命令是不行滴,所以也要配置执行命令的路径:
在文件 /etc/profile 内加入上述截图语句,即可使用 mysql 命令。
最后配置下 mysql 服务,方便管理服务的开闭状态。
现在需要在 /etc/init.d/ 目录下执行如下语句才能重启服务:
为了方便就将其配置成服务,配置服务过程如下:
# 配置服务
chkconfig --add mysqld
# 开启服务
service mysqld start #注意是 mysqld 而不是 mysql
或 /bin/systemctl start mysql.service
# 关闭服务
service mysqld stop
或 /bin/systemctl stop mysql.service
# 重启服务
service mysqld restart
或 /bin/systemctl restart mysql.service
参考博文地址:
https://blog.csdn.net/qq_35061546/article/details/78703164
https://www.jb51.net/article/122423.htm
终于写完了!隔太久来补博文真的难受,因为记不太清楚了,还好之前留了过程截图,好了,居然写了三个晚上服了我自己哈,晚安!整个过程下来收获不少,参考网上博文,然后结合自己尝试过程出的错自己找,排查错误或网上继续找解决方案,最后问题一个个攻破就成功啦~