淺談LAMP

LAMP介紹

1️⃣LAMP的含義:

  • L: linux
  • A: apache httpd
  • M: mysql, mariadb
  • P: php, python

2️⃣Web資源類型

  • 靜態資源:原始形式與響應內容一致
  • 動態資源:原始形式通常爲程序文件,需要在服務器端執行之後,將執行結果返回給客戶端

3️⃣Web相關語言

  • 客戶端技術:javascript, html,處理靜態資源
  • 服務器端技術:php, jsp, python,處理動態資源

4️⃣LAMP工作原理
在這裏插入圖片描述

  • 當客戶端請求靜態資源時,web服務器直接把靜態資源返回客戶端

  • 當客戶端請求動態資源時,httpd的php模塊會進行動態運算,如果過程需要數據庫的數據作爲運算參數時,php連接數據庫取得相應數據,運算的結果轉換爲靜態資源由web服務器返回客戶端

  • CGI(Common Gateway Interface):httpd程序與php之間數據傳輸的標準

5️⃣php

  • php是一種腳本編程語言,同時也是一種可以嵌入到html中的嵌入式web程序語言

  • Zend Engine:開源的、php腳本語言的解釋器

  • Opcode:php腳本編譯後的中間語言,順次執行opcode,每次執行一條,實現php腳本的解釋執行

CGI和fastcgi

1️⃣CGI

  • CGI:Common Gateway Interface 公共網關接口
  • CGI 可以讓一個客戶端,從網頁瀏覽器通過http服務器向執行在網絡服務器上的程序傳輸數據;
  • CGI描述了客戶端和服務器程序之間傳輸的一種標準
  • 請求流程:
    Client -- (http協議) --> httpd -- (cgi協議) --> application server (program file) -- (mysql協議) --> mysql

2️⃣fastcgi

  • web服務器收到一個請求時,不會重新fork一個進程(因爲這個進程在web服務器啓
    動時就開啓了,而且不會退出),web服務器直接把內容傳遞給這個進程(進程間通信,但fastcgi使用了別的方式,tcp方式通信),
  • 這個進程收到請求後進行處理,把結果返回給web服務器,最後自己接着等待下一個請求的到來,而不是退出
  • 請求流程:
    Client -- (http協議) --> httpd -- (fastcgi協議) --> fastcgi服務器 -- (mysql協議) --> mysql

3️⃣二者區別
在這裏插入圖片描述
在這裏插入圖片描述

PHP詳情

1️⃣PHP的Opcode語言
Opcode是一種PHP腳本編譯後的中間語言,類似於Java的ByteCode,或者.NET的MSL。
PHP的語言引擎Zend執行PHP腳本代碼一般會經過如下4個步驟

  • 1、Scanning 詞法分析,將PHP代碼轉換爲語言片段(Tokens)
  • 2、Parsing 語義分析,將Tokens轉換成簡單而有意義的表達式
  • 3、Compilation 將表達式編譯成Opcode
  • 4、Execution 順次執行Opcode,每次一條,從而實現PHP腳本的功能
    即:掃描–>分析–>編譯–>執行

