CentOS 7 / RHEL 7 上安装 LAMP + phpMyAdmin

之前根据在 Linode VPS 上部署 LAMP 服务器的经验写了安装记录,得到不少网友的亲睐。随着 CentOS 7 发布,安装过程发生了不少变化。因此在虚拟机上跑了一下,根据之前的记录做了修改,以供参考。主要注意的是,现在数据库由 MySQL 改成 MariaDB 了,故而 LAMP 代表的就是 Linux + Apache + MariaDB + PHP 了。

新的 CentOS 与 RHEL 的关系越来越密切,以下的安装过程同时适用于 CentOS 7 及 RHEL 7 发行版。但是因为不是在当前实际的 Linode VPS 环境下测试的,可能某些地方会与实际情况有出入,还请大家指正。

作为一个全新的教程,还是简单介绍一下背景吧。

系统:新的 CentOS 7 采用了 systemd,因而某些指令有所变化;现在使用 MariaDB 替代 MySQL 作为数据库软件,这里也将直接安装 MariaDB。

Linode VPS:虽然 Linode 一直在升级改造,但是基本的东西还是没什么变化,而且现在有试用没了。用 Visa / MasterCard 信用卡购买 Linode VPS 还是非常方便的,选择套餐 – 注册 – 选择服务器位置并付款(输入信用卡信息)就行了(已经没有年付折扣了)。

在 Linode 上部署系统应该也没什么变化:

  1. (登录)进入控制中心 – 进入 DashboardDeploy a Linux Distribution
  2. 选择 Linux 发行版(Distribution) – 设定磁盘大小(单位 MB)- 选择是否使用交换空间(swap) – 设定 root 密码(以后还能改)等,然后点击 Deploy 就开始安装系统了。
    *注意:还可以在选择 Linux 发行版的时候,直接使用选择框右边的 Deploying using StackScripts 的提示来选择在安装系统的同时部署一个 LAMP 的服务器环境。但是对于新手来说还是自己走一遍这个过程比较好,为以后修改、优化积攒经验。

这些操作都是一目了然的,没什么难度,特别是 Linode 还有详细的新手指南。可是配置 LAMP 服务器就比较费事了。虽然一键安装的快捷编译安装脚本,或者 Linode 上的自动化安装脚本很省事,可自己把这些过程走一遍是有利于以后维护服务器的。

下面记录的安装和配置 Linux + Apache + MariaDB + PHP + phpMyAdmin 服务器环境是从使用 Putty 等 SSH 远程登录软件连接到 VPS 之后开始的。也就是说,Linux 应该已经安装好了。(如果要在本地用虚拟机测试,或者希望了解更多的关于使用 VPS 的心得体会,请同时参考我的 VPS 学习之路系列文章。)

0 系统运行环境

  1. Linux Distribution: CentOS 7 64bit
  2. RAM: 1024MB
  3. Disk Space: 5GB
  4. 域名: cnzhx.net
  5. IP 地址: 12.34.56.78 (这是个示例用的 IP,没有实际意义)
  6. SELinux 已禁用

注意:上面示例用的内容应该换成自己的;建议内存不小于 1GB 的安装 64 位系统,比如因为这个

切记:因为系统不同,指令可能有所不同;硬件不同,配置方式也可能有些不同。强烈建议实战前先在自己的电脑上用 VirtualBox 之类的软件创建个虚拟机先练练手。可参考我的 VPS 学习之路

1 基本设置

这一部分参考 Linode 知识库 – 参考资料 1。

1.1 设置 HOSTNAME

先将配置写到 /etc/sysconfig/network 文件的末尾。直接用 echo 指令将内容使用 >> 操作符附加到该文件最后一行即可,(注意该条语句各部分之间的空格,一共三个)

echo "HOSTNAME=cnzhx.net" >> /etc/sysconfig/network

然后设置 hostname,

hostname "CnZhx"

我给设置成自己的主域名,即 CnZhx

1.2 配置 vim

注意

  • Linode 上直接部署的 CentOS 7 中已经安装了 vim。
  • 如果系统中没有安装 vim,可以试试看 vi,只是没有 vim 好用和好看罢了。
  • 如果不用 vim 就直接跳到下面的 1.3

或者先安装 vim 也行:

yum -y install vim

为了使之彩色显示代码,同时还支持行号标记和鼠标定位,需要编辑 vim 配置文件:

vim /etc/vimrc

从键盘输入 i 进入编辑模式,按键盘上的 PgDn (或上、下、左、右键)到文本最后一行最后一个字符之后按回车换行,在末尾分两行输入:

set nu
set mouse=a

从键盘输入 Ctrl+c,然后输入 :wq 保存、退出(这里 : 号表示退出编辑模式进入指令模式,w 表示保存,q 表示退出)(单纯的退出而不保存则是输入 :q,强制退出则是 :q!)。

1.3 更新 HOSTS 配置文件 /etc/hosts

这个文件的作用跟 Windows 中的 HOSTS 类似,可以给本地系统直接解析域名,这里设置了之后,这个系统本身访问 cnzhx.net 就不需要访问域名解析服务器了。

