简介
最近的一个项目是一个后台管理网站,主要用到的是基于thinkPHP5的Fastadmin框架作为基础进行二次开发,由于开发环境是Windows,官方文档也有对应的教程,所以就直接用的phpstudy集成环境进行测试,期间没有任何问题,但是线上服务器是centos,这个环境配置就搞得我头皮发麻了,最后还好搞出来了,这里记录一下,以备下次再配环境的时候避开这些坑。
环境介绍
本项目所用到的环境比较多,首先PHP5.6+mysql5.7+Apache+Nginx+Tomcat+ejabberd,别问为什么用到这么多东西,它就是要搞这么多,搞就是了。从零开始,这里从服务器系统安装好开始记录。
-
网络配置
由于在公司担任的是“全沾工程师”职位,从扛机箱到写代码,全都得出手。电信独立ip接入后需要在路由器上配置下虚拟服务器环境、端口映射这些,一开始不懂这个,搞了好久都没把端口给开放出来,一度以为买了假服务器。具体步骤是先在浏览器打开192.168.1.1(没错,就是平时设置WiFi密码的那个),我这里用的是tplink的路由,输入密码进入后有如下几个:
我们点“应用管理”后先进入IP与MAC绑定,找到你的centos服务器的MAC地址对应的ip地址,点下绑定,然后回到“虚拟服务器”应用,进入里面有如下设置:
然后将需要用到的端口添加到这里,常用服务器根据需要选择,也可以不选,外部端口和内部端口填要开放的端口号,比如8080啥的。ip地址就是你的服务器所在的内网地址(刚刚添加绑定的那个),协议类型根据需要选择或者直接选ALL,然后保存。到这网络配置就算能用了。 - 服务器防火墙端口开放
虽然路由上设置了端口,但是centos上如果开了防火墙,还是要将对应端口开放,外网才能访问得到的,具体操作我这里用的命令行的方式,其他方式也是可以的,具体操作可以Google搜索。我们开放一个端口只需要执行以下命令:
firewall-cmd --zone=public --add-port=8080/tcp --permanent (--permanent永久生效,没有此参数重启后失效)
#重新载入
firewall-cmd --reload
#删除
firewall-cmd --zone= public --remove-port=8080/tcp --permanent
如上,执行完后8080端口就算是开放了,外网也可以访问到,前提是你部署了对应的监听应用,比如安装了Tomcat等,具体Tomcat怎么装后面会有涉及到。
- PHP5.6安装
为什么不用PHP7?不知道,缘分吧,Windows下装的是5.6,不想折腾,就直接用回5.7。
1、检查是否已有PHP
yum list installed | grep php
如果有安装的PHP包,先删除他们, 如:
yum remove php*
这是删除已php开头的文件,适用于存在很多个的时候,当然你也可以精确的打完整个文件名
2、配置安装包源
yum install epel-release
rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
这是centos7的配置,其他版本系统是不同滴,有需要去搜一下就有了,这里就不贴出来了。
3、安装
yum install --enablerepo=remi --enablerepo=remi-php56 php php-opcache php-devel php-mbstring php-mcrypt php-mysqlnd php-phpunit-PHPUnit php-pecl-xdebug php-pecl-xhprof
4、验证
php -v
会输出版本信息,到此php安装完毕。
- 安装 MySQL
1、检查
同样先检查是否存在mysql
rpm -qa|grep -i mysql
#如果有,删掉
yum remove mysql*
2、下载安装
wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
#安装
yum -y localinstall mysql57-community-release-el7-11.noarch.rpm
yum -y install mysql-community-server
#启动
systemctl start mysqld
3、修改默认密码
#先停止mysql
systemctl stop mysqld
#设置无密码登录
systemctl set-environment MYSQLD_OPTS="--skip-grant-tables"
#启动mysql
systemctl start mysqld
#登录
mysql -u root
#修改密码
UPDATE mysql.user SET authentication_string = PASSWORD('你要设置的密码') WHERE User = 'root' AND Host = 'localhost';
#刷新一下
FLUSH PRIVILEGES;
exit ;
#先停止服务
systemctl stop mysqld
#关闭无密码登录
systemctl unset-environment MYSQLD_OPTS
#启动mysql
systemctl start mysqld
重启mysql服务,一切回到了可控状态,现在你可以使用密码登录mysql了。好了,现在让我们去使用Windows连接数据库查看一番吧,总不能老是用命令行看数据库吧,太累了。愉快的打开Navicat,输入ip,输入端口,输入密码,测试连接.....wtf,连接失败,第一反应是不是去开端口?不对,端口开了。Telnet也通,咋整。Google啊。
原来Mysql为了安全性,在默认情况下用户只允许在本地登录,可是我们需要远程访问啊,整吧,show you the code:
#先在控制台把mysql打开
mysql -u root -p
#记得要输入密码
#进行授权操作:(这里可能会提示让你重置密码,然后当你按照提示进行操作
SET PASSWORD = PASSWORD('your new password');
#,又会出现另一个问题,就是你的密码可能太简单了无法通过,
#这是可以换一个辅助的密码或者直接将密码等级改为不那么严格,
#具体方法只要执行两句命令:
set global validate_password_policy=0;
set global validate_password_length=1;
然后就可以重新执行:
SET PASSWORD = PASSWORD('your new password');
)
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '你的密码' WITH GRANT OPTION;
#重载授权表:
FLUSH PRIVILEGES;
#退出mysql数据库:
exit;
到这里mysql应该能远程访问了,如果还有什么其他毛病,Google能把你解决掉的。
还有一个坑就是如果如果你的mysql是从5.5升级到5.6+的,以前如果有添加日期为0000-00-00类似的格式的数据,会出错,因为5.6开始日期格式不允许设为0了,我的解决办法是禁用这个属性。
首先用root账户登录进数据库
select @@sql_mode;
#把得到的结果复制出来,删除去NO_ZERO_IN_DATE,NO_ZERO_DATE这两个,再重新把新的设置进去
SET GLOBAL sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
exit;
这下就好用了。
- Nginx安装
我这里Nginx是用作rtmp推流用的,并不是用作web容器,所以这里是介绍Nginx安装并配置rtmp模块的。
1、首先要安装有git
yum -y install git
2、下载nginx-rtmp-module
git clone https://github.com/arut/nginx-rtmp-module.git
3.安装 openssl
yum -y install openssl openssl-devel
4、下载Nginx
#这里下载1.10.3版本,需要其他版本的自行更换就行了
wget http://nginx.org/download/nginx-1.10.3.tar.gz
#解压
tar -zxvf nginx-1.10.3.tar.gz
cd nginx-1.10.3
#配置rtmp拓展,这里路径要注意下,如果你下载的rtmpmodule不是和Nginx放在同一级目录,记得改一下位置,因为我这里是放在一起,所以只需../返回上一级就能找到rtmp位置了
./configure --add-module=../nginx-rtmp-module --with-http_ssl_module
#make安装一下
make && make install
5、启动
#启动nignx
/usr/local/nginx/sbin/nginx
#停止
/usr/local/nginx/sbin/nginx -s stop
启动了之后在浏览器输入localhost就能看到Nginx的测试网页了。到这还没完,我要的rtmp还没配置好。
6、rtmp配置
vim /usr/local/nginx/conf/nginx.conf
使用vim编辑配置文件
添加如下代码块,与http同级
rtmp_auto_push on; #这个好像不配也没啥影响,具体有什么用没去了解
rtmp_auto_push_reconnect 1s;#当worker被杀掉时 自动推送连接超时时间
rtmp{
server{
listen 1935; #监听端口,记得开放出去
chunk_size 4000;
application live { #rtmp推流请求路径
live on;
hls on;
hls_path /usr/local/nginx/html/live; #这个文件夹是不存在的,得自己去创建一个
hls_fragment 5s;
}
}
}
保存好后重启Nginx,到此就算能用了,自己找个推流工具,将推送地址设为:rtmp://IP/live/test
就可以推上去了,这个ip是你服务器外网ip,live是前面设置的地址,最后的后缀可以自己定的,到时拉流就需要用这个区分。
7、ejabberd安装配置
我们需要用到即时通信功能,以前有试过环信等第三方提供的SDK,后来还是觉得自己管数据比较好,于是就找了这个ejabberd开源项目,使用了下还是不错的,配置简单,功能强大,平台齐全。
首先要到官网下载安装包,https://www.process-one.net/en/ejabberd/downloads/,打开选择适合自己的版本下载就是了,下载好后传到centos服务器上。然后打开控制台,cd到安装包所在目录,先给权限,然后运行安装:
chmod +x ejabberd-YY.MM-linux-x86_64-installer.run
./ejabberd-YY.MM-linux-x86_64-installer.run
首先迎来的肯定是一大堆的协议了,一直enter,最后会让你输入y or n,即是否接受协议这些老套路,肯定得yes啦,不yes又不让你装,自己写是不可能自己写的,这辈子都不可能写得出来的,也只有找些开源库用用才能勉强维持得了生活。继续,yea完之后呢就会让你设置domain啊,我是直接使用ip地址啦,还没申请域名,将就下咯,然后就是管理员和密码了,我是设为默认admin 密码自己设一个,后面登录后台用的。最后还会有一个好像是分布式部署的选项,我是选了no。安装完就完事了,然后cd到安装目录,进入bin,启动命令入下:
#启动
./ejabberdctl start
#或者使用如下命令启动,并输出启动信息
./ejabberdctl live
#停止
./ejabberdctl stop
启动后可以通过浏览器访问http//ip:5280/admin进入管理页面
现在已经可以使用ejabberd了,你可以在Windows上下载Spark,进行测试。ps:新版本要在配置文件里加一个参数,不然web端会不能登录,提示跨域。yaml配置文件port: 5282 模块下增加 http_bind: true。
- Apache配置
centos下Apache的安装还是很简单的,有可能有的版本已经自带Apache了,要不要卸载重装自行决定吧。
yum install httpd
Apache操作命令:
systemctl start httpd //启动apache
systemctl stop httpd //停止apache
systemctl restart httpd //重启apache
systemctl enable httpd //设置apache开机启动
-SELINUX的问题
由于我的centos默认开启了SELINUX,导致项目部署上去后没办法写文件,也就跑不起来了,搜了很久试了很多方法都不行,甚至文件夹都给到777权限了,最后才发现是SELINUX的问题,也顺利找到了解决方法:
我们先进入项目文件夹,使用命令查看你的各个文件夹的权限
ls -Z
不出意外你应该会看到下面的字段:
httpd_sys_content_t:s0
从这里,可以发现,这个
可能是解决办法,给加个写权限试试吧,
#这里最后一个是你要给权限的文件/夹,因为我的是tp5项目,所以给的就是runtime文件夹
sudo chcon -R -t httpd_sys_rw_content_t /var/www/html/youpath
给完权限后再次ls -Z应该就变成了httpd_sys_rw_content_t:s0 ,多了写权限了。重启Apache,发现可以用了,hhh~。
-还有个插曲问题,刚开始部署好后,发现只有首页能进去,跳转登录页面都包not found错误,这个锅也得甩给Apache背的,一番Google之后成功解决,
a.修改Apache配置文件,在:/etc/httpd/conf/httpd.conf 将所有的AllowOverride None 的None改为 All
b.在项目根目录新建.htaccess文件,内容如下:
<IfModule mod_rewrite.c>
Options +FollowSymlinks
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} ! -f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</IfModule>
成功跳转了,到此,整个项目就成功运行起来了,后期再有什么坑再来记录下。
ps:本文只是个人记录用,如果对你有参考作用我很高兴,如果你实际操作有什么不同的结果也别惊讶,本篇文章初衷不是教程,是本着对自己下次配置有参考作用而已,当然如果你有什么问题也可以提出来,我们可以一起探讨解决的。