2️⃣php配置

  • php 的配置文件/etc/php.ini, /etc/php.d/*.ini

  • 配置文件在php解釋器啓動時被讀取

  • 對配置文件的修改生效方法

    • Modules:重啓httpd服務
    • FastCGI:重啓php-fpm服務
  • /etc/php.ini配置文件格式

[foo]:Section Header
directive = value

註釋符:以 ; 開頭,用於註釋可啓用的directive

  • php.ini 配置參考文檔
    php.ini的核心配置選項文檔: http://php.net/manual/zh/ini.core.php
    php.ini配置選項列表:http://php.net/manual/zh/ini.list.php

  • php常見設置

max_execution_time= 30 最長執行時間30s
memory_limit=128M 生產不夠,可調大
display_errors=off 調試使用,不要打開,否則可能暴露重要信息
display_startup_errors=off 建議關閉
post_max_size=8M 最大上傳數據大小,生產可能調大,比下面項大
upload_max_filesize =2M 最大上傳文件,生產可能要調大
max_file_uploads = 20 同時上傳最多文件數
date.timezone =Asia/Shanghai 指定時區
short_open_tag=on 開啓短標籤,:<? phpinfo(); ?>

3️⃣php語言格式

  • php語言有兩種使用格式:
/  格式1 html代碼嵌入php代碼中
<?php
echo "<h1>Hello world!</h1>"
?>

/ 格式2 php代碼嵌入html代碼中
<h1>
<?php echo "Hello world!" ?>
</h1>

/ php測試代碼
<?php
echo date("Y/m/d H:i:s");
phpinfo();
?>
  • 示例:測試php
vim /var/www/html/index.php
<h1>
<?php
echo "hellp php1!"
?>
</h1>

<?php
echo "<h1> hello php2!</h1>"
?>

<?php
echo date("y/m/d");
phpinfo();
?>

在這裏插入圖片描述

LAMP實現方式

httpd 接收用戶的web請求;靜態資源則直接響應;動態資源爲php腳本,對此類資源的請求將交由php來運行
1️⃣httpd與php結合方式

  • modules :將php編譯成爲httpd的模塊libphp5.so,只有prefork 模式才支持
  • FastCGI

2️⃣LAMP架構實現

  • 靜態資源:
    Client -- http --> httpd
  • 動態資源:
    Client -- http --> httpd --> libphp5.so () -- mysql --> MySQL server
    Client -- http --> httpd -->fastcgi-- mysql --> MySQL server

3️⃣利用rpm包實現LAMP安裝部署

  • CentOS 8

    • Module 模塊方式
      dnf install httpd mariadb-server php php-mysqlnd
    • FastCGI 方式
      dnf install httpd mariadb-server php-fpm php-mysqlnd
  • CentOS 7

    • Module 模塊方式
      yum install httpd php php-mysql mariadb-server
    • FastCGI 方式
      yum install httpd php-fpm php-mysql mariadb-server
  • CentOS 6:

    • Module 模塊方式
      yum install httpd, php, php-mysql, mysql-server
    • FastCGI方式:默認不支持
      注意:基於module實現,httpd 需要 使用prefork模型

PHP連接MySQL的方式

  • 使用mysql擴展連接數據庫
    使用mysql擴展模塊mysql.so連接數據,此方式已經在php 7版後淘汰
    範例:php使用mysql擴展連接數據庫的測試代碼
<?php
$conn = mysql_connect('mysqlserver','username','password');
if ($conn)
echo "OK";
else
echo "Failure";
#echo mysql_error();
mysql_close();
?>
  • 使用mysqli擴展連接數據庫
    使用mysqli擴展模塊mysqli.so連接數據,此方式只能連接MySQL數據庫,不支持其它數據庫
  • 範例:php使用mysqli擴展連接數據庫的測試代碼
vim /var/www/html/index2.php
<?php
$mysqli=new mysqli("localhost", "test", "centos");
if(mysqli_connect_errno()){
echo "Failure";
$mysqli=null;
exit;
}
echo "OK";
echo date("Y/m/d H:i:s");
$mysqli->close();
?>

在這裏插入圖片描述

  • 使用PDO(PHP Data Object)擴展連接數據庫(基本都是這個)
    使用PDO擴展模塊pdo_mysql.so連接數據庫,此方式可以支持連接MySQL,Oracle等多種數據庫
  • 範例:php使用pdo擴展連接數據庫的測試代碼
/ 測試代碼1
[root@Centos7 ~]# vim /var/www/html/pdo1.php
<?php
$dsn='mysql:host=localhost;dbname=mysql';
$username='test';
$passwd='centos';
$dbn=new pdo($dsn,$username,$passwd);
var_dump($dbh);
echo "OK"
?>
/ 測試代碼2
[root@Centos7 ~]# vim /var/www/html/pdo3.php
<?php
try {
$user='test';
$pass='centos';
$dbh = new PDO('mysql:host=localhost;dbname=mysql', $user, $pass);
foreach($dbh->query('SELECT user,host from user') as $row) {
print_r($row);
}
$dbh = null;
} catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
die();
}

在這裏插入圖片描述
在這裏插入圖片描述

CentOS 7環境下部署phpmyadmin

1️⃣安裝相應的LAMP程序

/ 配置清華php源
yum install https://mirrors.tuna.tsinghua.edu.cn/remi/enterprise/remi-release-
7.rpm
yum install httpd php72-php php72-php-mysqlnd php72-php-mbstring mariadb-server
systemctl start httpd
systemctl start mariadb
/ 修改mysql的root密碼 phpMyadmin不允許空密碼登錄
mysqladmin -uroot passoword 'centos'

2️⃣安裝配置的PHPmyadmin程序

wget https://files.phpmyadmin.net/phpMyAdmin/4.9.2/phpMyAdmin-4.9.2-all-languages.tar.gz
tar xf phpMyAdmin-4.9.2-all-languages.tar.gz -C /var/www/html
cd /var/www/html
mv phpMyAdmin-4.9.2-all-languages pma

3️⃣直接IP地址/pma打開
在這裏插入圖片描述
在這裏插入圖片描述

CentOS 7環境下部署wordpress

1️⃣安裝相應的LAMP程序

/ 配置清華php源
yum install https://mirrors.tuna.tsinghua.edu.cn/remi/enterprise/remi-release-
7.rpm
yum install httpd php72-php php72-php-mysqlnd mariadb-server
systemctl start httpd mariadb

2️⃣安裝配置wordpress

/  下載官網地址:https://cn.wordpress.org/
cd /var/www/html
[root@Centos7 html]# tar xf wordpress-5.3-zh_CN.tar.gz 
[root@Centos7 html]# ls
pma  wordpress  wordpress-5.3-zh_CN.tar.gz
/ 配置wordpress權限
chown -R apache.apache wordpress
/ mysql配置
CREATE DATABASE wordpress CHARACTER SET = utf8;
GRANT ALL ON wordpress.* TO 'wordpress'@'%' IDENTIFIED BY 'wordpress';
/ 如果mysql跟wordpress不分離就必須創建本地連接賬戶
GRANT ALL ON wordpress.* TO 'wordpress'@'localhost' IDENTIFIED BY 'wordpress';

3️⃣直接IP地址/wordpress打開安裝
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

4️⃣測試php性能
ab -c 10 -n 100 http://172.20.54.2/wordpress/
如下圖,當前每秒處理請求數約爲6-7 性能極差
在這裏插入圖片描述

php加速器

1️⃣實現原理

php的加速器:

  • 基於PHP的特殊擴展機制如opcode緩存擴展也可以將opcode緩存於php的共享內存中,從而可以讓同一段代碼的後續重複執行時跳過編譯階段以提高性能。
  • 這些加速器並非真正提高了opcode的運行速度,而僅是通過分析opcode後並將它們重新排列以達到快速執行的目的

2️⃣常用php加速器

  • XCache加速php 5.X
    快速而且穩定的PHP opcode緩存,經過嚴格測試且被大量用於生產環境。
    項目地址:http://xcache.lighttpd.net/, 收錄EPEL源
  • PHP自帶的opcache加速php 7.X

CentOS 7環境下編譯安裝php-xcache支持php 5.X

1️⃣準備安裝環境

/ 配置清華源
[root@Centos7 ~]# yum -y install https://mirrors.tuna.tsinghua.edu.cn/remi/enterprise/remi-release-7.rpm
[root@Centos7 ~]# yum -y install php56-php php56-php-mysqlnd mariadb-server httpd
/ 開機啓動
[root@Centos7 ~]# systemctl enable --now httpd mariadb
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/mariadb.service to /usr/lib/systemd/system/mariadb.service.
/ 準備mysql賬號
MariaDB [(none)]> CREATE DATABASE wordpress;
MariaDB [(none)]> GRANT  ALL wordpress.* TO 'wordpress'@'localhost' IDENTIFIED BY 'wordpress';

2️⃣準備wordpress

[root@Centos7 html]# tar xf wordpress-5.2.4-zh_CN.tar.gz -C /var/www/html
cd /var/www/html
/ 更改所屬組
chown -R apache.apache wordpress
/ 配置wordpress
http://172.20.54.3/wordpress

3️⃣編譯安裝

/ 配置編譯環境
[root@Centos7 html]# yum -y install gcc php56-php-devel
#下載並解壓縮xcache-3.2.0.tar.bz2
[root@centos7 ~]#tar xf xcache-3.2.0.tar.gz
#生成編譯環境
[root@centos7 ~]#cd xcache-3.2.0/
[root@Centos7 xcache-3.2.0]# /opt/remi/php56/root/usr/bin/phpize
Configuring for:
PHP Api Version:         20131106
Zend Module Api No:      20131226
Zend Extension Api No:   220131226
[root@Centos7 xcache-3.2.0]# ./configure --enable-xcache --with-php-config=/opt/remi/php56/root/usr/bin/php-config

[root@centos7 xcache-3.2.0]#make && make install
...省略...
Installing shared extensions: /opt/remi/php56/root/usr/lib64/php/modules/
[root@centos7 xcache-3.2.0]#cat xcache.ini >> /opt/remi/php56/root/etc/php.ini
#安裝base源中執行即可cp xcache.ini /etc/php.d/
[root@centos7 ~]#systemctl restart httpd

/ 測試性能
ab -c 10 -n 100 http://172.20.54.3/wordpress/
如下圖,性能提高了一倍

在這裏插入圖片描述

CentOS 8環境下安裝opcache支持php 7.X

[root@centos8 ~]#dnf install php-opcache
[root@centos8 ~]#rpm -ql php-opcache
/etc/php.d/10-opcache.ini
/etc/php.d/opcache-default.blacklist
/usr/lib/.build-id
/usr/lib/.build-id/71
/usr/lib/.build-id/71/55ebb00f7ebcab9d708c1d5c7b7e634cce259c
/usr/lib64/php/modules/opcache.so
[root@centos8 ~]#grep opcache /etc/php.d/10-opcache.ini
zend_extension=opcache
opcache.enable=1
...省略...

php-fpm 模式實現LAMP

1️⃣fastcgi模式介紹

  • fastcgi模式下php以獨立程序狀態運行,有獨立的進程、端口號

  • php-fpm軟件包:專用於將php運行於fastcgi模式,與php軟件包不能夠同時安裝

  • httpd2.4支持fastcgi模式,httpd2.2不支持該模式,故CentOS 6環境需要編譯httpd2.4才能使用fastcgi模式

2️⃣安裝php-fpm

/ BASE源安裝PHP-FPM
yum install php-fpm

/ 清華大學yum源安裝較新版的PHP-FPM(依賴EPEL源)
yum install https://mirrors.tuna.tsinghua.edu.cn/remi/enterprise/remi-release-
7.rpm
#安裝php-fpm5.6版
yum install php56-php-fpm php56-php-mysql
#安裝php-fpm7.3版
yum install php73-php-fpm php73-php-mysql

3️⃣配置php-fpm

  • 查看php-fpm所對應的配置文件
rpm -ql php-fpm
/usr/lib/systemd/system/php-fpm.service
/etc/logrotate.d/php-fpm
/etc/php-fpm.conf
/etc/php-fpm.d
/etc/php-fpm.d/www.conf
/etc/sysconfig/php-fpm
/run/php-fpm
  • php-fpm 主要配置文件:
    /etc/php-fpm.conf
    /etc/php-fpm.d/*.conf
  • 官方文檔:
    http://php.net/manual/zh/install.fpm.configuration.php
  • PHP-FPM常見配置
daemonize = no //是否將程序運行在後臺
listen = 127.0.0.1:9000 //FPM 監聽地址
listen = /var/run/php.sock //UDF模式使用,指定生成的unix socket文件的路徑
listen.owner = apache //UDF模式使用,指定生成的unix socket文件的所有者
listen.group = apache //UDF模式使用,指定生成的unix socket文件的所屬組
listen.mode= 0666 //UDF模式使用,,指定生成的unix socket文件的權限
listen.acl_users = apache,nginx //指定用戶訪問unix socket文件,listen.owner 和listen.group
將無效
listen.backlog = -1 //等待隊列的長度 -1表示無限制
listen.allowed_clients = 127.0.0.1 //僅允許哪些主機訪問
pm = dynamic|static //static 固定數量的子進程, //dynamic子進程數據以動態模式管理
pm.max_childen //static 固定數量的子進程
pm.start_servers
pm.min_spare_servers
pm.max_spare_servers
pm.max_requests = 500
php_value[session.save_handler] = files
php_value[session.save_path] = /var/lib/php/session //設置session存放位置
  • session目錄
    確保運行php-fpm進程的用戶對session目錄有讀寫權限
mkdir /var/lib/php/session
chown apache.apache /var/lib/php/session
  • 啓動PHP-FPM
    systemctl start php-fpm
  • 範例:php-fpm配置生產案例
cat /etc/php-fpm.d/www.conf
[www]
listen = 127.0.0.1:9000 #監聽地址及IP
listen.allowed_clients = 127.0.0.1 #允許客戶端從哪個源IP地址訪問,要允許所有行首加 ;註釋
即可
user = apache #php-fpm啓動的用戶和組,會涉及到後期文件的權限問題
group = apache
pm = dynamic #動態模式進程管理
pm.max_children = 500 #靜態方式下開啓的php-fpm進程數量,在動態方式下他限定php-fpm的最大進
程數
pm.start_servers = 100 #動態模式下初始進程數,必須大於等於pm.min_spare_servers和小於等
於pm.max_children的值。
pm.min_spare_servers = 100 #最小空閒進程數
pm.max_spare_servers = 200 #最大空閒進程數
pm.max_requests = 500000 #進程累計請求回收值,會重啓
pm.status_path = /pm_status #狀態訪問URL
ping.path = /ping #ping訪問動地址
ping.response = ping-pong #ping返回值
slowlog = /var/log/php-fpm/www-slow.log #慢日誌路徑
php_admin_value[error_log] = /var/log/php-fpm/www-error.log #錯誤日誌
php_admin_flag[log_errors] = on
php_value[session.save_handler] = files #phpsession保存方式及路徑
php_value[session.save_path] = /var/lib/php/session #當時使用file保存session的文件
路徑

4️⃣配置httpd 支持fastcgi

注意:在HTTPD服務器上必須啓用proxy_fcgi_module模塊,才能充當php-fpm客戶端

  • 查看基礎模塊
/ 查看fcgi模塊
[root@Centos7 ~]# httpd -M| grep fcgi
 proxy_fcgi_module (shared)
/ 查看MPM模式是否prefork
[root@Centos7 ~]# httpd -M| grep mpm
 mpm_prefork_module (shared)
  • 創建httpd的配置文件 /etc/httpd/conf.d/fcgi.conf ,內容如下
DirectoryIndex index.php
ProxyRequests Off
ProxyPassMatch ^/(.*\.php)$ fcgi://php-fpm服務器IP:9000/var/www/html/$1
#以上開啓FCGI反向代理,^/”這處的”/“相對於後面的/var/www/html而言,後面的$1是指前面
的/(.*.php)
  • 說明:如果php-fpm和httpd在同一臺主機,也可以用 UDS(unix domain socket)方式
ProxyPassMatch ^/(.*\.php)$
unix:/var/run/php.sock|fcgi://localhost/app/httpd24/htdocs/$1
  • 參看:http://httpd.apache.org/docs/2.4/mod/mod_proxy_fcgi.html

實戰案例:CentOS 7 利用yum安裝基於PHP-FPM模式的LAMP

/ 安裝基本包
[root@Centos7 ~]# yum -y install httpd php-fpm
#查看Httpd mod_fcgi模塊是否加載
httpd -M | grep fcgi
proxy_fcgi_module (shared)
/ 查看MPM模式
[root@Centos7 ~]# httpd -M | grep mpm
 mpm_prefork_module (shared)
/ 修改配置文件
vim /etc/httpd/conf.d/fcgi.conf      //添加/etc/httpd/conf.d/fcgi.conf配置文件
DirectoryIndex index.php
ProxyRequests Off                    //關閉正向代理
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/var/www/html/$1      //開啓fcgi反向代理
[root@Centos7 ~]# httpd -t
[root@Centos7 ~]# systemctl start httpd php-fpm.service

在這裏插入圖片描述

  • 配置wordpress跟mysql
[root@Centos7 ~]# tar xf wordpress-5.2.4-zh_CN.tar.gz -C /var/www/html
[root@Centos7 ~]# yum -y install mariadb-server php-mysqlnd
MariaDB [(none)]> CREATE DATABASE wordpress;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> GRANT ALL ON wordpress.* TO 'wordpress'@'localhost' IDENTIFIED BY 'wordpress';
Query OK, 0 rows affected (0.00 sec)

[root@Centos7 ~]# chown -R apache.apache /var/www/html/wordpress

/ 安裝wordpress
http://172.20.54.4/wordpress

實驗:php_fpm環境下虛擬主機設置

  • 新增虛擬主機配置文件
rm -f  /etc/httpd/conf.d/fcgi.conf     //將上個實驗的fcgi配置文件刪除
vim /etc/httpd/conf.d/vhosts.conf
DirectoryIndex index.php
<virtualhost *:80>
        ServerName "www.hello.com"
        DocumentRoot "/app/website1/"
        <directory /app/website1>
                require all granted
        </directory>
        ProxyRequests Off
        ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/app/website1/$1
</virtualhost>

<virtualhost *:80>
        ServerName "www.bye.com"
        DocumentRoot "/app/website2/"
        <directory /app/website2>
                require all granted
        </directory>
        ProxyRequests Off
        ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/app/website2/$1
</virtualhost>
  • 準備php文件
mkdir /app/website{1,2}
vim /app/website1/index.php 
<?php
echo "<h1>welcome to www.hello.com</h1>";
phpinfo();
?>

vim /app/website2/index.php
<?php
echo "<h1>welcome to www.bye.com</h1>";
phpinfo();
?>
  • 準備win10的hosts文件
c:\Windows\System32\drivers\etc\hosts
172.20.54.4 www.hello.com
172.20.54.4 www.bye.com
systemctl restart httpd

在這裏插入圖片描述
在這裏插入圖片描述


發佈了107 篇原創文章 · 獲贊 20 · 訪問量 6374
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章