项目实战2——LAMP_LNMP实践

项目实战2------

LAMP/LNMP 最佳实践

LAMP/LNMP 组件

LAMPL inux+A pache+M ysql/M ariadb+P HP/P ython/Perl。

LNMPL 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 工作原理

  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 服务

部署软件

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');

复制代码
配置完成后,单击**现在安装**,继续。后续步骤省略。
相关推荐
用户20187928316720 分钟前
Dialog不消失之谜——Android窗口系统的"平行宇宙"
android
用户2018792831671 小时前
Dialog 不消失之谜:一场来自系统底层的 "越狱" 行动
android
pengyu1 小时前
【Kotlin系统化精讲:陆】 | 数据类型之类型系统及精髓:安全性与智能设计的哲学
android·kotlin
用户2018792831672 小时前
DecorView添加到Window和直接用WindowManger添加View的差异?
android
叽哥2 小时前
flutter学习第 16 节:项目实战:综合应用开发(上)
android·flutter·ios
开发者如是说2 小时前
[中英双语] 如何防止你的 Android 应用被破解
android·安全
giaoho3 小时前
Framework学习:周末小总结以及Binder基础
android
今天的风儿好耀眼3 小时前
关于Google Pixel,或者安卓16,状态栏颜色无法修改的解决方案
android·java·安卓
Digitally4 小时前
使用 6 种方法将文件从 Android 无缝传输到iPad
android·cocoa·ipad