day13-LNMP、FASTCGI

LNMP、FASTCGI
LNMP(Linux,nginx,mysql,php)
yum -y groupinstall "Development libraries" "Development tools" "X Software Development"
yum –y install gcc openssl-devel pcre-devel zlib-devel
 
- 安裝nginx
- 安裝mysql
    - yum –y install cmake
    - useradd –s /sbin/nologin mysql
    - 讀軟件包中的安裝文檔INSTALL-SOURCE
- 安裝PHP
    - mhash(哈希函數)、libiconv(編碼轉換)、libmcrypt(加密庫)
 
tar xf mhash-0.9.9.9.tar.gz
 cd mhash-0.9.9.9
 ./configure
make && make install
 
tar xf libiconv-1.14.tar.gz
 cd libiconv-1.14
 ./configure
 
make && make install
 
tar xf libmcrypt-2.5.7.tar.gz
 cd libmcrypt-2.5.7
./configure
make && make install
 ldconfig -v
 cd libltdl/
 
./configure --with-gmetad --enable-gexec --enable-ltdl-install
 
 make && make install
 
ln -sv /usr/local/lib/libmcrypt* /usr/lib
ln -sv /usr/local/lib/libmhash* /usr/lib
ln -sv /usr/local/lib/libicon* /usr/lib
 
ldconfig
 
WINDOWS中全部的動態連接庫DLL文件 c:\windows\system32\*.dll
 
linux的庫文件(so文件),通常會存放在/lib/,/usr/lib/
 
ln –sv /usr/local/lib/libmcrypt* /usr/lib/        軟連接
 
ln –sv /usr/local/lib/libmhash.* /usr/lib/
 
方法一
默認咱們安裝的mhash,libmcrypt,libiconv,生成的庫文件存放在/usr/local/lib,所以爲了讓系統識別這些庫,能夠將/usr/local/lib/相關的庫文件,作連接放到系統庫目錄下。
方法二
vim /etc/ld.so.conf
將安裝庫的文件路徑寫入該配置文件裏
輸入完後使用ldconfig    刷新
提示:安裝mysql時若是提示not find curses則須要yum list |grep curses
#yum –y install ncurses-devel
當第二次再cmake時,須要刪除以前的緩:rm CMakeCache.txt
安裝PHP
yum install -y libxml2-devel
/etc/init.d/mysqld start
tar xf php-5.6.26.tar.bz2
cd php-5.6.26
./configure \
> --prefix=/usr/local/php5 \
> --with-config-file-path=/usr/local/php5/etc \
> --with-mysql=mysqlnd   \
> --with-mysqli=mysqlnd \
>--with-pdo-mysql=mysqlnd
> --enable-fpm --enable-mbstring
make ZEND_EXTRA_LIBS='-liconv'
make install
cp php.ini-production /usr/local/php5/etc/php.ini
cp php-fpm.conf.default php-fpm.conf
useradd -s /sbin/nologin www
1 [root@localhost etc]# cat php-fpm.conf
2 [global]
3 pid = run/php-fpm.pid
4 error_log = log/php-fpm.log
5 log_level = error
6 daemonize = yes
7 [www]
8 user=www
9 group=www
10 listen = 127.0.0.1:9000
11 pm = dynamic
12 pm.max_children = 2
13 pm.start_servers = 1
14 pm.min_spare_servers = 1
15 pm.max_spare_servers = 2
cd php-5.6.26/sapi/fpm/
cp init.d.php-fpm /etc/rc.d/init.d/php-fpm
 chmod +x /etc/rc.d/init.d/php-fpm
/etc/init.d/php-fpm start
nginx 配置文件
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;
}
 
nginx+fastcgi
 
CGI——公共網關接口Common Gateway Interface
一、HTTP服務器與客戶端上的程序進行"交談"的一種工具
二、CGI能夠用任何一種編寫,只要這種語言具備標準輸入、輸出和環境變量,如php,perl等
三、程序須運行在網絡服務器上
工做流程
- Web Sever啓動時載入FastCGI進程管理器
- FastCGI進程管理器初始化,啓動多個CGI解釋器進程
- 當客戶端請求到達WEB Server時
 
FastCGI進程管理器選擇並鏈接到一個CGI解釋器
- FasstCGI子進程完成處理後返回結果
將標準輸出和錯誤信息從同一鏈接返回WEB SERVER
FastCGI缺點
內存消耗大
 
由於是多進程,因此比CGI多線程消耗更多的服務器內存,PHP-CGI解釋器每進程消耗7至25兆內存,將這個數字以50或100就是很大的內存數。
 
    nginx+PHP(FastCGI)服務器在3萬併發鏈接下
    開啓的10個nginx進程消耗150M內存(10*15M)
    開啓的64個php-cgi進程消耗1280內存(20M*64=1280M)
 
