项目实战2------
LAMP/LNMP 最佳实践
LAMP/LNMP 组件
LAMP :L inux+A pache+M ysql/M ariadb+P HP/P ython/Perl。
LNMP :L inux+N ginx+M ysql/M ariadb+P HP/P ython/Perl。
- Linux:操作系统,提供程序运行基础。
- A pache/Nginx:Web 服务器,提供网页访问。
- M ysql/Mariadb:数据库,提供数据管理。
- P HP/P ython/Perl:脚本语言,提供动态执行生成。
PHP FastCGI 进程管理器,是PHP的一个扩展模块,用于管理PHP 进程池的软件,用于接受web服务器的请求。PHP-FPM 全名 PHP FastCGI Process Manager,作为FastCGI进程管理器,与Web服务器(例如Nginx、Apache等)配合使用。
PHP-FPM的主要功能是管理和调度PHP脚本的执行。它通过创建和管理PHP进程池来处理PHP请求。每个PHP进程池中运行多个PHP-FPM进程,每个进程可以处理一个或多个PHP请求。PHP-FPM会根据配置的参数来管理这些进程的数量、生命周期和资源分配。
PHP-FPM提供了一些高级功能,例如进程池的动态调整、请求限制和超时控制、进程重生、日志记录等。它还支持基于Unix域套接字或TCP/IP套接字的进程间通信,以及基于文件和共享内存的进程管理。
LAMP/LNMP 工作原理

-
客户端通过HTTP协议请求web服务器资源
-
web 服务器根据资源类型进行处理:
-
静态资源:web直接把资源返回至客户端。
-
动态资源:通过指定的通讯方式将脚本网页交给后端程序执行。如果运算期间需要连接mysql数据库,则通过mysql连接器连接mysql。后端程序将运算结果返回给web服务。
-
-
web服务将结果返回给客户端。
PHP 与 WEB 协同工作模式
PHP 与 WEB 协同工作模式:
- CGI:Web 进程动态调用相应脚本解释器执行动态页面 ,执行完后再释放。特点:性能差。
- Modules:Web 进程动态加载相应模块执行动态页面 。特点:性能较好。
- FastCGI:后端进程独立运行管理,通过独立的网络套接字接口接收Web进程传过来的请求。特点:真正地实现前后端分离。适合于性能要求比较高的场景。Web 服务器需要开启反向代理功能,将请求转发到后端服务器。
ALL-IN-ONE
以部署 wordpress 应用为例。
实验环境
主机名 | IP 地址 | 角色 |
---|---|---|
blog.azurewhisky.top | 10.1.8.20 | all |
以部署 wordpress 应用为例。
部署 Mysql 服务
部署软件
bash
[root@blog ~]# yum install -y mysql-server
[root@blog ~]# systemctl enable mysqld --now
准备数据库
bash
[root@blog ~]# mysql
mysql> CREATE DATABASE wordpress;
mysql> CREATE USER azurewhisky@'%' identified by 'redhat';
mysql> GRANT ALL PRIVILEGES ON wordpress.* TO 'azurewhisky'@'%';
mysql> FLUSH PRIVILEGES;
mysql> exit
部署 Web 服务
不同类型 Web 服务器只需要部署一个。
部署 Apache
bash
[root@blog ~]# yum install -y httpd
[root@blog ~]# echo 'ServerName blog.azurewhisky.top:80' >> /etc/httpd/conf/httpd.conf
[root@blog ~]# echo 'Hello World !' > /var/www/html/index.html
[root@blog ~]# systemctl enable httpd --now
部署 Nginx
bash
[root@blog ~]# yum install -y nginx
[root@blog ~]# echo 'Hello World !' > /usr/share/nginx/html/index.html
[root@blog ~]# systemctl enable nginx --now
部署 PHP 服务
部署 php 服务
bash
[root@blog ~]# yum install -y php php-fpm php-mysqlnd
[root@blog ~]# systemctl enable php-fpm.service --now
[root@blog ~]# systemctl restart httpd
准备 php 测试文件
bash
# 准备 index.php
[root@blog ~]# cat > index.php <<EOF
<?php
echo "<h1>Hello World !</h1>\n";
?>
EOF
# 准备 test-mysql.php
[root@blog ~]# cat > test-mysql.php <<'EOF'
<?php
$link=mysqli_connect('10.1.8.20','azurewhiksy','redhat');
if($link)
echo "<h1>Connect Mysql Success !</h1>\n";
else
echo "<h1>Connect Mysql Failed !</h1>\n";
$link->close();
?>
EOF
# 准备 info.php
[root@blog ~]# cat > info.php <<EOF
<?php
phpinfo()
?>
EOF
# Apache 服务器
[root@blog ~]# cp *.php /var/www/html
# Nginx 服务器
[root@blog ~]# cp *.php /usr/share/nginx/html
php 程序测试
bash
[root@blog ~]# php -f index.php
<h1>Hello World !</h1>
[root@blog ~]# php -f test-mysql.php
<h1>Connect Mysql Success !</h1>
浏览器测试

