LAMPLNMP 最佳实践
LAMP/LNMP 最佳实践
LAMP/LNMP 组件
LAMP:Linux+Apache+Mysql/Mariadb+PHP/Python/Perl。
LNMP:Linux+Nginx+Mysql/Mariadb+PHP/Python/Perl。
- Linux:操作系统,提供程序运行基础。
- Apache/Nginx:Web 服务器,提供网页访问。
- Mysql/Mariadb:数据库,提供数据管理。
- PHP/Python/Perl:脚本语言,提供动态执行生成。
LAMP/LNMP 工作原理
-
客户端通过HTTP协议请求web服务器资源
-
web 服务器根据资源类型进行处理:
-
静态资源:web直接把资源返回至客户端。
-
动态资源:通过指定的通讯方式将脚本网页交给后端程序执行。如果运算期间需要连接mysql数据库,则通过mysql连接器连接mysql。后端程序将运算结果返回给web服务。
-
-
web服务将结果返回给客户端。
可以把整个流程想象成一家餐厅的工作场景,这样就好理解啦:
角色对应
- 客户端浏览器:就是来餐厅吃饭的顾客,想点餐、获取美食 。
- Web 服务器:是餐厅里负责接待、传递需求的服务员,统筹处理顾客的各种要求 。
- 静态资源:像餐厅里提前备好的凉菜、小食,不用现做,直接就能端给顾客 。
- Php、perl、python:是后厨里负责做复杂菜品(动态内容)的厨师团队,能根据需求做出多样美味 。
- mysql:是餐厅的食材仓库,存储着各种做菜用的原材料 。
- http 协议:顾客和服务员交流用的 “点餐语言”,清晰说清想要啥 。
- CGI/Fast CGI:服务员和厨师沟通的 “传菜通道”,把顾客对复杂菜品的需求准确传给厨师 。
- php_mysql 驱动:厨师从食材仓库取原料用的 “工具”,方便快捷拿到做菜所需食材 。
工作流程
- 要静态资源时:顾客(客户端浏览器)用 “点餐语言”(http 协议)跟服务员(Web 服务器)说:“我要份现成的凉拌菜(静态资源)” 。服务员直接去凉菜区(静态资源)端来,通过 http 协议把菜给顾客,顾客就能享用啦。
- 要动态资源时:顾客说:“我要一份现做的特色炒菜(动态资源)” 。服务员(Web 服务器)接到需求,通过 “传菜通道”(CGI/Fast CGI)把做菜要求传给厨师团队(Php、perl、python)。厨师们需要从食材仓库(mysql)取原料,就用 “取料工具”(php_mysql 驱动)去仓库拿,然后精心做出特色菜(处理动态内容),做好后再通过服务员(Web 服务器),用 http 协议把菜给顾客,顾客就能吃到现做的美味咯。
整个 LAMP/LNMP 的工作流程,就像这样一家餐厅里,不同角色配合满足顾客(用户)需求,完成 “请求 - 处理 - 响应” 的过程,这样是不是就生动好懂多啦,就像在餐厅里走了一遍点餐、做菜、上菜的流程!
部署 Mysql 服务
部署软件
[root@server ~ 14:02:58]# yum install -y mariadb-server[root@server ~ 14:04:29]# systemctl enable --now mariadb[root@server ~ 14:05:54]# mysql_secure_installation
准备数据库
[root@server ~ 14:06:35]# mysql -uroot -p123
mysql> CREATE DATABASE wordpress;
mysql> CREATE USER wp@'%' identified by '123';
mysql> GRANT ALL PRIVILEGES ON wordpress.* TO 'wp'@'%';
mysql> FLUSH PRIVILEGES;
mysql> exit
部署 Web 服务
不同类型 Web 服务器只需要部署一个。
部署 Apache
[root@server ~ ]# yum install -y httpd
[root@server ~ ]# echo 'ServerName blog.yy.cloud:80' >> /etc/httpd/conf/httpd.conf
[root@server ~ ]# echo 'Hello World !' > /var/www/html/index.html
[root@server ~ ]# systemctl enable httpd --now
部署 Nginx
[root@server ~ ]# yum install -y nginx
[root@server ~ ]# echo 'Hello World !' > /usr/share/nginx/html/index.html
[root@server ~ ]# systemctl enable nginx --now
部署 PHP 服务
部署 php 服务
[root@server ~ ]# yum install -y php php-fpm php-mysqlnd
[root@server ~ ]# systemctl enable php-fpm.service --now
[root@server ~ ]# systemctl restart httpd
准备 php 测试文件
# 准备 index.php
[root@server ~ ]# cat > index.php <<EOF
<?phpecho "<h1>Hello World !</h1>\n";
?>
EOF# 准备 test-mysql.php
[root@server ~ ]# cat > test-mysql.php <<'EOF'
<?php$link=mysqli_connect('10.1.8.20','wp','Laoma@123');if($link)echo "<h1>Connect Mysql Success !</h1>\n";elseecho "<h1>Connect Mysql Failed !</h1>\n";$link->close();
?>
EOF# 准备 info.php
[root@server ~ ]# cat > info.php <<EOF
<?phpphpinfo()
?>
EOF# Apache 服务器
[root@server ~ ]# cp *.php /var/www/html# Nginx 服务器
[root@server ~ ]# cp *.php /usr/share/nginx/html
php 程序测试
[root@server ~ ]# php -f index.php
<h1>Hello World !</h1>[root@server ~ ]# php -f test-mysql.php
<h1>Connect Mysql Success !</h1>
部署 wordpress 应用
下载wordpress,上传到家目录。
[root@server ~ 15:03:49]#unzip -o wordpress-4.9.4-zh_CN.zip
[root@server ~ 15:03:49]# cp -r wordpress /usr/share/nginx/html/
[root@server ~ 15:03:57]# chown -R nginx:nginx /usr/share/nginx/html/wordpress/[root@server ~ 15:05:03]# vim /etc/php-fpm.d/www.conf
user=nginx
group=nginx
[root@server ~ 15:07:28]# systemctl restart php-fpm
Standalone
以部署 wordpress 应用为例。
实验环境
主机名 | IP 地址 | 角色 |
---|---|---|
www.yy.cloud | 10.1.8.21 | apache |
php.yy.cloud | 10.1.8.22 | php |
mysql.yy.cloud | 10.1.8.23 | mysql |
nfs.yy.cloud | 10.1.8.24 | nfs |
nfs 服务器提供共享存储 web 应用文件。
部署 NFS 服务器
由于静态文件和动态文件没有分开,所以 Web 服务器和 PHP 服务器都要存一份。实验环境通过NFS共享提供wordpress应用。
下载 wordpress,上传到家目录。
[root@storage ~ 16:22:26]# mkdir -m 777 /www
[root@storage ~ 16:25:35]# echo '/www 10.1.8.0/24(rw)' > /etc/exports[root@storage ~ 16:26:14]# systemctl enable nfs-server.service --now
# 准备 wordpress资源
[root@storage ~ 16:29:43]#unzip -o wordpress-4.9.4-zh_CN.zip -d /www/
# 准备网页测试文件
[root@storage ~ 16:28:26]# echo 'hello world !' > /www/index.html
[root@storage ~ 16:29:00]# cat > /www/index.php << EOF
> ?php
> echo "<h1>Hello World !</h1>\n";
> ?>
> EOF
[root@storage ~ 16:29:43]# cat > /www/test-mysql.php << 'EOF'
> ?php
> $link=mysqli_connect('mysql.yy.cloud','wp','123');
> if($link)
> echo "<h1>Connect Mysql Success !</h1>\n";
> else
> echo "<h1>Connect Mysql Failed !</h1>\n";
> $link->close();
> ?>
> EOF
[root@storage ~ 16:30:43]# cat > /www/info.php << EOF
> ?php
> phpinfo();
> ?>
> EOF
部署 Mysql 服务器
[root@db ~ 16:33:08]#yum install -y mysql-server
[root@db ~ 16:33:23]# systemctl enable mariadb --now# 准备wordpress数据库和用户
[root@db ~ 16:34:31]# mysql_secure_installation
mysql> CREATE DATABASE wordpress;
mysql> CREATE USER yy@'%' identified by '123';
mysql> GRANT ALL PRIVILEGES ON wordpress.* TO 'yy'@'%';
mysql> FLUSH PRIVILEGES;
mysql> exit
部署 Web 服务器
不同类型 Web 服务器只需要部署一个。
部署 Nginx 服务
[root@www ~ 16:39:50]# yum install -y nginx
[root@www ~ 16:39:50]# systemctl enable nginx --now# 安装 nfs 工具(上述已完成)
[root@www ~ 16:39:50]# yum install -y nfs-utils
[root@www ~ 16:52:31]# echo 'storage.yy.cloud:/www /usr/share/nginx/html nfs defaults 0 0' >> /etc/fstab
[root@www ~ 16:52:49]# systemctl daemon-reload
[root@www ~ 16:53:45]# mount /usr/share/nginx/html/
[root@www ~ 16:55:26]# df
文件系统 1K-块 已用 可用 已用% 挂载点
devtmpfs 485772 0 485772 0% /dev
tmpfs 497820 0 497820 0% /dev/shm
tmpfs 497820 7820 490000 2% /run
tmpfs 497820 0 497820 0% /sys/fs/cgroup
/dev/mapper/centos-root 52403200 1656804 50746396 4% /
/dev/sda1 1038336 142224 896112 14% /boot
tmpfs 99564 0 99564 0% /run/user/0
storage.yy.cloud:/www 52403200 1690880 50712320 4% /usr/share/nginx/html
[root@www ~ 16:55:27]# ls /usr/share/nginx/html
index.html index.php info.php test-mysql.php wordpress
部署 PHP 服务器
部署 php 服务
[root@php ~ 17:00:37]#yum install -y php php-fpm php-mysqlnd
[root@php ~ 17:00:37]#vim /etc/php-fpm.d/www.conf
#使用;号注释掉原有listen行
;listen = 127.0.0.1:9000
# 新增listen 监听所有ip的9000端口
listen = 9000
# 支持监听特定ip的9000端口,例如listen = 10.1.8.22:9000# 使用;号注释掉原有 listen.allowed_clients 行
# 允许所有客户端访问
;listen.allowed_clients = 127.0.0.1
[root@php ~17:02:31]# systemctl enable php-fpm.service --now[root@php ~17:02:31]# useradd -u 997 -s /sbin/nologin nginx
挂载存储
[root@php ~ 17:02:31]# yum install -y nfs-utils
[root@php ~ 17:00:37]# echo 'storage.yy.cloud:/www /www nfs defaults 0 0' >> /etc/fstab
[root@php ~ 17:01:34]# mkdir /www
[root@php ~ 17:01:41]# mount /www
[root@php ~ 17:01:47]# df -h /www
文件系统 容量 已用 可用 已用% 挂载点
storage.yy.cloud:/www 50G 1.7G 49G 4% /www
[root@php ~ 17:01:52]# ls /www
index.html index.php info.php test-mysql.php wordpress
[root@php ~ 17:01:58]# php /www/index.php
?phpecho "<h1>Hello World !</h1>\n";
?>#php 程序测试
[root@php ~ 17:02:14]# php /www/test-mysql.php
?php$link=mysqli_connect('mysql.yy.cloud','wp','123');if($link)echo "<h1>Connect Mysql Success !</h1>\n";elseecho "<h1>Connect Mysql Failed !</h1>\n";$link->close();
?>
配置 Nginx 对接 PHP
[root@www ~ 17:03:34]# cat > /etc/nginx/conf.d/vhost-www.conf << 'EOF'
> server {
> listen 80;
> server_name www.yy.cloud;
> location / {
> root /usr/share/nginx/html;
> index index.html index.htm index.php;
> }
> location ~ \.php$ {
> fastcgi_pass php.yy.cloud:9000;
> fastcgi_index index.php;
> fastcgi_param SCRIPT_FILENAME /www/$fastcgi_script_name;
> include fastcgi_params;
> }
> }
> EOF
#重启服务
[root@www ~ 17:04:55]# systemctl restart nginx
配置存储权限
# 更改拥有者为nginx对应的uid
[root@storage ~ 17:12:08]# chown -R 997 /www
# php-fpm 进程默认以 apache 用户身份运行,修改运行用户为 nginx,并重启服务
[root@php ~ 17:02:31]# useradd -u 997 -s /sbin/nologin nginx
[root@php ~ 17:16:01]# vim /etc/php-fpm.d/www.conf
user=nginx
group=nginx
[root@php ~ 17:17:15]# systemctl restart php-fpm
start nginx
配置存储权限```bash
# 更改拥有者为nginx对应的uid
[root@storage ~ 17:12:08]# chown -R 997 /www
# php-fpm 进程默认以 apache 用户身份运行,修改运行用户为 nginx,并重启服务
[root@php ~ 17:02:31]# useradd -u 997 -s /sbin/nologin nginx
[root@php ~ 17:16:01]# vim /etc/php-fpm.d/www.conf
user=nginx
group=nginx
[root@php ~ 17:17:15]# systemctl restart php-fpm