输入

vim /etc/hosts

打开编辑。在最后添加(注意 IP 地址与域名之间的空格),

12.34.56.78 cnzhx.net

保存退出。

1.4 配置网络

注意首次使用可以跳过这一步,直接使用 Linode 安装系统后的默认配置,等以后再配置静态 IP。

其实一个服务器就相当于一台个人电脑,只不过 IP 地址是固定的公网的 IP。因而可以在自己的域名管理系统那里将域名的 IP 指定为这个特定的 IP,然后别人就可以通过域名访问到这个 IP 地址所在的服务器(域名解析服务器会做转换)。然后这个服务器上安装了相应软件就可以提供网站服务了。

默认情况下,Linode VPS 使用 DHCP 来配置网络,这样做需要 VPS 运行 dhcp 客户端进程来从主控制台获取本 VPS 的 IP。当然会浪费一些资源了(CPU和内存),而且还需要开放 63 端口。所以这里采取静态网络配置来避免这些问题。

网络配置与选择的 VPS 服务商的配置有关,一般服务商提供的文档都会有说明的。

如果要增加 IPv6 支持,请参考 Linode VPS 上启用 IPv6 支持

从 Linode Manager 的 Dashboard 中的 Remote Access 标签页中可以获知自己 VPS 的网络配置信息。类似于:

Public IP: 12.34.56.78
Default Gateways 12.34.56.1
DNS Resolvers 74.207.241.5
74.207.242.5
2600:3c01::2
2600:3c01::3

修改 DNS 解析设置:

vim /etc/resolv.conf

按照上面的 DNS Resolvers 对应录入

domain members.linode.com
search members.linode.com
nameserver 74.207.241.5
nameserver 74.207.242.5
nameserver 2600:3c01::2
nameserver 2600:3c01::3
options rotate

保存并退出。

然后配置静态 IP(如果使用了 DHCP 自动获取 IP 则可以跳过此步骤直接跳到下面的 1.5 继续):

vim /etc/sysconfig/network-scripts/ifcfg-static-eth0

如果是 VirtualBox 虚拟机,则是,

vim /etc/sysconfig/network-scripts/ifcfg-static-enp0s3

对应录入,

# Configuration for eth0
DEVICE=eth0
BOOTPROTO=none
# 暂时不启用 IPv6
IPV6INIT=no

# This line ensures that the interface will be brought up during boot.
ONBOOT=yes

# eth0 - This is the main IP address that will be used for most outbound connections.
# The address, netmask and gateway are all necessary.
IPADDR0=12.34.56.78
# 不再用 netmask; 24 表示公网IP;17 表示内网 IP
PREFIX0=24

# gateway
GATEWAY=12.34.56.1

# 如果还有另一个公网 IP 23.45.67.89
IPADDR1=23.45.67.89
PREFIX1=24

保存并退出。

因为 DHCP 已经不需要了,可以使用 systemctl list-unit-files --type=service 命令查看 dhcp 相关服务的状态,然后停止它们。甚至可以删除相关软件包:

yum remove dhcp

重起 VPS 即可生效。

1.5 设置时区为 Hongkong

将香港时区文件设置符号链接localtime

ln -sf /usr/share/zoneinfo/Hongkong /etc/localtime
timedatectl list-timezones # 需要从这个列表中退出的话直接按 q 键即可。
timedatectl set-timezone Asia/Hong_Kong
timedatectl

更详细配置说明请参考:正确配置 Linode VPS 系统时间

2 安装 LAMP

2.1 先更新系统

yum update

2.2 安装并配置 Apache 网络服务器

CentOS 7 中默认的是 Apache 2.4 版本,Apache 官网有份很好的 vhost.conf 配置实例

安装

yum install httpd

备份配置文件(建议对于所有的配置文件,做任何更改前都先备份一份,以便应对未知错误)

mkdir ~/confbak
cp -R /etc/httpd ~/confbak

其中 ~ 表示当前登录用户的用户文件夹;-R 参数表示递归到所有子目录。

默认情况下 Apache 加载的模块(.so)过多,作为个人用的简单服务器可以比较安全的禁用其中一些模块,以提高 Apache 的性能、减少内存占用。请参考这里

因为默认情况下,位于 /etc/httpd/ 目录下的所有以 .conf 结尾的文件都会被 Apache 读取,并按照字母顺序加载做为 Apache 的配置,所以增加虚拟主机的时候,实际上不需要修改 /etc/httpd/conf/httpd.conf,而是在 /etc/httpd/conf.d/ 下新建一个配置文件 vhost.conf 来配置虚拟主机。

也有人每个虚拟主机(或网站、或域名)都单独弄个 conf 文件,比如 cnzhx.net.conf、test.cnzhx.net.conf、phpmyadmin.conf 等。这个看自己的喜好还有使用方便而定吧。

另外就是,水景一页建议另建一个 common.conf 文件来放置一些公共的设置,如果不想每次都去修改 httpd.conf 这个 Apache 的主配置文件的话。