部署 wordpress 应用
下载wordpress,上传到家目录。
bash
# 如果 Web 服务是 Apache,则解压文件到/var/www/html/
[root@blog ~]# unzip -o wordpress-4.9.4-zh_CN.zip -d /var/www/html
[root@blog ~]# chown -R apache:apache /var/www/html/wordpress/
# 如果 Web 服务是 Nginx,则解压文件到/usr/share/nginx/html
[root@blog ~]# unzip -o wordpress-4.9.4-zh_CN.zip -d /usr/share/nginx/html
[root@blog ~]# chown -R nginx:nginx /usr/share/nginx/html/wordpress
# php-fpm 进程默认以 apache 用户身份运行,修改运行用户为 nginx,并重启服务
[root@blog ~]# vim /etc/php-fpm.d/www.conf
user=nginx
group=nginx
[root@blog ~]# systemctl restart php-fpm
客户端配置 blog.laoma.cloud 名称解析。访问http://blog.laoma.cloud/wordpress/。


如果是nginx服务,则单击提交后,会出现如下提示:

根据提示创建文件,然后单击现在安装。

后续步骤省略。
分析 Web 对接 PHP 配置
PHP 配置
bash
[root@blog ~]# systemctl is-active php-fpm.service
active
[root@blog ~]# ss -lnp|grep php-fpm
u_str LISTEN 0 511 /run/php-fpm/www.sock 38251 * 0 users:((php-fpm",pid=5465,fd=8),("php-fpm",pid=5461,fd=8),("php-fpm",pid=5460,fd=8),("php-fpm",pid=5459,fd=8),("php-fpm",pid=5458,fd=8),("php-fpm",pid=5457,fd=8),("php-fpm",pid=5456,fd=6))
Apache 对接 PHP 配置
Apache 服务器与PHP协同工作,需要启用代理模块和fcgi模块。
配置文件 /etc/httpd/conf.modules.d/00-proxy.conf
默认已经启用了代理模块和fcgi模块。
nginx
[root@www ~]# cat /etc/httpd/conf.modules.d/00-proxy.conf | \
> egrep -n 'mod_proxy(_fcgi)?.so'
2:LoadModule proxy_module modules/mod_proxy.so
11:LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
Apache 默认通过 unix:/run/php-fpm/www.sock 对接 PHP 。
bash
[root@blog ~]# egrep -v '^ *#|^$' /etc/httpd/conf.d/php.conf
<Files ".user.ini">
Require all denied
</Files>
AddType text/html .php
DirectoryIndex index.php
<IfModule !mod_php5.c>
<IfModule !mod_php7.c>
SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1
<FilesMatch \.(php|phar)$>
SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost"
</FilesMatch>
</IfModule>
</IfModule>
<IfModule mod_php7.c>
<FilesMatch \.(php|phar)$>
SetHandler application/x-httpd-php
</FilesMatch>
php_value session.save_handler "files"
php_value session.save_path "/var/lib/php/session"
php_value soap.wsdl_cache_dir "/var/lib/php/wsdlcache"
</IfModule>
Nginx 对接 PHP 配置
/etc/nginx/default.d/php.conf
nginx
[root@blog ~]# egrep -v '^ *#|^$' /etc/nginx/default.d/php.conf
index index.php index.html index.htm;
location ~ \.(php|phar)(/.*)?$ {
fastcgi_split_path_info ^(.+\.(?:php|phar))(/.*)$;
fastcgi_intercept_errors on;
fastcgi_index index.php;
include fastcgi_params;
# 到虚拟主机主目录下查找对应php文件
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
# 转发到后端 php-fpm
fastcgi_pass php-fpm;
}
/etc/nginx/conf.d/php-fpm.conf
bash
[root@blog ~]# cat /etc/nginx/conf.d/php-fpm.conf
# PHP-FPM FastCGI server
# network or unix domain socket configuration
upstream php-fpm {
server unix:/run/php-fpm/www.sock;
}
Standalone
以部署 wordpress 应用为例。
实验环境
主机名 | IP 地址 | 角色 |
---|---|---|
www.azurewhisky.top | 10.1.8.21 | apache |
php.azurewhisky.top | 10.1.8.22 | php |
mysql.azurewhisky.top | 10.1.8.23 | mysql |
nfs.azurewhisky.top | 10.1.8.24 | nfs |
nfs 服务器提供共享存储 web 应用文件。
部署 NFS 服务器
由于静态文件和动态文件没有分开,所以 Web 服务器和 PHP 服务器都要存一份。实验环境通过NFS共享提供wordpress应用。
下载 wordpress,上传到家目录。
bash
[root@nfs ~]# yum install -y nfs-utils
[root@nfs ~]# mkdir -m 777 /www
[root@nfs ~]# echo '/www 10.1.8.0/24(rw)' > /etc/exports
[root@nfs ~]# systemctl enable nfs-server.service --now
# 准备 wordpress资源
[root@nfs ~]# unzip -o wordpress-4.9.4-zh_CN.zip -d /www/
# 准备网页测试文件
[root@nfs ~]# echo 'Hello World !' > /www/index.html
[root@nfs ~]# cat > /www/index.php <<EOF
<?php
echo "<h1>Hello World !</h1>\n";
?>
EOF
[root@nfs ~]# cat > /www/test-mysql.php <<'EOF'
<?php
$link=mysqli_connect('mysql.azurewhisky.top','azurewhisky','redhat');
if($link)
echo "<h1>Connect Mysql Success !</h1>\n";
else
echo "<h1>Connect Mysql Failed !</h1>\n";
$link->close();
?>
EOF
[root@nfs ~]# cat > /www/info.php <<EOF
<?php
phpinfo();
?>
EOF
部署 Mysql 服务器
bash
[root@mysql ~]# yum install -y mysql-server
[root@mysql ~]# systemctl enable mysqld --now
# 准备wordpress数据库和用户
[root@mysql ~]# mysql
mysql> CREATE DATABASE wordpress;
mysql> CREATE USER azurewhisky@'%' identified by 'redhat';
mysql> GRANT ALL PRIVILEGES ON wordpress.* TO 'azurewhisky'@'redhat';
mysql> FLUSH PRIVILEGES;
mysql> exit
部署 Web 服务器
不同类型 Web 服务器只需要部署一个。
部署 Apache 服务
bash
# 部署 Apache 服务
[root@www ~]# yum install -y httpd
[root@www ~]# echo 'ServerName www.azurewhisky.top:80' >> /etc/httpd/conf/httpd.conf
[root@www ~]# systemctl enable httpd --now
# 安装 nfs 工具
[root@www ~]# yum install -y nfs-utils
# 挂载存储
[root@www ~]# echo 'nfs.azurewhisky.top:/www /var/www/html nfs defaults 0 0' >> /etc/fstab
[root@www ~]# systemctl daemon-reload
[root@www ~]# mount /var/www/html/
[root@www ~]# df -h /var/www/html/
Filesystem Size Used Avail Use% Mounted on
nfs.azurewhisky.top:/www 64G 3.2G 61G 5% /var/www/html
[root@www ~]# ls /var/www/html/
index.html index.php info.php test-mysql.php wordpress
部署 Nginx 服务
bash
# 部署 Nginx 服务
[root@www ~]# yum install -y nginx
[root@www ~]# systemctl enable nginx --now
# 安装 nfs 工具(上述已完成)
[root@www ~]# yum install -y nfs-utils
# 挂载存储
[root@www ~]# echo 'nfs.azurewhisky.top:/www /usr/share/nginx/html nfs defaults 0 0' >> /etc/fstab
[root@www ~]# systemctl daemon-reload
[root@www ~]# mount /usr/share/nginx/html/
[root@www ~]# df -h/usr/share/nginx/html/
Filesystem Size Used Avail Use% Mounted on
nfs.azurewhisky.top:/www 64G 3.2G 61G 5% /usr/share/nginx/html
[root@www ~]# ls /usr/share/nginx/html/
index.html index.php info.php test-mysql.php wordpress
部署 PHP 服务器
部署 php 服务
bash
[root@php ~]# yum install -y php php-fpm php-mysqlnd
[root@php ~]# vim /etc/php-fpm.d/www.conf
bash
#使用;号注释掉原有listen行
;listen = /run/php-fpm/www.sock
# 新增listen 监听所有ip的9000端口
listen = 9000
# 支持监听特定ip的9000端口,格式10.1.8.22:9000
# 使用;号注释掉原有 listen.allowed_clients 行
# 允许所有客户端访问
;listen.allowed_clients = 127.0.0.1
[root@php ~]# systemctl enable php-fpm.service --now
挂载存储
bash
# 安装 nfs 工具(上述已完成)
[root@www ~]# yum install -y nfs-utils
# 挂载存储
[root@php ~]# echo 'nfs.azurewhisky.top:/www /www nfs defaults 0 0' >> /etc/fstab
[root@php ~]# systemctl daemon-reload
[root@php ~]# mkdir /www
[root@php ~]# mount /www
[root@php ~]# df -h /www
Filesystem Size Used Avail Use% Mounted on
nfs.azurewhisky.top:/www 64G 3.2G 61G 5% /www
[root@php ~]# ls /www
index.html index.php info.php test-mysql.php wordpress
php 程序测试
bash
[root@www ~]# php -f index.php
<h1>Hello World !</h1>
[root@www ~]# php -f test-mysql.php
<h1>Connect Mysql Success !</h1>
# 执行 info.php 的输出内容太多,这里省略。
配置 Web 对接 PHP
Apache 对接 PHP
Apache 服务器与独立的PHP服务器协同工作,需要启用代理模块(mod_proxy.so)和 fcgi 模块(mod_proxy_fcgi.so)。
Apache 服务器配置文件 /etc/httpd/conf.modules.d/00-proxy.conf
默认已经启用了代理模块和fcgi模块。
nginx
[root@www ~]# cat /etc/httpd/conf.modules.d/00-proxy.conf | \
egrep -n 'mod_proxy(_fcgi)?.so'
2:LoadModule proxy_module modules/mod_proxy.so
11:LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
添加 php 文件解析
bash
[root@www ~]# cat > /etc/httpd/conf.d/php.conf << 'EOF'
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
<IfModule dir_module>
DirectoryIndex index.php index.html
</IfModule>
ProxyRequests Off
# 指向 php 服务器上 wordpress 应用所在位置
ProxyPassMatch ^/(.*\.php)$ fcgi://php.azurewhisky.top:9000/www/$1
EOF
bash
# 重启服务
[root@www ~]# systemctl restart httpd
Nginx 对接 PHP
bash
[root@www ~]# cat > /etc/nginx/conf.d/vhost-www.conf <<'EOF'
server {
listen 80;
server_name www.azurewhisky.top;
# 静态资源处理
location / {
root /usr/share/nginx/html;
index index.html index.htm index.php;
}
# PHP 请求处理
location ~ \.php$ {
# 配置 PHP-FPM 监听的地址和端口
fastcgi_pass php.azurewhisky.top:9000;
fastcgi_index index.php;
# 配置 php 服务器上 wordpress 应用所在位置
fastcgi_param SCRIPT_FILENAME /www/$fastcgi_script_name;
include fastcgi_params;
}
}
EOF
bash
# 重启服务
[root@www ~]# systemctl restart nginx
测试应用
客户端配置 www.laoma.cloud 名称解析。访问http://www.laoma.cloud/wordpress/。


根据提示:在存储节点创建配置文件。
bash
[root@nfs ~]# vim /www/wordpress/wp-config.php
php
<?php
/**
* WordPress基础配置文件。
*
* 这个文件被安装程序用于自动生成wp-config.php配置文件,
* 您可以不使用网站,您需要手动复制这个文件,
* 并重命名为"wp-config.php",然后填入相关信息。
*
* 本文件包含以下配置选项:
*
* * MySQL设置
* * 密钥
* * 数据库表名前缀
* * ABSPATH
*
* @link https://codex.wordpress.org/zh-cn:%E7%BC%96%E8%BE%91_wp-config.php
*
* @package WordPress
*/
// ** MySQL 设置 - 具体信息来自您正在使用的主机 ** //
/** WordPress数据库的名称 */
define('DB_NAME', 'wordpress');
/** MySQL数据库用户名 */
define('DB_USER', 'azurewhisky');
/** MySQL数据库密码 */
define('DB_PASSWORD', 'redhat');
/** MySQL主机 */
define('DB_HOST', 'mysql.laoma.cloud');
/** 创建数据表时默认的文字编码 */
define('DB_CHARSET', 'utf8mb4');
/** 数据库整理类型。如不确定请勿更改 */
define('DB_COLLATE', '');
/**#@+
* 身份认证密钥与盐。
*
* 修改为任意独一无二的字串!
* 或者直接访问{@link https://api.wordpress.org/secret-key/1.1/salt/
* WordPress.org密钥生成服务}
* 任何修改都会导致所有cookies失效,所有用户将必须重新登录。
*
* @since 2.6.0
*/
define('AUTH_KEY', '7yZqc1!YY*8Um(;hw#Cu@&C<oRt|(Qjd!exg|n=#>(&/v|1(:=-E?KB;AGUVy&7.');
define('SECURE_AUTH_KEY', '{sdmX?Io3}r8 km:r{g/uigwrcWPWO+7740kuiXMzYR&Nu7kQlt8s@7y.-#X_2Xt');
define('LOGGED_IN_KEY', 'uk^ s?-9K5xyNPT8nXI$t)$K6vb71qP[}[pZvk^::WN &%GO;*702MmI(U#TFgH+');
define('NONCE_KEY', 'zLA^fMij!?X +#vs+G` nGf6gel<a*QNhYL[5$}91nkif7ylJMAiqxotzgZ]/{:x');
define('AUTH_SALT', '-%_ji|zC-:#7dJZ7W6+@XZvJ^Ij,I%^R69K]kZobmWi{6.+w8Sw!u]~;FJ-d+?a)');
define('SECURE_AUTH_SALT', '?r*#JoJ}Xy~kSXEzWRZI;a3MBMd*RDbx<KQI@T4e?8 pKE~08c=Q(I_<Sd.OZ}lk');
define('LOGGED_IN_SALT', ')u7KKy1$#82.ZY8#^X99=#Vgzaw>g!>_f-_3LFoOM^Wi8+N@R`x`re$bJQA1;2^I');
define('NONCE_SALT', '<_HUy#}dPUtcJ0$fsq/>N(Ds53rEV6)?VEtSm,Djs7]L6]3;Q}2Xov|VL/P;`Fg$');
/**#@-*/
/**
* WordPress数据表前缀。
*
* 如果您有在同一数据库内安装多个WordPress的需求,请为每个WordPress设置
* 不同的数据表前缀。前缀名只能为数字、字母加下划线。
*/
$table_prefix = 'wp_';
/**
* 开发者专用:WordPress调试模式。
*
* 将这个值改为true,WordPress将显示所有用于开发的提示。
* 强烈建议插件开发者在开发环境中启用WP_DEBUG。
*
* 要获取其他能用于调试的信息,请访问Codex。
*
* @link https://codex.wordpress.org/Debugging_in_WordPress
*/
define('WP_DEBUG', false);
/**
* zh_CN本地化设置:启用ICP备案号显示
*
* 可在设置→常规中修改。
* 如需禁用,请移除或注释掉本行。
*/
define('WP_ZH_CN_ICP_NUM', true);
/* 好了!请不要再继续编辑。请保存本文件。使用愉快! */
/** WordPress目录的绝对路径。 */
if ( !defined('ABSPATH') )
define('ABSPATH', dirname(__FILE__) . '/');
/** 设置WordPress变量和包含文件。 */
require_once(ABSPATH . 'wp-settings.php');
- 如果您有在同一数据库内安装多个WordPress的需求,请为每个WordPress设置
- 不同的数据表前缀。前缀名只能为数字、字母加下划线。
*/
$table_prefix = 'wp_';
/**
- 开发者专用:WordPress调试模式。
- 将这个值改为true,WordPress将显示所有用于开发的提示。
- 强烈建议插件开发者在开发环境中启用WP_DEBUG。
- 要获取其他能用于调试的信息,请访问Codex。
- @link https://codex.wordpress.org/Debugging_in_WordPress
*/
define('WP_DEBUG', false);
/**
- zh_CN本地化设置:启用ICP备案号显示
- 可在设置→常规中修改。
- 如需禁用,请移除或注释掉本行。
*/
define('WP_ZH_CN_ICP_NUM', true);
/* 好了!请不要再继续编辑。请保存本文件。使用愉快! */
/** WordPress目录的绝对路径。 */
if ( !defined('ABSPATH') )
define('ABSPATH', dirname(FILE) . '/');
/** 设置WordPress变量和包含文件。 */
require_once(ABSPATH . 'wp-settings.php');
配置完成后,单击**现在安装**,继续。后续步骤省略。