Fedora虚拟环境搭建php+mysql+nginx

一、搭建Fedora虚拟机

1. VMware安装可以参考博客

2. 前往fedora官网下载安装镜像。

3. 下载ISO镜像用于VMware虚拟机的安装。

4. 打开VMware虚拟机,新建新的虚拟机。

5. 默认选择典型的配置。

6. 选择下载好的Fedora的安装光盘ISO文件

7. 设置虚拟机的磁盘容量(根据个人磁盘大小设置)

8. 完成虚拟机新建(根据个人自定义硬件)

9. 安装Fedora系统

10. 选择语言

11. 系统设置,这里如果出现警告图标,表示没有设置成功,可以点击进去进行调整。

12. 点击“开始安装”之后,会进入该界面,可以设置账户的信息。

13. 设置成功之后,如图所示

14. 安装完成。

15. 更新系统,打开终端切换到root权限,输入dnf update && dnf upgrade。

dnf的用法可以参考博客


二、PHP+nginx+mysql环境搭建

1、搭建mysql环境

1.1、前往官网下载系统对应的MySQL Community Server安装包

1.2、 解压mysql-5.7.27-1.fc30.x86_64.rpm-bundle.tar

1
tar -xvf mysql-5.7.27-1.fc30.x86_64.rpm-bundle.tar

1.3、安装mysql,安装顺序如下:

1
2
3
4
dnf install mysql-community-common-5.7.27-1.fc30.x86_64.rpm 
dnf install mysql-community-libs-5.7.27-1.fc30.x86_64.rpm
dnf install mysql-community-client-5.7.27-1.fc30.x86_64.rpm
dnf install mysql-community-server-5.7.27-1.fc30.x86_64.rpm

1.4、 初始化数据库

1
mysqld --initialize --user=mysql --basedir=/usr/mysql --datadir=/usr/mysql/data

1.5、启动数据库

1
systemctl start mysqld.service

1.6、查找初始密码

1
grep 'temporary password' /var/log/mysqld.log

1.7、修改root密码

1
2
ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';
flush privileges;

2、搭建nginx环境

2.1、 利用dnf安装nginx。

1
dnf install nginx

2.2、安装完nginx后启动nginx的服务。

1
2
systemctl start nginx
systemctl enable nginx

输入127.0.0.1弹出窗口安装成功。

2.3、修改/etc/nginx/default.d/php.conf文件,配置nginx解析php(未配置会出现无法解析PHP,运行php文件会弹出下载文件窗口),然后重启nginx。

3、搭建php环境

3.1、切换到root环境下利用dnf 安装PHP

1
2
dnf install php
dnf install php-mysqlnd

3.2、配置/etc/php-fpm.d/www.conf ,查找修改listen = /run/php-fpm/www.sock为listen =127.0.0.1:9000(指定php-fpm监听本地的9000端口)

3.3、指定php-fpm的运行用户为nginx,配置/etc/php-fpm.d/www.conf 参数user = nginx ,group=nginx 。

3.4、启动php-fpm

1
2
systemctl start php-fpm
systemctl enable php-fpm

4、数据库连接测试

4.1、连接数据库。

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$servername = "localhost";
$username = "root";
$password = "root";

$conn = new mysqli($servername,$username,$password);
if($conn){
echo "连接成功";
}
if($conn -> connect_errno){
die("连接失败:".$conn -> connect_error);
}
?>

4.2、创建数据库

1
2
3
4
5
6
7
8
9
10
11
<?php
require "dbconfig.php";

$sql = "CREATE DATABASE myTestDB";
if($conn -> query($sql) ===true){
echo "数据库创建成功";
}else{
echo "数据库创建失败".$conn ->error;
}
$conn -> close();
?>

1564733035538

4.3、创建表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
require "dbconfig.php";
$db ="myTestDB";

$conn = new mysqli($servername, $username, $password, $db);
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}

$sql = "CREATE TABLE MyTestTables (
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
firstname VARCHAR(30) NOT NULL,
lastname VARCHAR(30) NOT NULL,
email VARCHAR(50),
reg_date TIMESTAMP
)";

if ($conn->query($sql) === TRUE) {
echo "测试表创建成功";
} else {
echo "创建数据表错误: " . $conn->error;
}

$conn->close();
?>

4.4、插入数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
require "dbconfig.php";
$db ="myTestDB";

$conn = new mysqli($servername, $username, $password, $db);
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
$sql = "INSERT INTO MyTestTables (firstname, lastname, email)
VALUES ('test1', 'test1', 'test1@example.com');";
$sql .= "INSERT INTO MyTestTables (firstname, lastname, email)
VALUES ('test2', 'test2', 'test2@example.com');";
$sql .= "INSERT INTO MyTestTables (firstname, lastname, email)
VALUES ('test3', 'test3', 'test3@example.com')";

