從零到一使用Linux+Nginx+MySQL+PHP搭建的Web網站服務器架構環境——LNMP(上)https://coffeemilk.blog.csdn.net/article/details/151350565
一、Nginx與PHP-FPM整合原理
?1.1、PHP-FPM配置文件
序號 | 說明 |
1 | PHP-FPM是一個第三方的FastCGI進程管理器,最先它是作為PHP的一個補丁來開發的,現在PHP-FPM已經集成到了PHP源碼中,在配置安裝PHP的時候,通過指定“--enable-fpm”選項即可啟用PHP-FPM功能。 |
2 | PHP-FPM管理的進程包含【master進程】和【worker進程】兩種。 《1》master進程只有一個,主要負責監聽端口,接收來自Web Server的請求; 《2》而worker進程則一般有多個(具體數量根據實際需要配置),每個進程內部都嵌了一個PHP解釋器,是PHP代碼真正執行的地方。 |
3 | 那么Nginx又是如何發送請求給PHP-FPM的呢? ????????這就要從Nginx層面講起了,我們知道,Nginx不僅僅是一個Web服務器,也是一個功能強大的代理服務器,除了進行http請求的代理,也可以進行許多其他協議請求的代理,包括與PHP-FPM相關的FastCGI協議。 ????????為了能夠使Nginx理解FastCGI協議,Nginx提供了一個FastCGI模塊來將http請求映射為對應的FastCGI請求,這樣,Nginx就可以將請求發送給PHP-FPM了,也就實現了Nginx與PHP-FPM的集成。 |
序號 | 說明 | |
1 | 我們在使用PHP源碼編譯安裝完成PHP后,PHP的默認安裝路徑是【/usr/local/php】。 | |
2 | | |
3 | PHP的詳細配置文件【/usr/local/php/etc/php-fpm.d/www.conf】參數項說明 | |
user group | 設置運行php-fpm進程的用戶; 設置運行php-fpm進程用戶組; | |
listen | 配置php-fpm進程監聽的IP地址以及端口,默認是127.0.0.1:9000 | |
pm | 用來指定php-fpm進程池開啟進程的方式,有兩個值可以選擇: 《1》static(靜態); 《2》dynamic(動態); 《3》ondemand(按需); | |
pm.max_children | 在static方式下表示固定開啟的php-fpm子進程數量; 在dynamic方式下表示開啟php-fpm的最大進程數; | |
pm.start_servers | 【只在pm=dynamic方式】下初始開啟php-fpm的子進程數量; 默認值=(min_spare_servers+max_spare_server)/2 | |
pm.min_spare_servers | 【只在pm=dynamic方式】空閑狀態下開啟的最小php-fpm子進程數量 | |
pm.max_spare_servers | 【只在pm=dynamic方式】空閑狀態下開啟的最大php-fpm進程數量; 注意:pm.max_spare_servers的值只能小于等于pm.max_children的值 | |
pm.max_spawn_rate | 【只在pm=dynamic方式】下一次性生成的子進程數量;默認值是32且不啟用 | |
pm.process_idle_timeout | 【只在pm=ondemand方式】下空閑進程在多少秒后被終止;默認值是10秒且不啟用 | |
pm.max_requests | 每個子進程在重新生成之前應執行的請求數量。 這有助于解決第三方庫中的內存泄漏問題。要進行無限的請求處理,請指定“0”。等同于 PHP_FCGI_MAX_REQUESTS。 默認值:0;默認是不啟用 |
?1.2、配置Nginx來支持PHP并測試
#配置Nginx來支持PHP的完整操作流程#1-查看已有nginx的編譯所有配置信息和版本(若是yum安裝的Nginx則直接使用【nginx -V】即可)
#也可使用【systemctl status nginx.service】查看到Nginx的配置文件啟動路徑等信息
#【yum安裝的Nginx的配置文件默認是(/etc/nginx/nginx.conf)】
#【使用源碼安裝的Nginx的配置文件默認是(/usr/local/nginx/conf/nginx.conf)】
systemctl status nginx.servicewhereis nginx
/usr/local/nginx/sbin/nginx -V#2-編輯Nginx的配置文件實現反向代理.php內容到php-fpm中(及其最終配置為的內容)
vi /etc/nginx/nginx.confserver {listen 80;listen [::]:80;server_name _;root /usr/share/nginx/html;location / {index index.html index.htm index.php;root html;}location ~ \.php$ {root html;fastcgi_pass 127.0.0.1:9000;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;include fastcgi_params;}error_page 404 /404.html;location = /404.html {}error_page 500 502 503 504 /50x.html;location = /50x.html {}}#3-查看系統當前運行的Nginx進程信息并獲取到Nginx的父進程PID編號(如:1224)
#獲取到Nginx的父進程PID后【在不影響Nginx處理業務的情況下重啟Nginx】
ps -ef | grep nginx
kill -HUP 1224#4-檢查PHP-FPM服務是否已經啟動(若未啟動則需要啟動,且設置開機自啟)
systemctl status php-fpm.service
systemctl start php-fpm.service
systemctl enable php-fpm.service#5-若使用systemctl命令啟動服務失敗,可以查看服務狀態配合日志來判斷定位問題(如:這里排查后提示日志文件是只讀模式,導致無法寫入才失敗,因此我們可以進入日志所在目錄查看日志的權限;如權限沒有問題就是php-fpm服務中的ProtectSystem屬性保護系統導致,需要將php-fpm服務中的ProtectSystem屬性值修改為false保存退出后,重載服務并重啟php-fpm服務即可)
systemctl status php-fpm.service
tail -20 /var/log/messagescd /usr/local/php/var/log/
ll
vi /usr/lib/systemd/system/php-fpm.service
ProtectSystem=falsesystemctl daemon-reload
systemctl start php-fpm.service
systemctl status php-fpm.service#6-查看php-fpm的所有進程信息與網絡端口信息
ps -ef | grep php-fpm
netstat -antlp | grep php-fpm#7-進入到Nginx配置網站內容的路徑且編寫一個php文件用于測試Nginx對php的反向代理和支持
cd /usr/local/nginx/html
vi phpinfo.php#7.1-給phpinfo.php文件里面的內容如下:
<?php phpinfo(); ?>#8-在瀏覽器輸入Nginx所在服務器的IP地址/phpinfo.php即【ip/phpinfo.php】(如:192.168.1.9/phpinfo.php)看該文件是否可以解析出正常的內容
#8.1-查看Linux服務器的ip命令
ifconfig#9-通過【mysqli方式】測試PHP連接MySQL是否正常
#9.1-進入Nginx的網站配置路徑
cd /usr/share/nginx/html/
#9.2-創建并編輯mysqli.php文件
vi mysqli.php#mysqli.php文件中連接mysql數據的代碼(保存并退出)
<?php
$conn = mysqli_connect('127.0.0.1', 'root', 'abc123456', 'mysql','3336');
if(!$conn){
die("數據庫連接錯誤" . mysqli_connect_error());
}else{
echo"數據庫連接成功";
}
?>#9.3-在瀏覽器輸入Nginx所在服務器的IP地址/mysqli.php即【ip/mysqli.php】(如:192.168.1.9/mysqli.php)查看是否顯示“數據庫連接成功”#10-通過【pdo-mysql方式】測試PHP連接MySQL是否正常
#10.1-進入Nginx的網站配置路徑
cd /usr/share/nginx/html/
#10.2-創建并編輯mysqli.php文件
vi pdo-mysql.php#pdo-mysql.php文件中連接mysql數據的代碼(保存并退出)
<?php
try{
$pdo=new pdo('mysql:host=127.0.0.1;port=3336;dbname=mysql','root','abc123456');
}catch(PDDException $e){
echo "pdo方式連接數據庫失敗"+$e;
}
echo "pdo方式連接數據庫成功";
?>#10.3-在瀏覽器輸入Nginx所在服務器的IP地址/pdo-mysql.php即【ip/pdo-mysql.php】(如:192.168.1.9/pdo-mysql.php)查看是否顯示“pdo方式連接數據庫成功”
現在在瀏覽器上輸入Nginx所在服務器的IP地址/phpinfo.php即【服務器IP/phpinfo.php】(如:192.168.1.9/phpinfo.php)
????????注意:如果我們在瀏覽器訪問(192.168.1.9/phpinfo.php)并沒有正常顯示php內容,且提示“File not fount”時的排查解決思路:進入Nginx服務器并查看報錯日志;分析報錯日志。
#進入Nginx服務器并查看報錯日志;分析報錯日志詳細排查解決流程:#1-查看當前服務器的Nginx的默認目錄配置、報錯日志文件命令
nginx -V#2-根據查找到的nginx報錯日志文件打開查看
tail -f /var/log/nginx/error.log#3-通過查看Nginx的報錯日志文件可以清晰的看到報錯日志是“FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream”;我們若不清楚這個報錯信息可以將這個報錯內容粘貼到百度查看即可查看到解決方法【該錯誤的含義是php-fpm的FastCGI無法響應Nginx反向代理過來的內容,在結合瀏覽器界面上顯示的沒有發現我們訪問的phpinfo.php文件】(總結一下這個問題的原因就是:我們在Nginx上創建的phpinfo.php所在的路徑不對,導致Nginx沒有找到這個文件;只需要將這個文件在Nginx正確讀取的網站路徑下配置就可以解決了)#4-查找Nginx對應的正確網站路徑(是【/usr/share/nginx/html】,接著在該路徑下重新創建phpinfo.php文件)
nginx -V
cd /usr/share/nginx/html
vi phpinfo.php#phpinfo.php文件的內容是
<?php phpinfo(); ?>#5-再次訪問【ip/phpinfo.php】(如:192.168.1.9/phpinfo.php)即可成功顯示php的版本配置信息內容
到這里恭喜你配置Nginx支持php-fpm解析成功了!!!
《1》接下來是通過【mysqli方式 】測試php連接mysql數據庫是否正常:
????????在瀏覽器輸入Nginx所在服務器的IP地址/mysqli.php即【ip/mysqli.php】(如192.168.1.9/mysqli.php)若顯示“數據庫連接成功”則表示php連接mysql沒有問題(如下圖所示),否則就是有問題的(具體的問題需要查看Nginx的錯誤日志【tail -f /var/log/nginx/error.log】)
《2》接下來是通過【pdo-mysql方式 】測試php連接mysql數據庫是否正常:
?????????在瀏覽器輸入Nginx所在服務器的IP地址/pdo-mysql.php即【ip/pdo-mysql.php】(如192.168.1.9/pdo-mysql.php)若顯示“pdo方式連接數據庫成功”則表示php連接mysql沒有問題(如下圖所示),否則就是有問題的(具體的問題需要查看Nginx的錯誤日志【tail -f /var/log/nginx/error.log】)
二、在LNMP環境下部署WordPress網站項目
????????本文以wordpress為例,介紹下在LNMP環境下,如何部署和使用這套博客系統,WordPress 是一個基于 PHP 和 MySQL 的開源內容管理系統(CMS),用戶可以免費使用、修改和分發,安裝完成后,通過后臺管理界面進行網站的配置和內容管理。
#在LNMP環境下載安裝部署應用項目WordPress詳細操作流程#1-進入/data目錄然后從WordPress網站下載安裝包
cd /data
wget https://cn.wordpress.org/wordpress-6.8.2-zh_CN.tar.gz#2-將下載好的WordPress安裝包解壓到Nginx網站目錄下(/usr/share/nginx/html/)
tar -zxvf wordpress-6.8.2-zh_CN.tar.gz -C /usr/share/nginx/html#3-進入Nginx的默認網站目錄下(可以查看到有一個名為wordpress的文件夾里面就是全部的php網站內容)
cd /usr/share/nginx/html/
ls
cd ./wordpress/
ll#4-在瀏覽器輸入NginxIP/wordpress即可訪問(若不能訪問到安裝界面則在后面添加上index.php就可以了)
192.168.1.9/wordpress#5-在mysql數據庫中創建wordpress的數據庫
/usr/local/mysql/mysql-8.4.6/bin/mysql -uroot -p
create database wordpress;#6-在Nginx的默認網站路徑下的wordpress網站中創建【wp-config.php】文件并填寫內容
vi /usr/share/nginx/html/wordpress/wp-config.php#6.1-在Nginx的默認網站路徑下的wordpress網站中創建【wp-config.php】文件對應的內容
<?php
/*** The base configuration for WordPress** The wp-config.php creation script uses this file during the installation.* You don't have to use the website, you can copy this file to "wp-config.php"* and fill in the values.** This file contains the following configurations:** * Database settings* * Secret keys* * Database table prefix* * ABSPATH** @link https://developer.wordpress.org/advanced-administration/wordpress/wp-config/** @package WordPress*/// ** Database settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define( 'DB_NAME', 'wordpress' );/** Database username */
define( 'DB_USER', 'root' );/** Database password */
define( 'DB_PASSWORD', 'abc123456' );/** Database hostname */
define( 'DB_HOST', '127.0.0.1:3336' );/** Database charset to use in creating database tables. */
define( 'DB_CHARSET', 'utf8mb4' );/** The database collate type. Don't change this if in doubt. */
define( 'DB_COLLATE', '' );/**#@+* Authentication unique keys and salts.** Change these to different unique phrases! You can generate these using* the {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org secret-key service}.** You can change these at any point in time to invalidate all existing cookies.* This will force all users to have to log in again.** @since 2.6.0*/
define( 'AUTH_KEY', 'SXfAJ2,9cW^4[%U/2*}p!2`wa_Nfv:.}:s$a-/(M){cPO{YX1O7];:xFcqjirnn#' );
define( 'SECURE_AUTH_KEY', '[orgrI*qeAlv10NT6yvLN|KYZ4i8km;X9I%M5=X_x;D*YxE.W`G8zHf-CIW-i$Dj' );
define( 'LOGGED_IN_KEY', '[0&^_kfTzSk/&8{li3V+M#qt@,T@E;Z*wO>kHEwKV,eM6tFbT$0dZSV+;m|AjOur' );
define( 'NONCE_KEY', 'EIEx?o`;AM@4{aD/V:(to%#)0Xv1=>Z?X!a}mK7$!FrbRoj|1>nnj+**yuejAT~<' );
define( 'AUTH_SALT', 'qd#3G(O:1s?Y<3LKZii ?!&sN@j7jDpa%sej*Po%C}>EUAk!p?@BltS+tbyT*;]L' );
define( 'SECURE_AUTH_SALT', '$LvzuK:/t7_.`SGDCp946r?)*x%srjJreh]z+p4bYCq*rQ <DL98Pe,a%,oS}?S!' );
define( 'LOGGED_IN_SALT', 'rppE.fpZ7MZlaJb.fJU@-^p;4-ObSZg`ay{P>4^d%m1IV`vC$KiMc++1[[s8t*9q' );
define( 'NONCE_SALT', ']=s+s^ 8rI=q++-&$e,]_#>s,W9E?-8ou-kE==|m_wIA->9u{qoF);Dmf+VZ1(/l' );/**#@-*//*** WordPress database table prefix.** You can have multiple installations in one database if you give each* a unique prefix. Only numbers, letters, and underscores please!** At the installation time, database tables are created with the specified prefix.* Changing this value after WordPress is installed will make your site think* it has not been installed.** @link https://developer.wordpress.org/advanced-administration/wordpress/wp-config/#table-prefix*/
$table_prefix = 'wp_';/*** For developers: WordPress debugging mode.** Change this to true to enable the display of notices during development.* It is strongly recommended that plugin and theme developers use WP_DEBUG* in their development environments.** For information on other constants that can be used for debugging,* visit the documentation.** @link https://developer.wordpress.org/advanced-administration/debug/debug-wordpress/*/
define( 'WP_DEBUG', false );/* Add any custom values between this line and the "stop editing" line. *//* That's all, stop editing! Happy publishing. *//** Absolute path to the WordPress directory. */
if ( ! defined( 'ABSPATH' ) ) {define( 'ABSPATH', __DIR__ . '/' );
}/** Sets up WordPress vars and included files. */
require_once ABSPATH . 'wp-settings.php';
注意:在這一步點擊【安裝WordPress】前一定要先復制一份密碼框的內容做備份,否則第一次登錄的密碼那里你都不知道密碼就無法登錄了!!!
三、LNMP環境下給Web開啟https
?3.1、HTTP與HTTPS
序號 | 說明 |
1 | HTTP是互聯網上應用最為廣泛的一種網絡協議,是一個客戶端和服務器端請求和應答的標準(TCP),HTTP協議傳輸的數據都是未加密的,也就是明文的,因此使用HTTP協議傳輸隱私信息非常不安全。 |
2 | HTTPS是以安全為目標的HTTP通道,簡單講是HTTP的安全版本,HTTPS協議是利用SSL+HTTP協議建立安全信道,加密數據包,提供身份認證的網絡協議,要比http協議安全。 |
HTTPS和HTTP的區別 | |
1 | http是超文本傳輸協議,信息是明文傳輸,https則是具有安全性的ssl加密傳輸協議。 |
2 | http和https使用的是完全不同的連接方式,用的端口也不一樣,前者是80,后者是443。 |
3 | 使用https協議需要申請SSL證書,證書有收費和免費的。 |
現在幾乎所有的網站都開啟了https協議,所以使用https已經是個趨勢。 |
?3.2、SSL證書的獲取
關于證書完整申請的流程如下:
????????購買域名--->購買云主機(可獲取到公網IP)--->工信部備案域名(備案需要域名和可解析的公網IP地址,最快兩周內即可完成備案)--->備案成功后,就可以做域名解析了--->購買SSL證書--->在云主機部署網站程序,加載免費證書。
????????注意:商業CA機構頒發證書時,需要綁定公網域名(即:在申請SSL證書之前,你的域名已經申請好了,并且也做了域名備案和解析,否則無法申請SSL證書)。 ???????
? ? ? ? 現在很多網站都提供免費的SSL證書(如:阿里云?的數字證書服務,可以一次申請3個月免費的SSL證書,過期后,可繼續再次申請3個月的免費證書),申請方式如下:
?3.3、綁定SSL證書到Nginx
????????將會申請好的證書綁定到我們服務器的Nginx配置上即可,在Nginx上配置ssl證書,需要在nginx.conf中添加一個server段,內容如下:
#1-在Nginx的配置文件路徑創建一個證書的文件夾ssl,然后將SSL證書上傳到Nginx的配置文件所在路徑下的ssl中(如:/etc/nginx/)
cd /etc/nginx/
mkdir ssl#2-編輯Nginx的配置文件
vi /etc/nginx/nginx.conf#2.1-編輯Nginx啟用SSL證書的配置內容server{listen 443 ssl;listen [::]:443 ssl;root /usr/share/nginx/html;server_name ck.site www.ck.site;ssl_certificate ssl/ck.site.pem;ssl_certificate_key ssl/ck.site.key;ssl_prefer_server_ciphers on;ssl_protocols TLSv1 TLSv1.1 TLSv1.2;ssl_ciphers "HIGH:!aNULL:!MD5";add_header X-Frame-Options DENY;add_header X-Content-Type-Options nosniff;add_header X-Xss-Protection 1;location / {root html;index index.html index.htm index.php;}location ~ \.php$ {root html;fastcgi_pass 127.0.0.1:9000;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;include fastcgi_params;}error_page 404 /404.html;location = /404.html {}error_page 500 502 503 504 /50x.html;location = /50x.html {}}#3-驗證修改后的Nginx的配置文件nginx.conf是否正確
nginx -t#4-查看系統當前的Nginx進程獲取到Nginx的父進程PID編號(如:5035)
ps -ef | grep nginx#5-在不影響Nginx正常業務處理的情況下重啟Nginx
kill -HUP 5035#6-在瀏覽器輸入域名訪問即可查看到效果
?3.4、配置Nginx只能通過域名訪問不能使用IP訪問
#配置Nginx只能通過域名(如:ck.site)訪問不能使用IP訪問的配置流程#1-在Nginx的配置文件所在路徑中(如:/etc/nginx/)
cd /etc/nginx/#2-編輯Nginx的配置文件
vi /etc/nginx/nginx.conf#3-實現只能通過域名(如:ck.site)訪問不能使用IP訪問的nginx配置內容server {listen 80 default_server;listen [::]:80 default_server;server_name _;# 當用IP訪問時,返回500錯誤碼#return 500;#把IP和其他域名訪問的流量永久重定向到我們的域名return 301 https://ck.site$request_uri;}server {listen 443 ssl default_server;listen [::]:443 ssl default_server;ssl_certificate ssl/ck.site.pem;ssl_certificate_key ssl/ck.site.key;server_name _;#return 500;#把IP和其他域名訪問的流量永久重定向到我們的域名return 301 https://ck.site$request_uri;}server {listen 80;listen [::]:80;listen 443;listen [::]:443;server_name ck.site www.ck.site;#將IP和其他域名訪問的流量永久重定向到我們的域名中return 301 https://$server_name$request_uri;location / {root /usr/share/nginx/html;#根據需要設置訪問白名單(這里只允許192.168.1網段與192.168.3網段的設備訪問)allow 192.168.1.0/24;allow 192.168.3.0/24;deny all;}}#4-驗證修改后的Nginx的配置文件nginx.conf是否正確
nginx -t#5-查看系統當前的Nginx進程獲取到Nginx的父進程PID編號(如:5035)
ps -ef | grep nginx#6-在不影響Nginx正常業務處理的情況下重啟Nginx
kill -HUP 5035#7-在瀏覽器輸入域名訪問即可查看到效果
????????如果要在本地的Windows系統使用自己的域名測試,則需要進入【C:\Windows\System32\drivers\etc】路徑,將該路徑下的【hosts】文件復制一份到桌面上,然后使用文本編輯器打開輸入自己的域名及其IP地址后保存;然后在將桌面上修改好的這個hosts文件復制粘貼到【C:\Windows\System32\drivers\etc】路徑下替換原有的hosts文件即可。
注意,在正式修改Windows系統的hosts文件前先復制一份作為備份。