1. 选择合适的操作系统
和很多喜欢编译安装的人不同,我认为rpm安装的软件包比自己编译安装的要稳定得多,而且运行时比Docker安装的程序速度更快。所以如果我用到了稍微新一些的软件包,那么我会更倾向于使用openSUSE或者FreeBSD,因为它们自带的软件包比较新,如果自带的包比较旧的话,可以使用半官方源更新。而Centos的非官方源实在是不给力。但是这次因为要发布的程序使用了很古老的phalcon-2.0.13框架,而新版的操作系统所使用的phalcon框架都是更新的3.x版或者4.x版,所以为了管理方便,我没有选择Centos8.x,而是选择了7.9
phalcon框架在2.x时代包含有\Phalcon\Mvc\User\Plugin类,而从3.x开始这个类从官方移除了,所以我只能留守在古老的2.x版本,毕竟这个程序是多年前开发的,很久没有跟进,现在因为特殊需求所以又要使用一段时间。
2. 安装web服务器软件
2.1 安装remi源。
Centos官方自带的php版本非常古老,为了能够在Centos中使用高版本的php,有志愿者建立了remi源,remi源中包含了很多高版本的php相关的rpm,可以安装在古老的Centos版本上
# 添加epel源
yum install epel-release
# 添加remi源,如果没有安装epel源,则会出现依赖问题,所以必须要先安装epel源
rpm -Uvh http://rpms.remirepo.net/enterprise/remi-release-7.rpm
remi源默认是不启用的,所以要先启用
yum-config-manager --enable remi-php56
或者也可以手动编辑
vim /etc/yum.repos.d/epel.repo
找到其中的enable=0改成enable=1
然后刷新一下yum数据库
yum clean all
yum update
yum makecache
2.2 安装apache服务器
yum install httpd mod_ssl mod_perl mod_auth_mysql
2.3 安装php组件
安装phalcon
yum install php-phalcon2
以及其他php组件
yum install php php-pear php-gd php-mbstring php-memcache php-mcrypt
Centos的rpm中已经包含了自动配置脚本,只要用rpm安装apache就会自动识别php插件
特别说明一下,yum的remi源自带了fastmirror插件,会自动测试不同的镜像的速度,然后从最快的站点下载。虽然是在aliyun上安装的服务器,但是测试结果往往是清华大学的镜像最快。
2.4 配置防火墙
为了保证服务器的安全,需要使用firewalld服务,我没有使用iptables。
开启防火墙
systemctl start firewalld
打开http服务器使用的80端口
firewall-cmd --zone=public --add-port=80/tcp --permanent
刷新防火墙规则
firewall-cmd --reload
看一下是否开启
firewall-cmd --zone=public --list-ports
2.5 开启apache测试页面
systemctl start httpd
然后在浏览器里输入服务器的IP地址,按下回车键,如果一切顺利就会出现apache的默认页面
3. 数据库软件
3.1 数据库服务器的安装
我选择的数据库是mariadb,兼容mysql。是红帽系发行版默认的替代mysql的软件。还要顺道安装php-mysql插件
yum install mariadb mariadb-server php-mysql
启动mariadb服务器
systemctl start mariadb
3.2 mariadb的配置
默认安装的mariadb是不可以登录的,所以需要做一些简单配置
mysql_secure_installation
按照提示一步步走就行,第一步是问用户输入root密码,刚开始安装的时候是没有密码的,所以直接敲回车即可。剩下的都是常规问题,正常操作即可。
然后需要对mariadb做一些详细的配置,网络上流传的大多数配置方法都是编辑/etc/my.cnf,这个文件是整个mysql的全局配置文件,可是我更喜欢编辑/etc/my.cnf.d/目录下的几个文件,这样可以把配置做的更有针对性一些
配置mariadb服务器的字符集为utf8
vim /etc/my.cnf.d/server.cnf
找到[mysqld]段,修改为。
[mysqld]
character_set_server=utf8mb4
collation-server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
skip-character-set-client-handshake=true
init_connect='SET collation_connection = utf8mb4_unicode_ci'
要注意的是mysql和mariadb提供的utf8其实不是真正的utf8,而utf8mb4才是真正的utf8。
这两者之间的区别可以参考官方文档
https://dev.mysql.com/doc/refman/5.6/en/charset-unicode-utf8mb4.html
或者中国的解释
https://blog.csdn.net/qq_17555933/article/details/101445526
https://blog.csdn.net/u010584271/article/details/80835547
为了保证客户端和服务器的通信中字符集不会出错,在/etc/my.cnf.d/client.cnf中增加一段
[mysql]
default-character-set = utf8mb4
然后
systemctl restart mariadb
3.3 具体数据库的配置
mysql -h localhost -u root -p
登录到服务器上,注意这里的密码不是操作系统登录的密码,而是之前mysql_secure_installation命令中输入的密码
创建用户
create user 'username'@'%' identified by 'passwordd';
这里的%是指任意IP均可访问,如果考虑安全,可以修改为localhost
create database databasename;
这里对于用户名和数据库名给的是两个不同的名字,不过一般为了管理方便,都是给相同的名字
grant all on databasename.* on 'username'@'hostname';
这里的hostname相当于之前的%,也就是当初创建用户时使用的主机名
随后启用用户权限修改
flush privileges;
然后退出数据库服务器上root用户的登录
\q
再以之前创建的用户登录数据库服务器
mysql -h localhost -u username -p
导入SQL文件
use databasename
source /path/to/file.sql
如果SQL文件中包含了用户创建、数据库创建等操作,那么可以使用root来进行source操作,但是一般来说这类操作都是不包含在SQL文件里的,因为数据库管理员root一般不会管这类事情。所以一般都是普通用户登录到自己的数据库上,然后导入SQL文件。
这样就等于是把相关的数据库准备好了
4. 安装缓存服务
现代缓存服务一般用redis居多,不过这个程序开发的年代比较早,所以用的是memcache
yum install memcached
systemctl start memcached
5. 部署php程序
5.1 上传php程序
使用winscp登录到服务器上,然后直接上传文件即可。要注意的是,winscp在显示服务器上的文件时,不会显示隐藏文件。
在linux系统中,隐藏文件就是以“.”开头的文件。而对于这个php程序而言,因为使用了restful风格的路由器,所以在很多地方放置了.htaccess文件,里面包含了重定向的信息,这个文件是隐藏的。而因为在不同的位置需要不同的重定向方式,而nginx虽然可以通过include把.htaccess文件内的内容读入并起效,但是无法针对不同的目录采取不同的重定向策略。所以这里还是用了apache作为web服务器,apache可以针对不同的目录下的.htaccess文件进行不同规则的重定向。
另外由于该程序是在windows下开发,而windows对大小写不敏感,所以留下了一些隐患,在Linux服务器上才会暴露。所以要仔细清查。
还有就是git管理中,上传到服务器上时不会上传空目录,而php涉及到文件操作时,出于管理和安全的考虑,一般都会把文件上传设定到一个特定的目录,默认情况下这个目录是空的。如果直接从git服务器拉取php程序,这个目录就会缺失,导致涉及到文件上传功能时出错。所以要在git中创建一个空目录,同时在这个目录下创建一个点开头的空文件(Linux下的隐藏文件)以确保该目录在git过程中不会丢失,常见的是.keep文件。
虽然web服务器默认的目录是/var/www,但是从安全考虑,一般都是放在/home/username目录下。创建一个普通用户,然后在普通用户的家目录创建一个目录放置php程序。然后通过调整web服务器的设置来让web服务器读取这个目录下的文件。
5.2 配置web服务器
根据
https://blog.csdn.net/weixin_33690963/article/details/91802376
做如下调整
编辑/etc/httpd/conf/httpd.conf
注释掉
<Directory />
AllowOverride none
Require all denied
</Directory>
修改DocumentRoot与Directory
DocumentRoot "/home/username/html"
<Directory "/home/username/html">
Options Indexes FollowSymLinks
AllowOverride all # 原本这里是None,但是为了让.htaccess实现restful路由,必须要开启重定位
Require all granted
</Directory>
apache的httpd程序启动时默认是apache用户来启动,这个用户的访问权限是不能覆盖到/home/username目录的,所以直接访问会出现权限错误。所以这里要修改User与Group
User username
Group groupname
这样httpd程序就会以username这个普通用户来启动,就可以访问到/home/username/html目录下的所有内容了
因为php是通过rpm安装的,所以不需要修改http.conf文件以让apache识别出php来
可能是aliyun上面的Centos做过特殊配置,我并没有遇到任何selinux的问题
经过以上配置,就可以在远程通过
http://ipaddress/
来访问aliyun上面架设的php站点了。如果需要用域名访问,可以到域名服务商处注册域名指向这个服务器的IP地址,然后在http.conf中修改
ServerName www.example.com:80
就可以了
如果需要在一台服务器上架设多个站点,那么可以参考
https://blog.csdn.net/silent_missile/article/details/99395925
中关于VirtualHost的部分
5.3 自动运行服务
为了运行这个php站点,实际上需要4个服务:httpd、mariadb、memcached、firewalld,最好是把它们几个加入开机自动运行,这样避免维护的时候忘记
systemctl enable httpd
systemctl enable mariadb
systemctl enable memcached
systemctl enable firewalld