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服務將結果返回給客戶端。
PHP 與 WEB 協同工作模式
PHP 與 WEB 協同工作模式:
- CGI:Web 進程動態調用相應腳本解釋器執行動態頁面 ,執行完后再釋放。特點:性能差。
- Modules:Web 進程動態加載相應模塊執行動態頁面 。特點:性能較好。
- FastCGI:后端進程獨立運行管理,通過獨立的網絡套接字接口接收Web進程傳過來的請求。特點:真正地實現前后端分離。適合于性能要求比較高的場景。Web 服務器需要開啟反向代理功能,將請求轉發到后端服務器。
ALL-IN-ONE
以部署 wordpress 應用為例。
實驗環境
主機名 | IP 地址 | 角色 |
---|---|---|
blog.laoma.cloud | 10.1.8.10 | all |
以部署 wordpress 應用為例。
部署數據庫
# 安裝服務端
[root@server ~ 21:55:21]# yum install -y mariadb-server# 啟用并啟動服務
[root@server ~ 22:00:25]# systemctl enable --now mariadb# 配置防火墻(一般防火墻是關閉的,不用做此步)
[root@blog ~]# firewall-cmd --permanent --add-service=mysql
[root@blog ~]# firewall-cmd --reload# 加固 MariaDB
[root@server ~ 22:00:42]# mysql_secure_installation
# 交互式提示您進行更改,包括:
# - 為root帳戶設置密碼,例如123。
# - 禁止root帳戶從本地主機外部訪問數據庫。
# - 刪除匿名用戶帳戶。
# - 刪除用于演示的test數據庫。
準備數據庫
[root@server ~ 22:03:48]# mysql -uroot -p123
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 23
Server version: 5.5.68-MariaDB MariaDB ServerCopyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.MariaDB [(none)]> CREATE DATABASE wordpress;
ERROR 1007 (HY000): Can't create database 'wordpress'; database exists
MariaDB [(none)]> CREATE DATABASE word;
Query OK, 1 row affected (0.00 sec)MariaDB [(none)]> CREATE USER wp@'%' identified by '123';
Query OK, 0 rows affected (0.01 sec)MariaDB [(none)]> GRANT ALL PRIVILEGES ON wordpress.* TO 'wp'@'%';
Query OK, 0 rows affected (0.00 sec)MariaDB [(none)]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)MariaDB [(none)]> exit
Bye
部署 Nginx 服務
[root@server ~ 22:05:37]# yum install -y nginx
[root@server ~ 22:14:51]# echo 'Hello World !' > /usr/share/nginx/html/index.html
[root@server ~ 22:15:04]# systemctl enable nginx --now
部署 PHP 服務
部署 php 服務
[root@server ~ 22:15:09]# yum install -y php php-fpm php-mysqlnd
[root@server ~ 22:16:11]# systemctl enable php-fpm.service --now# 修改配置文件
[root@server ~ 22:16:21]# vim /etc/nginx/default.d/php.conf
location ~ \.php$ {try_files $uri =404;fastcgi_pass 127.0.0.1:9000;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;include fastcgi_params;
}[root@server ~ 22:17:21]# systemctl restart nginx
準備 php 測試文件
[root@server ~ 22:22:33]# cd /usr/share/nginx/html/
# 準備 index.php
[root@server html 22:25:46]# cat > index.php <<EOF
<?phpecho "<h1>Hello World !</h1>\n";
?>
EOF# 準備 test-mysql.php
[root@server html 22:26:15]# cat > test-mysql.php <<'EOF'
<?php$link=mysqli_connect('10.1.8.10','wp','123');if($link)echo "<h1>Connect Mysql Success !</h1>\n";elseecho "<h1>Connect Mysql Failed !</h1>\n";$link->close();
?>
EOF# 準備 info.php
[root@server html 22:27:07]# cat > info.php <<EOF<?phpphpinfo()
?>
EOF[root@server html 22:27:20]# cp *.php /usr/share/nginx/html
cp: "index.php" 與"/usr/share/nginx/html/index.php" 為同一文件
cp: "info.php" 與"/usr/share/nginx/html/info.php" 為同一文件
cp: "php_test.php" 與"/usr/share/nginx/html/php_test.php" 為同一文件
cp: "test-mysql.php" 與"/usr/share/nginx/html/test-mysql.php" 為同一文件
php 程序測試
[root@server html 22:27:33]# php -f index.php
<h1>Hello World !</h1>
[root@server html 22:27:46]# php -f test-mysql.php
<h1>Connect Mysql Success !</h1>
部署 wordpress 應用
下載 wordpress,上傳到家目錄。
# 如果 Web 服務是 Nginx,則解壓文件到/usr/share/nginx/html
[root@server ~ 22:35:00]# rz -E
rz waiting to receive.
[root@server ~ 22:35:13]# unzip -o wordpress-4.9.4-zh_CN.zip -d /usr/share/nginx/html
[root@server ~ 22:35:23]# chown -R nginx:nginx /usr/share/nginx/html/wordpress# php-fpm 進程默認以 apache 用戶身份運行,修改運行用戶為 nginx,并重啟服務
[root@server ~ 22:35:52]# vim /etc/php-fpm.d/www.conf
user=nginx
group=nginx
[root@server ~ 22:36:19]# systemctl restart php-fpm
客戶端配置 blog.xiexin.cloud 名稱解析。訪問http://blog.xiexin.cloud/wordpress/。
如果是nginx服務,則單擊提交后,會出現如下提示:
根據提示創建文件,然后單擊現在安裝。
Standalone
以部署 wordpress 應用為例。
實驗環境
主機名 | IP 地址 | 角色 |
---|---|---|
www.xiexin.cloud | 10.1.8.21 | apache |
php.xiexin.cloud | 10.1.8.22 | php |
db.xiexin.cloud | 10.1.8.23 | mariadb |
storage.xiexin.cloud | 10.1.8.24 | nfs |
所有節點關閉防火墻和SELinux。
預配置
所有節點配置名稱解析:
[root@all-node ~ ]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain610.1.8.21 www.xiexin.cloud www
10.1.8.22 php.xiexin.cloud php
10.1.8.23 db.xiexin.cloud db
10.1.8.24 storage.xiexin.cloud storage
部署存儲服務器
由于靜態文件和動態文件沒有分開,所以 Web 服務器和 PHP 服務器都要存一份。實驗環境通過NFS共享提供wordpress應用。
下載 wordpress,上傳到家目錄。
[root@storage ~ 22:57:11]# yum install -y nfs-utils
[root@storage ~ 22:57:18]# mkdir -m 777 /www
[root@storage ~ 22:57:30]# echo '/www 10.1.8.0/24(rw)' > /etc/exports
[root@storage ~ 22:57:38]# systemctl enable nfs-server.service --now# 準備 wordpress資源
[root@storage ~ 22:57:43]# rz -E
rz waiting to receive.
[root@storage ~ 22:58:20]# unzip -o wordpress-4.9.4-zh_CN.zip -d /www/# 準備網頁測試文件
[root@storage ~ 22:58:28]# echo 'Hello World !' > /www/index.html
[root@storage ~ 22:58:54]# cat > /www/index.php <<EOF
> <?php
> echo "<h1>Hello World !</h1>\n";
> ?>
> EOF[root@storage ~ 22:59:08]# cat > /www/test-mysql.php <<'EOF'
> <?php
> $link=mysqli_connect('db.xiexin.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 ~ 22:59:35]# cat > /www/info.php <<EOF
> <?php
> phpinfo();
> ?>
> EOF
部署數據庫服務器
[root@db ~ 23:00:42]# yum install -y mariadb-server
[root@db ~ 23:00:47]# systemctl enable mariadb --now# 加固 MariaDB
[root@db ~ 23:01:02]# mysql_secure_installation
# 交互式提示您進行更改,包括:
# - 為root帳戶設置密碼,例如123。
# - 禁止root帳戶從本地主機外部訪問數據庫。
# - 刪除匿名用戶帳戶。
# - 刪除用于演示的test數據庫。 # 準備wordpress數據庫和用戶
[root@db ~ 23:01:40]# mysql -uroot -p123
mysql> CREATE DATABASE wordpress;
mysql> CREATE USER wp@'%' identified by 'Laoma@123';
mysql> GRANT ALL PRIVILEGES ON wordpress.* TO 'wp'@'%';
mysql> FLUSH PRIVILEGES;
mysql> exit
部署 Nginx 服務器
# 部署 Nginx 服務
[root@www ~ 23:09:11]# yum install -y nginx
[root@www ~ 23:09:17]# systemctl enable nginx --now# 安裝 nfs 工具
[root@www ~ 23:09:31]# yum install -y nfs-utils# 掛載存儲
[root@www ~ 23:09:36]# echo 'storage.xiexin.cloud:/www /usr/share/nginx/html nfs defaults 0 0' >> /etc/fstab
[root@www ~ 23:09:39]# mount /usr/share/nginx/html/
[root@www ~ 23:09:49]# df -h/usr/share/nginx/html/
Filesystem Size Used Avail Use% Mounted on
storage.xiexin.cloud:/www 64G 3.2G 61G 5% /usr/share/nginx/html
[root@www ~ 23:09:55]# ls /usr/share/nginx/html/
index.html index.php info.php test-mysql.php wordpress
部署 PHP 服務器
部署 php 服務
[root@php ~ 23:12:09]# yum install -y php php-fpm php-mysqlnd
[root@php ~ 23:12:13]# 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 ~ 23:13:00]# systemctl enable php-fpm.service --now[root@php ~ 23:13:06]# useradd -u 997 -s /sbin/nologin nginx
掛載存儲
# 安裝 nfs 工具
root@php ~ 23:13:14]# yum install -y nfs-utils# 掛載存儲
[root@php ~ 23:15:27]# echo 'storage.xiexin.cloud:/www /www nfs defaults 0 0' >> /etc/fstab
[root@php ~ 23:15:38]# mkdir /www
[root@php ~ 23:15:44]# mount /www
[root@php ~ 23:15:48]# df -h /www
文件系統 容量 已用 可用 已用% 掛載點
storage.xiexin.cloud:/www 50G 1.7G 49G 4% /www
[root@php ~ 23:15:52]# ls /www
index.html index.php info.php test-mysql.php wordpress
php 程序測試
root@php ~ 23:16:21]# php /www/index.php
<h1>Hello World !</h1>
[root@php ~ 23:16:45]# php /www/test-mysql.php
<h1>Connect Mysql Success !</h1>
配置 Nginx 對接 PHP
[root@www ~ 23:09:41]# cat > /etc/nginx/conf.d/vhost-www.conf <<'EOF'
> server {
> listen 80;
> server_name www.xiexin.cloud;
>
> # 靜態資源處理
> location / {
> root /usr/share/nginx/html;
> index index.html index.htm index.php;
> }
>
> # PHP 請求處理
> location ~ \.php$ {
> # 配置 PHP-FPM 監聽的地址和端口
> fastcgi_pass php.xiexin.cloud:9000;
> fastcgi_index index.php;
> # 配置 php 服務器上 wordpress 應用所在位置
> fastcgi_param SCRIPT_FILENAME /www/$fastcgi_script_name;
> include fastcgi_params;
> }
> }
> EOF# 重啟服務
[root@www ~ 23:18:39]# systemctl restart nginx
配置存儲權限
# 更改擁有者為nginx對應的uid
[root@storage ~ 22:59:47]# chown -R 997 /www# php-fpm 進程默認以 apache 用戶身份運行,修改運行用戶為 nginx,并重啟服務
[root@php ~ 23:16:49]# useradd -u 997 -s /sbin/nologin nginx
[root@php ~ 23:19:49]# vim /etc/php-fpm.d/www.conf
user=nginx
group=nginx
[root@php ~ 23:20:07]# systemctl restart php-fpm
測試應用
客戶端配置 www.xiexin.cloud 名稱解析。訪問http://www.xiexin.cloud/wordpress/。