配置虚拟主机(/etc/httpd/conf.d/vhost.conf

vim /etc/httpd/conf.d/vhost.conf

输入下面的内容(# 号后面的该行内容是注释):

1. 下面有路径中使用了域名 cnzhx.net 来做文件夹的名字,只是为了方便区分不同的域名,无它意。

2. 在服务器上一行行输入还是挺麻烦的,可以在本地编辑好了,然后通过 sftp 上传过去( filezilla 就挺好,有中文界面,还支持 ssh 登录(选择 sftp 模式即可))

#
# 主机 1
# cnzhx.net
#
<VirtualHost *:80>
ServerAdmin admin@cnzhx.net
ServerName cnzhx.net
ServerAlias www
# 非常感谢 cheers 的提醒,虽然测试显示无影响,但 Apache 文档如此要求
# 注意下面这行末尾不要带 /
DocumentRoot /srv/www/cnzhx.net/html

<Directory "/srv/www/cnzhx.net/html/">
    Options FollowSymLinks
    # 下一行这样设置就可以在网站文件的目录中使用 .htaccess
    AllowOverride All
    # 下一行是替代 Allow from all 的新机制
    Require all granted
</Directory>

ErrorLog /srv/www/cnzhx.net/logs/error.log
CustomLog /srv/www/cnzhx.net/logs/access.log combined
ServerSignature Off
</VirtualHost>

#
# 主机 2
# test.cnzhx.net
# 这是另一个位于同一服务器的网站,如果不需要则删除此段配置
#
<VirtualHost *:80>
ServerAdmin admin@cnzhx.net
ServerName test.cnzhx.net
ServerAlias test
DocumentRoot /srv/www/test/html

<Directory "/srv/www/test/html/">
    Options FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>

ErrorLog /srv/www/test/logs/error.log
CustomLog /srv/www/test/logs/access.log combined
ServerSignature Off
</VirtualHost>

#
# 主机 3
# 为了以后给访问 phpMyAdmin 的时候用,也可以是别的端口,如 4444
Listen 2082
#
# phpMyAdmin,访问地址:http://12.34.56.78:2082/phpMyAdmin
#
<VirtualHost 12.34.56.78:2082>
ServerAdmin admin@cnzhx.net
DocumentRoot /srv/www/phpmyadmin/html
<Directory "/srv/www/phpmyadmin/html/">
    Options FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

ErrorLog /srv/www/phpmyadmin/logs/error.log
CustomLog /srv/www/phpmyadmin/logs/access.log combined
ServerSignature Off
</VirtualHost>

虽然配置文件写好了,但是还不能启动 httpd 进程,因为上面设置的各个文件夹(网站目录)还没有创建。

创建各个虚拟主机的文件夹(根据需要增加或删除),

# 主机 1 的
mkdir /srv/www/cnzhx.net/html -p
mkdir /srv/www/cnzhx.net/logs

# 主机 2 的
mkdir /srv/www/test/html -p
mkdir /srv/www/test/logs

# 主机 3 的
mkdir /srv/www/phpmyadmin/html -p
mkdir /srv/www/phpmyadmin/logs

为了能够在系统启动时自动运行 Apache 服务器,需要运行下面的指令:

systemctl enable httpd

输出类似于,

ln -s '/usr/lib/systemd/system/httpd.service' '/etc/systemd/system/multi-user.target.wants/httpd.service'

然后启动 Apache 服务,

systemctl start httpd

如果上述指令提示说本来已经启动了 httpd,则重新加载它,

systemctl reload httpd

现在需要将 http 服务加入防火墙以允许外部访问(也就是将 HTTP 默认使用的端口 80 加入到防火墙允许列表里),

firewall-cmd --add-service=http --permanent

–permanent 参数表示这是一条永久防火墙规则,如果不加这个参数则重启系统后就没有这条规则了。

而对于自定义的用于 phpMyAdmin 的 2082 端口,也需要添加相应的防火墙规则。因为是非标准端口,直接用数字表示即可,

firewall-cmd --zone=public --add-port=2082/tcp --permanent

重启 Firewalld 使该规则生效,

systemctl restart firewalld

如果防火墙默认没有启动,则上述指令会提示错误,“FirewallD is not running”。那么先启用防火墙服务,

systemctl enable firewalld && systemctl start firewalld

其中 && 表示两条指令依次执行。

启动后再重新执行前两或三条指令,

firewall-cmd --add-service=http --permanent
firewall-cmd --zone=public --add-port=2082/tcp --permanent
systemctl restart firewalld

如果要查看加入后的防火墙规则,使用指令,

firewall-cmd --list-all

显示结果类似于,

public (default, active)
     interfaces: enp0s3
     sources:
     services: dhcpv6-client http ssh
     ports:
     masquerade: no
     forward-ports:
     icmp-blocks:
     rich rules:

如果已经做好了 DNS 域名解析,现在用浏览器打开域名应该能够看到 Apache 的测试页面了。(这里因为是在本地虚拟机上测试的,所以没用域名而是直接用的 IP 地址访问。)

CentOS 7 服务器 Apache 安装成功

CentOS 7 服务器 Apache 安装成功

总结一下关键点,httpd 服务默认配置文件:

  • 默认配置文件: /etc/httpd/conf/httpd.conf
  • 加载模块的配置文件: /etc/httpd/conf.modules.d/ directory (e.g. PHP)
  • 选择 MPMs (处理模式)  [worker, prefork (默认是这个)] 和 event: /etc/httpd/conf.modules.d/00-mpm.conf
  • 默认端口: 80 和 443 (SSL)
  • 默认日志: /var/log/httpd/{access_log,error_log}

systemctl 是新的 systemd 下的系统控制指令,详情请参考 CentOS 7 / RHEL 7 systemd 指令一文。

还可以直接用 apachectl 来控制 Apache 服务执行一些操作,比如优雅地重新加载配置,

apachectl graceful

“优雅地”的意思是不中断客户的访问的情况下逐渐地将所有 httpd 进程更新为使用新配置的新进程。

详情需要查看其简单的帮助文件,

apachectl -h

其它重要的防火墙 Firewalld 选项有,

# firewall-cmd --state
# firewall-cmd --list-all
# firewall-cmd --list-interfaces
# firewall-cmd --get-service
# firewall-cmd --query-service service_name
# firewall-cmd --add-port=8080/tcp

2.3 安装和配置 Mariadb 数据库服务

MariaDB 是在 MySQL 基础上重建的一个数据库软件,各 Linux 发行版都陆陆续续从 MySQL 切换到了 MariaDB。CentOS 从 7 开始默认使用 MariaDB。

2.3.1 安装

yum install mariadb-server mariadb

2.3.2 加入随系统启动

systemctl enable mariadb

输出结果类似于,

ln -s '/usr/lib/systemd/system/mariadb.service' '/etc/systemd/system/multi-user.target.wants/mariadb.service'

2.3.3 启动 mariadb 守护进程(mysqld)

systemctl start mariadb

其默认用户名还是 mysql,

top -u mysql

可以查看内存占用情况。

停止/重启或停用 mariadb 服务的一些指令:

# 停止
sudo systemctl stop mariadb
# 重启
sudo systemctl restart mariadb
# 禁用
sudo systemctl disable mariadb
# 检查 mariadb 服务器 是否正在运行
sudo systemctl is-active mariadb

2.3.4 安全配置 MariaDB

使用 MariaDB 内建的安全配置脚本进行配置

mysql_secure_installation

这里需要配置 mysql 根用户和密码、清除其他用户、清除不需要的数据库等。输出类似于下面的执行过程,其中需要我们从键盘输入的内容用蓝色注释出来了:

# /usr/bin/mysql_secure_installation
/usr/bin/mysql_secure_installation: line 379: find_mysql_client: command not found

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none):这里直接回车,这里可不是 Linux root 用户,而是 MariaDB 数据库的 root 用户
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n] y
New password:输入你的数据库root用户密码
Re-enter new password:再输入一遍
Password updated successfully!
Reloading privilege tables..
... Success!
By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them. This is intended only for testing, and to make the installation
go a bit smoother. You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] y
... Success!

