LNMP动态网站
LNMP基礎知識
什么是LNMP
- 主流的企業網站平臺之一
- L:Linux操作系統
- N:Nginx網站服務軟件
- M:MySQL.MariaDB數據庫
- P:網站開發語言(PHP.Perl.Python)
靜態網站和動態網站區別
- 靜態網頁:
(1)靜態網頁不能簡單地理解成靜止不動的網頁,他主要指的是網頁中沒有程序代碼,只有HTML(即:超文本標記語言),一般后綴為.html,.htm,或者.xml等。雖然靜態網頁的頁面一旦做成,內容就不會再改變了。但是,靜態網頁也包括一些能動的部分,這些主要是一些GIF動畫等
(2)靜態網頁的打開,用戶可以直接雙擊,并且不管任何人任何時間打開的頁面的內容都是不變的。
- 動態網頁:
(1)動態網頁是指跟靜態網頁相對的一種網頁編程技術。動態網頁的網頁文件中除了HTML標記以外,還包括一些特定功能的程序代碼,這些代碼可以使得瀏覽器和服務器可以交互,所以服務器端根據客戶的不同請求動態的生成網頁內容。
即:動態網頁相對于靜態網頁來說,頁面代碼雖然沒有變,但是顯示的內容卻是可以隨著時間、環境或者數據庫操作的結果而發生改變的。
(2)動態網頁,與網頁上的各種動畫、滾動字幕等視覺上的動態效果沒有直接關系,動態網頁也可以是純文字內容的,也可以是包含各種動畫的內容,這些只是網頁具體內容的表現形式,無論網頁是否具有動態效果,只要是采用了動態網站技術(如PHP、ASP、JSP等)生成的網頁都可以稱為動態網頁。
部署LNMP環境
問題
- 安裝部署Nginx、MariaDB、PHP環境
- 安裝部署Nginx、MariaDB、PHP、PHP-FPM;
- 啟動Nginx、MariaDB、FPM服務;
- 并測試LNMP是否工作正常。
方案
目前的網站一般都會有動態和靜態數據,默認nginx僅可以處理靜態數據,用戶訪問任何數據都是直接返回對應的文件,如果如果訪問的是一個腳本的話,就會導致直接返回一個腳本給用戶,而用戶沒有腳本解釋器,也看不懂腳本源代碼!網站拓撲如圖-1所示。
因此需要整合LNMP(Linux、Nginx、MySQL、PHP)實現動態網站效果。
LNMP在CentOS系統中,源碼安裝Nginx,使用RPM包安裝MariaDB、PHP、PHP-FPM軟件。
操作過程中需要安裝的軟件列表如下:
nginx
mariadb、mariadb-server、mariadb-devel
php、php-fpm、php-mysql
備注:mariadb(數據庫客戶端軟件)、mariadb-server(數據庫服務器軟件)、mariadb-devel(其他客戶端軟件的依賴包)、php(解釋器)、php-fpm(進程管理器服務)、php-mysql(PHP的數據庫擴展包)。
步驟一:安裝軟件
1.安裝nginx依賴包,源碼安裝Nginx
2.安裝MariaDB
Mariadb在新版RHEL7光盤中包含有該軟件,配置yum源后可以直接使用yum安裝
3.安裝php和php-fpm
[root@proxy ~]# yum -y install php php-mysql [root@proxy ~]# yum -y install php-fpm步驟二:啟動服務
1.啟動Nginx服務
這里需要注意的是,如果服務器上已經啟動了其他監聽80端口的服務軟件(如httpd),則需要先關閉該服務,否則會出現沖突。
2.啟動MySQL服務
[root@proxy ~]# systemctl start mariadb //啟動服務器 [root@proxy ~]# systemctl status mariadb //查看服務狀態 [root@proxy ~]# systemctl enable mariadb //設置開機啟動3.啟動PHP-FPM服務
[root@proxy ~]# systemctl start php-fpm //啟動服務 [root@proxy ~]# systemctl status php-fpm //查看服務狀態 [root@proxy ~]# systemctl enable php-fpm //設置開機啟動4.驗證服務是否啟動成功
[root@proxy ~]# ss -ntulp | grep :80 #nginx端口 tcp LISTEN 0 128 *:80 *:* users:(("nginx",pid=3951,fd=6),("nginx",pid=3950,fd=6)) [root@proxy ~]# ss -ntulp | grep :3306 #mariadb端口 tcp LISTEN 0 50 *:3306 *:* users:(("mysqld",pid=4292,fd=14)) [root@proxy ~]# ss -ntulp | grep :9000 #php-fpm端口 tcp LISTEN 0 128 127.0.0.1:9000 *:* users:(("php-fpm",pid=4361,fd=0),("php-fpm",pid=4360,fd=0),("php-fpm",pid=4359,fd=0),("php-fpm",pid=4358,fd=0),("php-fpm",pid=4357,fd=0),("php-fpm",pid=4355,fd=6))FastCGI工作原理
FastCGI簡介
FastCGI技術目前支持語言有PHP.C/C++.Java.Perl.Python.RUby等
工作流程
- WebServer啟動時載入FastCGI進程管理器
- FastCGI進程管理器初始化,啟動多個解釋器進程
- 當客戶端請求到達Web Server時,FastCGI進程管理器選擇并連接到一個解釋器
- FastCGI子進程完成處理后返回結果,將標準輸出和錯誤信息從同一連接返回Web Server
FastCGI缺點
- 因為是多進程,所以比CGI多線程消耗更多的服務器內存,PHP-CGI解釋器每進程小號7至25兆內存,將這個數字乘以50或100就是很大的內存數
- Nginx+PHP(FastCGI)服務器在3萬并發連接下開10個Nginx進程消耗150M內存(1015M),開64個php-cgi進程消耗1280M內存(20M64)
配置FastCGI
[root@proxy ~]# vim /etc/php-fpm.d/www.conf [www] listen = 127.0.0.1:9000 //php端口號 listen.allowed_clients = 127.0.0.1 pm.max_children = 50 //最大進程數量 pm.start_servers = 5 //最小進程數量構建LNMP平臺
問題:
通過調整Nginx服務端配置,實現以下目標:
配置Fast-CGI支持PHP網頁
創建PHP測試頁面,測試使用PHP連接數據庫的效果
方案:
使用2臺RHEL7虛擬機,其中一臺作為LNMP服務器(192.168.4.5)、另外一臺作為測試用的Linux客戶機(192.168.4.10),如圖-2所示。
Nginx結合FastCGI技術即可支持PHP頁面架構,如圖-3所示。
配置nginx,實現兩個如果:
1.如果用戶訪問的是靜態網頁,則直接返回
2.如果用戶訪問的是動態網頁,則交給php
location匹配用戶的地址欄(從域名后面開始匹配),支持正則,在同一個網站中可以有多個location,"location /"的優先級最低
什么是動靜分離?
是指動態網站是一種處理方式靜態網站是一種處理方式,兩種處理方式不一樣叫動靜分離.
動靜分離是指在web服務器架構中,將靜態頁面與動態頁面或者靜態內容接口和動態內容接口分開不同系統訪問的架構設計方法,進而提升整個服務訪問性能和可維護性。
步驟一:php-fpm配置文件
1.查看php-fpm配置文件
步驟二:修改nginx配置文件并啟動
[root@proxy conf]# vim /usr/local/nginx/conf/nginx.conf35 server {36 listen 80;37 server_name localhost;43 location / {44 root html;45 index index.php index.html index.htm;#設置默認首頁為index.php,當用戶在瀏覽器地址欄中只寫域名或IP,不說訪問什么頁面時,服務器會把默認首頁index.php返回給用戶46 } #靜態網頁65 location ~ \.php$ {66 root html;67 fastcgi_pass 127.0.0.1:9000; #將請求轉發給本機9000端口,PHP解釋器68 fastcgi_index index.php; #dd掉原本的68行69 include fastcgi.conf; #加載其他的配置文件70 } #動態網頁[root@proxy conf]# /usr/local/nginx/sbin/nginx -s reload #請先確保nginx是啟動狀態,否則運行該命令會報錯,報錯信息如下: #[error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory)步驟三:創建PHP頁面,測試LNMP架構能否解析PHP頁面
1.創建PHP測試頁面1,可以參考lnmp_soft/php_scripts/test.php:
2.客戶端訪問php頁面
[root@localhost]$ firefox 192.168.4.5/test.php訪問得到以下頁面:
3.連接并查詢mariadb數據庫
可以參考lnmp_soft/php_scripts/mysql.php:
4.客戶端訪問php頁面
[root@localhost ~]$ firefox 192.168.4.5/mysql.phpLNMP常見問題
Nginx的默認訪問日志文件為/usr/local/nginx/logs/access.log
Nginx的默認錯誤日志文件為/usr/local/nginx/logs/error.log
如果動態網站訪問失敗,可用參考錯誤日志,查找錯誤信息。
如果關閉php服務,此時訪問動態網頁是會報錯的
php常見問題
php文件要以分號為結尾,如果腳本內容沒有分號刷新頁面無法報錯
PHP默認錯誤日志文件為/var/log/php-fpm/www-error.log
此時訪問到的頁面如下
LNMP總結
1.nginx,php-fpm,mariadb服務
2.nginx.conf配置
3.test.php腳本語法
LNMP
user(客戶端)---->nginx---->PHP---->mysql(mariadb)
地址重寫
什么是地址重寫
- 獲得一個來訪的URL請求,然后改寫成服務器可以處理的另一個URL的過程
地址重寫的好處
- 縮短URL隱藏實際路徑提高安全性
- 易于用戶記憶和鍵入
- 易于被搜索引擎收錄
rewrite語法
- rewrite基本語句
rewrite regex replacement flag
(regex表示支持正則)
if (條件) {…}
正則表達式
正則表達式匹配模式如下:
- 區分大小寫匹配: ~
- 不區分大小寫匹配: ~*
- 區分大小寫不匹配: !~
- 不區分大小寫不匹配: !~*
rewrite選項
rewrite語句
- rewrite regex replancement flag
- flag:停止執行其他重寫規則,根據URL繼續搜索其他location,地址欄不變
- break: 停止執行其他的重寫規則,完成本次需求
- redirect: 302臨時重定向,地址欄改變,爬蟲不更新URL
- permanent: 301永久重定向,地址欄改變,爬蟲更新URL
地址重寫案例
問題:
通過調整Nginx服務端配置,實現以下目標:
所有訪問a.html的請求,重定向到b.html;
所有訪問192.168.4.5的請求重定向至www.360.cn;
所有訪問192.168.4.5/下面子頁面,重定向至www.360.cn/下相同的頁面;
實現firefox與curl訪問相同頁面文件,返回不同的內容。
方案:
關于Nginx服務器的地址重寫,主要用到的配置參數是rewrite:
rewrite regex replacement flag
rewrite 舊地址 新地址 [選項]
案例
1.訪問http://www.360buy.com會自動跳轉至http://www.jd.com。
2.訪問http://www.baidu.com會自動跳轉至https://www.baidu.com。
步驟一:修改配置文件(訪問a.html重定向到b.html)
1.修改nginx的服務配置
2.重新加載配置文件
[root@proxy nginx]# echo hahahahhah > /usr/local/nginx/html/b.html [root@proxy nginx]# /usr/local/nginx/sbin/nginx -s reload ##此時訪問a.html實際訪問到的是b.html3.客戶端訪問測試
[root@localhost ~]$ firefox 192.168.4.5/a.html訪問頁面如下
步驟二:訪問a.html重定向到b.html(跳轉地址欄)
1.修改Nginx服務配置:
2.重起服務
[root@proxy nginx]# /usr/local/nginx/sbin/nginx -s reload3.客戶端訪問
[root@localhost ~]$ firefox 192.168.4.5/a.html此時客戶端訪問到的頁面是b.html,觀察地址欄變化
步驟三:修改配置文件(訪問192.168.4.5的請求重定向至www.cn)
1.修改Nginx服務配置
2.重起服務
[root@proxy nginx]# /usr/local/nginx/sbin/nginx -s reload3.客戶端訪問
[root@localhost ~]$ firefox 192.168.4.5 #此時訪問192.168.4.5則自動跳轉到www.360.cn客戶端訪問到的頁面如下
步驟四:修改配置文件(訪問192.168.4.5/下面子頁面,重定向至www.360.cn/下相同的頁面)
1.修改Nginx服務配置
2.重起服務
[root@proxy nginx]# vim /usr/local/nginx/conf/nginx.conf3.客戶端訪問
[root@localhost ~]$ firefox 192.168.4.5/download/ [root@localhost ~]$ firefox 192.168.4.5/xxxxx此時客戶端訪問到的頁面如下
步驟五:修改配置文件(實現curl和火狐訪問相同鏈接返回的頁面不同)
用不同的瀏覽器訪問相同的頁面出現不同的結果
crul http://192.168.4.5/test.html
firewall http://192.168.4.5/test.html
1.創建網頁目錄以及對應的頁面文件:
2.修改nginx配置文件
server {listen 80;server_name localhost; #一定要把剛剛的rewrite取消掉if ($http_user_agent ~* firefox) {rewrite ^/(.*) /firefox/$1; } # $http_user_agent為nginx自帶的變量,變量的值表示用戶的信息.瀏覽器版本號等,用客戶信息和Firefox進行比較,如果客戶信息內包含Firefox,則跳轉到相應的Firefox文件搭建出的nginx頁面location / {root html;index index.html index.htm;}3.重起服務
[root@proxy nginx]# /usr/local/nginx/sbin/nginx -s reload4.客戶端訪問頁面
[student@room9pc01 ~]$ curl 192.168.4.5/test.html wo shi Normal wangye [student@room9pc01 ~]$ firefox 192.168.4.5/test.html 此時,用firefox訪問到的頁面與curl訪問到的不同firefox訪問192.168.4.5訪問到的頁面如下:
地址重寫格式【總結】
rewrite 舊地址 新地址 [選項];
last 不再讀其他rewrite
break 不再讀其他語句,結束請求
redirect 臨時重定向
permanent 永久重定向
總結
- 上一篇: 字符串的初值 正则表达式 sed应
- 下一篇: Nginx调度器