项目实战2——LAMP_LNMP实践

发布于:2025-08-13 ⋅ 阅读:(17) ⋅ 点赞:(0)

项目实战2——

LAMP/LNMP 最佳实践

LAMP/LNMP 组件

LAMPLinux+Apache+Mysql/Mariadb+PHP/Python/Perl。

LNMPLinux+Nginx+Mysql/Mariadb+PHP/Python/Perl。

  • Linux:操作系统,提供程序运行基础。
  • Apache/Nginx:Web 服务器,提供网页访问。
  • Mysql/Mariadb:数据库,提供数据管理。
  • PHP/Python/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 工作原理

在这里插入图片描述

  1. 客户端通过HTTP协议请求web服务器资源

  2. web 服务器根据资源类型进行处理:

    • 静态资源:web直接把资源返回至客户端。

    • 动态资源:通过指定的通讯方式将脚本网页交给后端程序执行。如果运算期间需要连接mysql数据库,则通过mysql连接器连接mysql。后端程序将运算结果返回给web服务。

  3. web服务将结果返回给客户端。

PHP 与 WEB 协同工作模式

PHP 与 WEB 协同工作模式:

  1. CGI:Web 进程动态调用相应脚本解释器执行动态页面 ,执行完后再释放。特点:性能差。
  2. Modules:Web 进程动态加载相应模块执行动态页面 。特点:性能较好。
  3. FastCGI:后端进程独立运行管理,通过独立的网络套接字接口接收Web进程传过来的请求。特点:真正地实现前后端分离。适合于性能要求比较高的场景。Web 服务器需要开启反向代理功能,将请求转发到后端服务器。

ALL-IN-ONE

以部署 wordpress 应用为例。

实验环境
主机名 IP 地址 角色
blog.azurewhisky.top 10.1.8.20 all

以部署 wordpress 应用为例。

部署 Mysql 服务

部署软件

[root@blog ~]# yum install -y mysql-server
[root@blog ~]# systemctl enable mysqld --now

准备数据库

[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
[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
[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 服务
[root@blog ~]# yum install -y php php-fpm php-mysqlnd
[root@blog ~]# systemctl enable php-fpm.service --now
[root@blog ~]# systemctl restart httpd
准备 php 测试文件
# 准备 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 程序测试
[root@blog ~]# php -f index.php
<h1>Hello World !</h1>

[root@blog ~]# php -f test-mysql.php
<h1>Connect Mysql Success !</h1>
浏览器测试

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

部署 wordpress 应用

下载wordpress,上传到家目录。

# 如果 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 配置
[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模块。

[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 。

[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

[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

[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,上传到家目录。

[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 服务器
[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 服务
# 部署 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 服务
# 部署 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 服务
[root@php ~]# yum install -y php php-fpm php-mysqlnd
[root@php ~]# vim /etc/php-fpm.d/www.conf
#使用;号注释掉原有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

挂载存储

# 安装 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 程序测试
[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模块。

[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 文件解析

[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
# 重启服务
[root@www ~]# systemctl restart httpd
Nginx 对接 PHP
[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
# 重启服务
[root@www ~]# systemctl restart nginx
测试应用

客户端配置 www.laoma.cloud 名称解析。访问http://www.laoma.cloud/wordpress/。

在这里插入图片描述

在这里插入图片描述

根据提示:在存储节点创建配置文件。

[root@nfs ~]# vim /www/wordpress/wp-config.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’);


配置完成后,单击**现在安装**,继续。后续步骤省略。

网站公告

今日签到

点亮在社区的每一天
去签到