Normally, root should only be allowed to connect from 'localhost'. This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] y
... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access. This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] y
- Dropping test database...
... Success!
- Removing privileges on test database...
... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] y
... Success!

Cleaning up...

All done! If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

然后使用 MySQL 的 root 帐户(不同于 Linux 的 root 帐户,刚才设置密码了)登录进去

mysql -u root -p

输入密码后回车,下面是输出示例,可以看到命令提示符变为 MariaDB [(none)]>

# mysql -u root -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 10
Server version: 5.5.37-MariaDB MariaDB Server

Copyright (c) 2000, 2014, Oracle, Monty Program Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

创建一个新数据库给 WordPress 用(这里取名为 wordpress,也可以用别的名字)

MariaDB [(none)]> create database wordpress;

创建一个新用户,并将该数据库的权限赋给他(这里只是举例,用户名为 newdbuser,密码为 dbuserpassword)

MariaDB [(none)]> grant all on wordpress.* to 'newdbuser' identified by 'dbuserpassword';

更新权限

MariaDB [(none)]> flush privileges;

退出数据库

MariaDB [(none)]> quit

备份配置文件,

cp /etc/my.cnf ~/confbak/my.cnf.bak

其它的先不做了,回头用图形界面的 phpMyAdmin 来做。

2.4 安装和配置 PHP

