前言
LNMP 是 Linux + Nginx + Mysql + PHP 的简称,因其轻量、高效、全开源等特点,被广大博主所喜爱,也是使用人数最多的博客系统 WordPress 所使用的技术栈。
最常见的 LNMP 环境搭建是使用 LNMP一键包,因为一键包为了通用性选择的是源码编译的方式安装,有很多缺点,比如安装效率低,在单核 VPS 上动辄一两小时的编译安装时间,并且想升级其中的任意一些工具组件都需要重新编译。但是一键包也简化了好多背后步骤,大大降低了使用者的门槛,适合不折腾,Linux、编程功底不深的朋友。
本文的目的就是介绍一下如何从零开始使用源搭建一个 LNMP 环境,这里我们不使用LNMP的一键安装包,而是难度稍微高一点的逐个安装,这样做或许能让你对这个环境的细节有更好的理解,而且对各部分的定制程度可以达到最高,并且可以在日后更自由方便的切换其中的一部分。
安装 Nginx
因 Nginx 官方更新频繁,Ubuntu 默认源又更新慢,所以我们选择使用使用 Ondřej Surý 的 PPA 来安装最新稳定的 Nginx 版本。
首先我们要增加使用 PPA 所必要的组件
sudo apt install -y software-properties-common
然后添加 PPA:
sudo add-apt-repository ppa:ondrej/nginx-mainline
sudo apt update
然后我们安装一些相关必要组件
sudo apt install -y curl vim wget unzip apt-transport-https lsb-release ca-certificates
最后安装 Nginx
sudo apt install -y nginx-extras
这里我们选择 nginx-extras 而不选择原版 nginx 的原因是 nginx-extras 会附带一些比较实用的模块,比如自动生成目录的 autoindex ;使用 lua 脚本扩展 nginx 的 lua-nginx 等。
安装完毕后,在浏览器直接输入 IP 就可以看到最经典的 nginx 欢迎页了。
安装 PHP
这里也是一样,程序员属性作祟,不用最新版浑身难受,我们选择安装 PHP7.2 版本。当然也强烈建议大家早点儿加入 PHP7 的怀抱,我们可以看到在最主流的几款 PHP 工具中,PHP7 相比较 PHP5.6,性能都提升十分明显。
同样,因为 Ubuntu 官方更新速度慢,我们仍然选择 Ondřej Surý 的 PPA:
sudo add-apt-repository ppa:ondrej/php
sudo apt-get update
之后安装一些常见的 PHP 组建以及 php7.2-fpm , 如果是 WordPress ,那么下面的 PHP 包足够满足大部分你需求:
apt install -y php7.2-fpm php7.2-mysql php7.2-curl php7.2-gd php7.2-mbstring php7.2-xml php7.2-xmlrpc php7.2-zip php7.2-opcache
然后重启一下 php7.2-fpm
systemctl restart php7.2-fpm
然后更新 Nginx 配置信息,这里我们假设以域名example.com
举例子
在 /etc/nginx/conf.d/
目录下新增一个名为 example.conf
的配置,然后把以下信息填入
server {
listen 80;
listen [::]:80;
root /var/www/example.com;
index index.php index.html index.htm;
server_name example.com;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.2-fpm.sock;
}
}
记得需要将其中的 example.com
修改为你的域名,然后我们在网站根目录 /var/www/example.com
下新增一个 phpinfo.php
文件,内容如下:
<?php phpinfo(); ?>
最后重启一下 Nginx
sudo nginx -t && sudo service nginx restart
打开浏览器输入 http://example.com/phpinfo.php
如果看到经典的 phpinfo 页面说明安装成功。
安装 Mysql
数据库我们选择稳定为主,所以就不激进的选择最新版了,我们直接使用 Ubuntu 官方源安装
sudo apt install -y mysql-server
然后我们执行一次安全设置
sudo mysql_secure_installation
简要来说,有这么几项
//请输入 y 进行初始安全设置
Press y|Y for Yes, any other key for No:y
There are three levels of password validation policy:
LOW Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary file
//选择强密码
Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 2
......
//是否修改 root 密码,这里我们可以顺便设置上自己的 root 密码
Change the password for root ? ((Press y|Y for Yes, any other key for No) : y
......
//确定密码
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y
......
//删除匿名用户,好像没用,删掉
Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
......
//是否关闭 root 的远程登录权限,这里我选择 yes,视个人情况而定
Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
......
//移除 test 数据库
Remove test database and access to it? (Press y|Y for Yes, any other key for No) :y
......
//重置数据库权限
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
完毕之后我们就可以直接登录数据库
sudo mysql -u root -p
输入密码登陆后,创建一个名为 example 的数据库
CREATE DATABASE example DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
之所以编码选择 utf8mb4
而不选择 utf-8
是为了支持 emoji 表情。
接着我们创建一个叫做 example_user 的用户并赋予 example_database 数据库权限
GRANT ALL ON example.* TO 'example_user'@'localhost' IDENTIFIED BY '这里填写 example_user 的Mysql密码';
然后刷新权限
FLUSH PRIVILEGES;
最后退出 Mysql
exit;
我们最后测试一下数据库,在 var/www/example.com
目录下新增一个 mysql-test.php
<?php
\$dbname = 'example'; //MySQL 数据库名
\$dbuser = 'example_user'; //MySQL 用户名
\$dbpass = 'example_user的密码'; //Mysql 用户密码
\$dbhost = 'localhost';
\$link = mysqli_connect(\$dbhost, \$dbuser, \$dbpass) or die("Unable to Connect to '\$dbhost'");
mysqli_select_db(\$link, \$dbname) or die("Could not open the db '\$dbname'");
\$test_query = "SHOW TABLES FROM \$dbname";
\$result = mysqli_query(\$link, \$test_query);
\$tblCnt = 0;
while(\$tbl = mysqli_fetch_array(\$result)) {
\$tblCnt++;
#echo \$tbl[0]."<br />\n";
}
if (!\$tblCnt) {
echo "MySQL is working fine. There are no tables.";
} else {
echo "MySQL is working fine. There are \$tblCnt tables.";
}
?>
创建完毕后访问 http://example.com/mysql-test.php
如果出现 "MySQL is working fine. There are no tables." 则说明 MySQL 工作正常,LNMP 环境搭建完毕。
服务器还是喜欢 CentOS 多一些!