if ($conn->multi_query($sql) === TRUE) {
echo "新记录插入成功";
} else {
echo "Error: " . $sql . "<br>" . $conn->error;
}

$conn->close();

4.5、查询插入数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
require "dbconfig.php";
$db ="myTestDB";

$conn = new mysqli($servername, $username, $password, $db);
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}

$sql = "SELECT id, firstname, lastname FROM MyTestTables";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
// 输出数据
while($row = $result->fetch_assoc()) {
echo "id: " . $row["id"]. " - Name: " . $row["firstname"]. " " . $row["lastname"]. "<br>";
}
} else {
echo "0 结果";
}
$conn->close();
?>

4.6、删除某条数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
require "dbconfig.php";
$db ="myTestDB";

$conn = new mysqli($servername, $username, $password, $db);
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}

$result=mysqli_query($conn,"DELETE FROM MyTestTables WHERE LastName='test1'");
if($result){
echo "删除test1成功";
}

mysqli_close($conn);
?>

三、安全加固思考

1、主机加固

1.1、限制远程访问地址,配置hosts.allow和hosts.deny。

1
2
3
4
5
6
vim /etc/hosts.deny   //配置hosts.deny
sshd:all //配置内容,限制拒绝所有的ssh远程连接

---------------------------------------
vim /etc/hosts.allow //配置hosts.allow
sshd:192.168.3.10 //配置内容,设置允许远程的IP

1.2、设置登录口令策略

1
2
3
4
5
6
7
8
9
10
vim /etc/login.defs
PASS_MAX_DAYS 90(可选) #密码最长使用天数90天
PASS_MIN_DAYS 1 #密码最短使用天数
PASS_WARN_AGE 28 #密码到期提前提醒天数
PASS_MIN_LEN 8 #密码最小长度为8

vim /etc/pam.d/system-auth
auth required pam_tally2.so onerr=fail deny=5 unlock_time=180

password requisite pam_cracklib.so retry=5 difok=3 minlen=8 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1

1.3、设置主机超时时间

1
2
3
vim /etc/profile

export TMOUT=600 //设置系统远程超时时间为600秒

1.4、限制远程root用户登录

1
2
vi /etc/ssh/sshd_config
找到并修改PermitRootLogin为no

这些密码策略在一定程度上防止了ssh远程登录爆破,远程登录限制防止账号密码泄露后权限过大远程造成的破坏。

2、mysql加固

2.1、更改数据库root弱口令

1
2
3
4
5
mysql> use mysql; 
mysql> update user set password=password('Wayxz@2019_’) where user='root'; //修改root用户口令,删除空口令;
mysql> update user set user="wayxz" where user="root"; //改变默认mysql管理员帐号;
mysql> update user set host =’localhost’ where user = "newroot"; //禁止管理员帐号远程登录
mysql> flush privileges;

2.2、收回File,Grant,Reload,Shutdown,Process等权限;

1
2
mysql>revoke file,grant,reload,shutdown,process from user;
mysql> flush privileges;

2.3、在mysqld配置文件中修改默认的port:3306 为port:33060

2.4、采用mysql权限运行mysql数据库

1
2
3
#vim /etc/my.cnf
[mysqld]
user=mysql

2.5、限制连接用户的数量

1
2
3
#vim /etc/my.cnf
[mysqld]
max_user_connections= 2

这些策略在一定程度上防止了数据库端口扫描,弱口令引起的安全漏洞,防止权限过大导致的安全隐患。

3、php环境加固

3.1、启用 PHP 的安全模式

修改 php.ini 配置文件启用 PHP 安全模式:
safe_mode = on //对文件操作函数进行权限控制,同时不允许对某些关键文件进行修改(例如 /etc/passwd)

safe_mode_gid = off //如果不进行该设置,可能无法对服务器网站目录下的文件进行操作。

open_basedir = /usr/share/nginx/www //使用open_basedir选项能够控制 PHP 脚本只能访问指定的目录,这样能够避免 PHP 脚本访问不应该访问的文件

expose_php = off //关闭 PHP 版本信息在 HTTP 头中的泄露

magic_quotes_gpc = on //PHP 将自动把用户提交对 SQL 查询的请求进行转换(例如,把 ’ 转换为 \’ 等)

启用php自身的安全模式能避免网站执行一些类似eval 危险的函数,避免了非法文件读取操作,避免小部分的数据库注入。

4、nginx加固

4.1、给网站根目录搞了一个只读的挂载点。这里网站根目录为/user/share/nginx/html

1
2
3
mkdir -p /data
mount --bind /data /user/share/nginx/html
mount -o remount,ro --bind /data /user/share/nginx/html

网站内容实际位于/data,网站内容更新就往/data里更新,目录/user/share/nginx/html无法执行任何写操作,否则会报错“Read-only file system”,极大程度上可以防止提权篡改。

Author: wayxz
Link: https://wayxz.github.io/2019/08/05/Fedora虚拟环境搭建php-mysql-nginx/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.