vim /usr/local/php5/etc/php-fpm.conf
 
listen=127.0.0.1:9000
 
pm=dynamic
 
pm.max_children=32     進程上限
pm.start_servers=15    初始化開幾個進程
pm.min_spare_servers=5    最小空閒進程
pm.max_spare_servers=32    最好大空閒進程
 
cp /php安裝包/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
server php-fpm start
 
修改nginx(調用FastCGI、php-fpm)
能夠用php頁面測試下
<?php
phpinfo();
?>
 
測試數據庫
<?php
$links=mysql_connect("localhost","root","");
if($link){
echo "link datebase ok!!!";
}
else{
echo "link database no!!!";
}
?>
 
基礎知識
  • 什麼是地址重寫
  1. 得到一個進入的URL請求而後把它從新寫成服務器能夠處理的另外一個URL的過程
  • 地址重寫的好處
  1. 縮短URL,隱藏實際路徑提升安全性.
  2. 易於用戶記憶和鍵入.
  3. 易於被搜索引擎收錄.
  • 常見網站應用場景
  1. 當網站文件移動或文件目錄名稱發現改變,出於SEO須要,你須要保持舊的URL;
  2. 網站改版了,網站導航和連接發生變化,爲了繼續持有原連接帶來的流量,你須要保持舊的URL
 
rewrite模塊
  • rewrite語句
rewrite regex replacement flag
flag:break、last、redirect、permanent
last: 中止執行其餘重寫規則,根據URI繼續搜索其餘location
break:中止執行其餘的重寫規則,完成本次請求
redirect:302臨時重定向,地址欄改變,爬早不更新URI
permanent:301永久重定向,地址欄改變,爬是更新URI
  • if(條件){……}
條件判斷
  • rewwrite_log:error log 中記錄重寫日誌
rewrite_log on |off
正則表達式
  • nginx的重寫模塊是一個簡單的正則表達式匹配
所以,依賴PCRE庫
  • 語法格式
rewrite regex replacement flag
  • 正則表達匹配模式以下:
  1. 區分大小寫匹配:~
  2. 不區分大小寫匹配:~*
  3. 區分大小寫匹配:!~
  4. 不區分大小寫不匹配:!~*
  • 正則表達式匹配模式以下:
  1. 判斷文件是否存在:-f
  2. 判斷目錄是否存在:-d
  3. 判斷文件是否可執行:-x
  4. 判斷文件、目錄、鏈接是否存在:-e
 
要求:a.html>>>b.html
cat /usr/local/nginx/conf/nginx.conf
location/ {
     root html;
     index index.html;
     rewrite "/a*.html$" /b.html;
}
例1:無條件重定向
配置文件rewrite /a.html /b.html;
127.0.01/a.html 顯示的是b.html  uri不變     //頁面跳轉    內容變以,連接不變
配置文件rewrite /a.html /b.html permanent;
127.0.01/a.html 顯示的是b.html  uri會變
 
例2:域名跳轉
當訪問服務器根的時候,自動跳轉到bbs.test.com
 
例3:根據瀏覽器返回不一樣的頁面
if ($http_user_agent ~ Chrome){
                rewrite ^(.*)$ /curl/$1 break;}      //根據瀏覽器返回不一樣的頁面
例:http://www.test.com/a.html>>>>http://www.test.com/curl/a.html
 
例4:改變音樂文件存儲路徑
rewrite ^/(download/.*)/media/(.*)\..*$/$1/mp3/$2.mp3 break;    //改變音樂文件存儲路徑
 
例5:將gif或jpg轉成logo.png
rewrite \.(gif|jpg)$ /logo.png;
 
例6:當訪問資源不存在時,重寫向到指定頁面
if(!-e $request_filename){    //當訪問資源不存在時,重寫向到指定頁面
rewrite ^/ http://www.test.com/none.html;    }    //指定一個頁面  在根目錄下創建一個none.html文件
 
例7:防盜鏈語句
location ~* \.(gif|jpg|png|swf|flv)$ {
    valid_referers none blocked www.test.com;    //不是從www.test.com裏訪問都會指向到403.html
    if ($invalid_referer){
    rewrite ^/ http://www.test.com/403.html; }
 
none表示沒有Referer,也就是直接訪問
    直接在瀏覽器打開
blocked表示Referer,但內容被防火牆或代理刪除
server_names就是最後的域名
    能夠使用*.test.com來表示二級域名
http請求頭部信息
HTTP Referer是header的一部分,當瀏覽器向WEB服務器發送請求的時候,通常會帶上Referer,告訴服務器我是從哪一個頁面連接過來的,服務器籍此能夠得到一些信息用於處理.
相關文章
相關標籤/搜索