注意:如果要使用 event 模式的话,需要安装使用 php-fpm。(推荐使用该模式!

安装 PHP5,

yum install php

备份配置文件 /etc/php.ini,还有 php.conf 以及 10-php.conf,

cp /etc/php.ini ~/confbak/php.ini.bak
cp /etc/httpd/conf.d/php.conf ~/confbak/httpd/conf.d/php.conf.bak
cp /etc/httpd/conf.modules.d/10-php.conf ~/confbak/httpd/conf.modules.d/10-php.conf.bak

并确保 /etc/php.ini 中有下面的语句(不同的就修改,没有的就添加,某些数值可以后再调整,这是针对一个简单的运行 WordPress 的服务器的配置):

error_reporting = E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR
display_errors = Off
log_errors = On
max_execution_time = 300
memory_limit = 32M

2.5 安装 php-mysql

为了在 PHP 中使用 MySQL,还需要安装这个 php-mysql 包:

yum install php-mysql

3 安装和配置 phpMyAdmin

Remi 安装源上有最新的 PHP、MySQL 以及 phpMyAdmin 的 Yum 安装包,可以方便安装、更新。但是正在使用的 Linux 发行版 CentOS 7 上的软件包可能版本上要求不一样,所以使用 Yum 安装源优先级插件来进行控制。

3.1 安装使用 EPEL Repository

选择合适的源地址来安装,参考方法:安装使用 EPEL 安装源

到 EPEL 主页:

http://fedoraproject.org/wiki/EPEL#How_can_I_use_these_extra_packages.3F

找到 The newest version of ‘epel-release’ for EL7,点击打开新页面,复制 epel-release-7-5.noarch 的链接(数字可能有变化,当前版本是 7.5)。采用下面的方法直接安装:

yum install http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm

3.2 安装phpMyAdmin

yum install phpmyadmin

嗯,前面已经打好基础了,所以这里就是这么简单。

3.3 配置

phpMyAdmin 的默认安装目录是 /usr/share/phpMyAdmin,同时会在 Apache 的配置文件目录中自动创建虚拟主机配置文件 /etc/httpd/conf.d/phpMyAdmin.conf (区分大小写)。

同样的,先备份配置文件以防修改出现错误,

cp /etc/httpd/conf.d/phpMyAdmin.conf ~/confbak/httpd/conf.d/phpMyAdmin.conf.bak

然后修改配置文件(/etc/httpd/conf.d/phpMyAdmin.conf)中有设置:

#Alias /phpMyAdmin /usr/share/phpMyAdmin
#Alias /phpmyadmin /usr/share/phpMyAdmin

也就是说,我们可以通过绑定到 Apache 服务器上的任何域名访问 phpMyDdmin。比如这里可以通过 cnzhx.net/phpmyadmin 或者 cnzhx.net/phpMyAdmin 访问。但是这样一来,phpMyAdmin 的内容就与网站内容混到一起了,感觉 phpMyAdmin 成了网站的一个目录。但实际上我们并不希望别人也去访问这个页面。所以我们使用习惯的地址加端口 2082(而不是默认的 80 端口,换成自己喜欢的端口就行,再比如 3344)的方式,即 IP:port/phpMyAdmin 的链接形式访问 phpMyAdmin,加 # 注释掉上面的 Apache Alias 规则(在上面每一行 Alias 前面加上 # 号,上面已经给加上 # 号了),并将

<Directory /usr/share/phpMyAdmin/>
.........
</Directory>

里面的

Require ip 127.0.0.1
Require ip ::1

改成

Require all granted

保存退出,使之可以从任何地方都可以访问。如果本地电脑是固定 IP 的,为了安全,也可以将上面的 Require all granted 改成 Require ip <your-local-ip>。咱的 ADSL 就享受不到这样的待遇了。

因为在前面创建虚拟主机配置文件 /etc/httpd/conf.d/vhost.conf 的时候已经为 phpMyAdmin 配置了一个端口为 2082 的虚拟主机,只能通过该虚拟主机(端口)访问 phpMyAdmin。因为 /srv/www/phpmyadmin/public_html 配置为 phpMyAdmin 的虚拟主机目录,为该目录创建符号连接到 phpMyAdmin 安装目录(/usr/share/phpMyAdmin):

ln -sf /usr/share/phpMyAdmin /srv/www/phpmyadmin/html

备份然后修改 phpMyAdmin 的配置文件,

cp /etc/phpMyAdmin/config.inc.php ~/confbak/config.inc.php.bak
vi /etc/phpMyAdmin/config.inc.php

找到其中的如下代码段:

$cfg['blowfish_secret'] = '这里随便填上一串乱七八糟的字符即可,字母、数字等,长度最好大于 16 个';

按照上面的提示填写 blowfish_secret 字符串。其他的不用修改,保存并退出。

3.4 重起 Apache 使配置生效

systemctl restart httpd

现在就可以通过 ip:port/phpMyAdmin (将 IP 换为 VPS 的 IP,端口为前面 2.1 中设置的 phpmyadmin 的虚拟主机端口,注意大小写)访问 phpMyAdmin 了。

使用前面创建的用户名和密码(2.3.4 中 grant 语句中包含的用户名和密码)登录 phpMyAdmin。

然后还可以按照自己的使用习惯对 phpMyAdmin 的行为进行配置,请参考我写的另一篇文章:个性化配置 phpMyAdmin

4 创建一个新帐户以访问网站文件

因为按照本文的安装方法,Apache(httpd 进程) 的运行用户为 apache,不做改动的话,WordPress 的运行用户也就是 apache 了。访问服务器的时候虽然可以用 root,但是安全起见,最好禁止 root 用户远程登陆服务器,而 http 服务的用户 apache 又不能用来登录并管理服务器,所以这里新建一个普通用户用于远程管理网站文件,而管理服务器的时候可以通过这个用户登录后 su root 来执行。

4.1 增加新用户

useradd username

这里只是举例,使用 username 做为用户名,下同。Linux 中的用户相关操作可以参考这篇文章,有关于 useradd、passwd 等指令的介绍。

4.2 为新用户设置密码

passwd username

4.3 修改 /srv/www/ 的子目录和文件的属主和组为新用户(username)及其组(username)

chown username:username /srv/www/* -R

-R 表示递归操作所有子文件夹。

4.4 上传网站文件

使用新创建的用户,通过 FileZilla(或其它 sftp 软件,使用 SFTP – SSH File Transfer Protocal 协议连接)登录服务器(当然,能修改(上传)的目录和文件是由 SSH 登录的用户的权限决定的),将网站文件上传到前面设置虚拟服务器时设定的文件夹,这里:

  • cnzhx.net 的文件位于 /srv/www/cnzhx.net/html 目录下;
  • test.cnzhx.net 的文件位于 /srv/www/test.cnzhx.net/html 目录下。

4.5 文件及文件夹权限设置

使用 WordPress 的时候需要上传附件、更新插件或者 WordPress 本身等操作,这些操作需要对特定的某些文件、目录有写入权限。有 2 个解决方案:

  1. 方法 1:这种方法可以在 WordPress 后台执行一切更新插件或 WordPress 本身的操作、可上传附件、方便使用 WPSC 等缓存插件,等等等等。这就要求赋予 apache 用户比较大的权限,即,让 apache 用户成为这些目录和文件的所有者。直接将该网站文件夹的所有者和组都改成 apache,但是将新建的管理用户 usename 增加到 apache 组并使该组有 2775 的权限(也许可以是 2770),即,所有文件和文件夹以及新建的文件夹和文件都对用户 apache 和组 apache 完全可读可写可执行。顺次输入命令,
    cd /srv/www/cnzhx.net/
    chown apache:apache html -R
    chmod 2775 html -R 
    usermod -a -G apache username

    最后一行指令将用户 username 添加到 apache 组中。这样做的目的是,username 这个用户也可以拥有对网站的文件目录的完全操作权限,方便使用 ftp 软件维护网站源文件。
    重起 Apache 服务(service httpd restart)使之生效。

  2. 方法 2:保守一点的方案是,仅保证 WordPress 后台可以上传附件,使用 WPSC 等缓存插件,而更新插件和 WordPress 的操作通过 ftp 上传更新文件的方式来进行:仅仅修改受影响的一部分文件夹的所属组属性即可,其它仍保留其所有者为 username。
    一般需要让 WordPress 本身可写入和修改文件的文件夹只有 uploads。进入 WordPress 安装目录的 wp-content 目录中:

    cd /srv/www/cnzhx.net/public_html/wp-content/

    首先为了保证上传附件功能,修改 uploads 文件夹以及其子文件夹和文件的属性(属主改为 apache,组不变:

    chown apache:apache uploads -R
    chmod 2755 uploads

    其次,如果是 WordPress 多站点模式,还需要按照同样的方法修改 /wp-content/blogs.dir 目录属性。为了使 WPSC 可创建缓存文件,在 wp-content 目录下新建文件夹 cache,并同样修改属性。不过,如果要安装 WPSC,还是需要按照其提示做一些操作的。

    最后将 username 添加到 apache 组中:

    usermod -a -G apache username

    (参考 Linux 中将用户添加到组的指令。)

5 优化及安全

安装完服务器,进行了基本的配置之后,下一步就该考虑安全和优化问题了。进行基本的安全设置非常有必要,这样可以避免被人“无意”中入侵。

请分别参考下列系列文章:

6 更新说明

如果有更新,个别地方的更新说明就放在原地,较大范围的更新说明放在这里。

2016.03.02

更新了很多描述语言使之更符合新手的阅读习惯;修正几处指令执行顺序以方便理解;修正 phpMyAdmin(主机 3)的配置文件。

7 FAQ

7.1 访问虚拟主机一直显示 testing 1 2 3 页面(如前面的图示)

如果检查配置都没问题的话,可能是因为没有禁用 SELinux 并立即生效(文中要求过),或者是没有正确配置 SELinux。

8 参考资料

  1. 水景一页: Linode VPS 上 CentOS 6 安装 LAMP + phpMyAdmin 记录
  2. Apache: Upgrading to 2.4 from 2.2
  3. Linode: Updating Virtual Host Settings from Apache 2.2 to Apache 2.4
  4. Tecmint: Installing LAMP (Linux, Apache, MariaDB, PHP/PhpMyAdmin) in RHEL/CentOS 7.0
  5. cyberciti: CentOS and RHEL 7: Install Linux, Apache, MariaDB, PHP (LAMP) Stack

如果各位网友有什么好的建议,欢迎留言讨论。©

本文发表于水景一页。永久链接:<https://cnzhx.net/blog/centos-rhel-install-lamp-phpmyadmin/>。转载请保留此信息及相应链接。

45 条关于 “CentOS 7 / RHEL 7 上安装 LAMP + phpMyAdmin” 的评论

  1. Hi 博主,刚好在你这篇文章出来的前面两个星期,我在我的新买的linode上安装的7,然后照着你的http://cnzhx.net/blog/vps-centos-6-lamp-phpmyadmin/ 这篇6的教程一直折腾无果,然后一点点啃英文~~~
    要是你这个能早点出来就好了~~
    我今晚果断把之前的7删除了装了个6.5,结果发现你除了这个7~LOL
    不过还是很有用。谢谢。趁现在刚学习,几个系统多实践一下。

    这里游两篇我觉得实用的文章

    https://www.digitalocean.com/community/tutorials/how-to-install-linux-apache-mysql-php-lamp-stack-on-centos-7

    http://www.howtoforge.com/apache_php_mysql_on_centos_7_lamp

    然后我有两个问题:
    1. 我照着上面两篇文章操作,可以正常运行LAMP,但是重启之后竟然无法ssh进去我的linode,我试过两次,都是同样的问题,只能rebuild,重装系统。找客服,对方给我诊断竟然是GFW的问题,然后我再重装一次,同样的ip还是可以ssh进去,无解。

    2.如何配置DNS并在godaddy绑定?可能有点小白问题啊,呵呵,希望不吝赐教。或者哪里有中文教程否?

    谢谢你!

    • 写这个是因为上周有朋友留言说想要个CentOS 7的教程啊。我自己现在太忙,没多少时间折腾。谢谢你推荐的文章,回头我看看把有用的东西挑出来 :D
      回到你的问题,
      1. 遇到无法SSH进去的时候可以通过 Linode Manager 里面的 Remote Access 下面的 Console Access 中的方法登录;可能是你自己的 Linode 里面的防火墙限制了你的登录,通常是因为端口没有开放,或者自动屏蔽之类的代码,通过临时关闭防火墙可以检测出来问题。
      2. Linode 自己提供了 DNS Manager,但是其 DNS 服务器的 IP 前些天被屏蔽了,最好不要用;可以直接用 Godaddy 自己的,只是它也被屏蔽得挺严重的。具体设置请参考 Linode Docs。如果有问题可以跟我说,周末的时候我写一下。关键是创建一条 A 记录,输入你的域名和对应的 IP 地址即可,这就是所谓的绑定了。另外,AAAA 记录是 IPv6 的;MX 记录是邮件服务器的;CNAME 是别名,类似于转发给另一个域名。

      • 好,我先读一下,有问题再请教你。
        多谢。

  2. 终于找到问题所在了!
    我在弄多域名的时候,所有域名都跳转到第一个文件夹,原来是因为做了域名DNS解析之后,自动解析到vps的ip上,然后ip默认访问第一个域名的配置,其实原因就在于博主你的vhost.conf配置文件里代码有错,如下这两行多加了个 /

    DocumentRoot /srv/www/cnzhx.net/html/

    要把最后的那个斜杠去掉!呼,为此折腾了一个周末两天的时间啊……

    • 谢谢你的修正,很抱歉给你造成困扰了 :)
      这个地方我确实没有注意。也许我就是这么设置的,但是没有遇到问题。回头我再检查一下。
      再次感谢!

  3. 引用通告: Linode VPS 上 CentOS 6 安装 LAMP + phpMyAdmin 记录 | 水景一页

  4. Hi 博主,
    关于更新wordpress,我按照你的教程第4.5的第一种方法设置,可以正常更新插件和主题,但是更新wordpress本身的时候还是提示要输入FTP地址账号密码等,这个怎么弄呢?

    • 本地虚拟机是按照此文安装配置的,Apache 采用的是 prefork 方式。
      我特地在本地虚拟机里新安装了wp3.9然后升级到4.0,没有遇到问题的。甚至安装WP的时候可以直接写入 wp-config.php 文件。当然这样子感觉不是太安全。权限应该尽可能给得小。
      你再检查一下吧,本质上就是权限的问题。

  5. 引用通告: Linode VPS 上 CentOS 7 中改 LAMP 执行方式为 PHP-FPM | 水景一页

  6. 按照楼主的方法配置 总是无法启动 Apache 提示
    httpd: Syntax error on line 353 of /etc/httpd/conf/httpd.conf:
    第 353行: IncludeOptional conf.d/*.conf
    将这行注释掉 Apache 就可以启动 这行注释掉是不是我们配置的vhost.conf 无效了 求解?

        • 如果错误提示还是一样的话,可以将 IncludeOptional 换成 Include 再观察。
          另外,可以看一下 /var/log/httpd 下的错误记录。

          • 感谢你的回答 更改成Include 另外 在http.conf
            里已经设置监听80端口了 在vhost.conf 里就不要再指定Listen 80 会报:
            Address already in use: AH00072: make_sock: could not bind to address [::]:80
            我这里是这样的

            • 是的,所以文中的并没有 Listen 80,而只是 Listen 2082 来另开个端口给 phpMyAdmin。
              另外奇怪的是,如果 Include 没问题,IncludeOptional 不应该有问题的,除非你的 Apache 版本低于 2.3.6。你可以 httpd -v 查看一下。难道你不是在 CentOS 7 中安装的吗?

  7. 我在Centos7上安装了Apache,Mariadb,PHP,PhpMyAdmin,打开PhpMyAdmin网页时报:
    You don’t have permission to access /phpMyAdmin/ on this server
    这是什么原因啊!

    • 本文中 phpMyAdmin 安装那一节里提到要改 Require all granted 的。你检查看看有没弄错。

      • 还真没注意这个,我加了这句就可以了,牛人啊!

      • 庆幸自己遇到这篇好文档。
        我也是遇到phpMyAdmin 403禁止访问。
        我已经正确添加了Require all granted

        现在的问题是,不注释别名#Alias的话,可以域名/phpMyAdmin打开页面。
        注释掉别名,用域名:端口/phpMyAdmin访问就403禁止访问。

        所以这样看不是Require all granted的原因了吧?
        请问还可以排查哪里?谢谢。

        • 还可以看看:
          1. phpMyAdmin 的目录是否在/或者连结到了 Apache 服务器的的目录里,比如文中的 ln -s 以及其是否正确。
          2. 如果是 symlink,还要看是否目录里配置了 Options FollowSymLinks
          暂时只能想到这么多了,快一年没时间理这个服务器了,都忘记了 :D

          • 谢谢回复,ln连接应该是没错。
            我测试了一下在phpmyadmin的html目录里放入info.php,尝试打开结果也是403。
            访问“网址:端口/任意不存在文件名”,结果也是403。
            应该是虚拟主机权限的问题。

            更改端口、重新建立目录都不能解决,真苦闷:-(

  8. 你写得很好!谢谢!我之前webmin安装,出现很多问题!

  9. 楼主的文章太棒了,兄台还有个不情之请,能否介绍下Nginx如何代替Apache实现?谢谢!

  10. 你好请问,为什么我打开phpmyadmin的时候会提示403错误呢

    • 请先看看在你前面的那几条关于这个问题的评论对你解决问题是否有帮助。
      403应该是服务器端配置造成的错误。必要的时候检查一下服务器的日志文件看看是否有有用的提示信息。

  11. 请教:4.1中说的增加用户,使用ftp软件登录时,可以访问到root用户权限范围内的所有文件啊。我以为是只能访问 /srv/www/下网站的根目录而已。是我弄错还是?

    • 新增加用户的目的就是为了与 root 用户区分开。不管你用什么账户登录,都只能访问该用户有访问权限的目录和文件。这个新增加的账户当然不可能访问 root 的所有文件的。
      如果只希望这个用户能访问 /srv/www/ 下的目录和文件,你需要将这个目录开放给它,而其它不希望它访问的目录则禁止它的访问。但是属于这个用户(Auser) 的用户目录(比如 /home/Auser )总不能也不让它访问吧 :D

  12. 引用通告: 一个 phpMyAdmin 相关的 500 错误 | 水景一页

  13. 引用通告: 配置 phpMyAdmin | 水景一页

  14. 引用通告: 使用 ACL 控制网页服务器文件访问权限 | 水景一页

  15. 引用通告: 配置 SSH 服务以使用证书登录 Linux 服务器 | 水景一页

  16. 太棒了!
    CentOS 用户可以直接通过 yum install epel-release 安装并启用 EPEL 源。CentOS Extras 默认包含该包。

  17. 请问如何设置多用户既能shell登陆,又能读写目录和文件,还能用这个用户sftp上传的html文件能直接访问,不用root账户去修改文件权限?谢谢!

    • 因为我没考虑多用户的问题,所以没法给你很明确的方法。不过你可以参考第四部分内容,自己试试看。思路是一样的。不管是多用户同目录还是多用户各自的目录,方法类似。因为只要有用户名和密码,并且该用户被允许 SSH 登录就可以 shell 登录。关于 SSH 配置可以参考我这里关于 SSH 的文章。默认情况下 SSH 系统对所有用户是一样的策略。
      另外,如果希望不需要 root 来配置目录的访问权限,可以考虑将该用户的 HTML 目录放在该用户的用户个人目录中。不过这个只是我个人的想法,没有钻研过。

  18. 我按照教程 设置的,现在 出现了 下面这样的错误,
    《Job for httpd.service failed because the control process exited with error code. See “systemctl status httpd.service” and “journalctl -xe” for details.》
    不知道哪里的问题呀。另外
    输出类似于,
    ln -s ‘/usr/lib/systemd/system/httpd.service’ ‘/etc/systemd/system/multi-user.target.wants/httpd.service’

    然后启动 Apache 服务,
    systemctl start httpd

    操作到这部 出现的 上面的错误。

    • 你需要根据提示运行 “systemctl status httpd.service” 或者 “journalctl -xe”(不带引号)看看具体的错误是什么。

  19. 引用通告: 我的 VPS 学习之路 | 水景一页

  20. 引用通告: 如何搭建lamp(CentOS7+Apache+MySQL+PHP)环境 | witchy

时间过去太久,评论已关闭。
如果您有话要说,请到讨论区留言并给出此文章链接。
谢谢您的理解 :-)