1、幾個基本概念php
一、pv 值html
pv 值(page views):頁面的瀏覽量前端
概念:一個網站的全部頁面,在一天內,被瀏覽的總次數。(大型網站一般是上千萬的級別)mysql
二、uv值linux
uv值(unique visitor)獨立訪客nginx
概念:一個網站,在一天內的用戶訪問數。(大型網站一般達10萬以上)web
三、獨立IPsql
概念:一個網站,在一天內,有多少個獨立的ip地址來訪問。thinkphp
鑑於一個局域網對外訪問時都是共用同一個公網IP的,所以UV值通常要略大於獨立ip值shell
能夠經過愛站網 來查詢這些參數值
2、解決高併發思路
若是一個網站的uv,pv,獨立ip變大,則會致使高的併發,這時要對網站分層佈局架構,採用負載均衡。
負載均衡
硬件:立竿見影,效果很是好,價格很是昂貴,好比F5-BIGIP
軟件:lvs(linux virtual server) ,nginx(web服務器,負載均衡)
負載均衡實現策略
(1)輪詢,
負載均衡器把請求輪流轉發給後面的web服務器。
(2)ip哈希,
同一個地址的客戶端,始終請求同一臺主機。
(3)最少鏈接
負載均衡器把請求給負載最小的哪臺服務器。
架構圖以下:
若是併發數繼續增大,還能夠藉助CDN來架構
3、nginx的介紹
一、經常使用web服務器
apache:功能完善,歷史悠久,模塊支持很是豐富,屬於重量級產品,比較耗費內存。
缺點:處理每個php比較費資源,致使若是高併發時會耗費服務器資源沒法處理更多請求。
lighttpd:內存開銷低,cpu佔用率低,效能好,模塊豐富等特色,輕量級web服務器。
nginx:省資源,省cpu,因此在高併發時可以處理更多的請求,高端能達到3萬到5萬的併發量。
IIS windows自帶的web服務器軟件
Nginx的兩大應用:
(1) http的服務器
(2)代理服務器
正向代理
反向代理
二、選擇nginx理由
(1)它能夠高併發鏈接,官方測試可以支撐5萬併發鏈接,在實際生產環境中能夠支撐2到4萬併發鏈接。
(2)內存消耗少
Nginx+php(FastCGI)服務器在3萬併發鏈接下,開啓的10個Nginx進程消耗150MB內存(15MB*10=150MB)開啓的64個php-cgi進程消耗1280MB內存(20MB*64=1280MB)
(3)成本低廉
購買F5 BIG-IP ,NetScaler等硬件負載均衡交換機須要10多萬甚至幾十萬人民幣。而Nginx爲開源軟件,能夠免費試用,而且可用於商業用途。
(4)配置文件很是簡單:通俗易懂,即便非專業管理員也能看懂。
(5)支持 rewrite重寫規則:能根據域名、URL的不一樣,將HTTP請求分到不一樣的後端服務器羣組。
(6)內置的健康檢查功能:若是nginx proxy後端的某臺服務器宕機了,不會影響前端訪問。
(7)節省帶寬,支持gzip壓縮。
(8)穩定性高:用於反向代理,宕機的機率微乎其微。
(9)支持熱部署。在不間斷服務的狀況下,對軟件版本升級。
nginx在反向代理,rewrite規則,穩定性,靜態化文件處理,內存消耗等方面,表現出了很強的優點,選用nginx取代傳統的apache 服務器,將會得到多方面的性能提高。
(8)支持的操做系統
FreeBSD 3.x,4.x,5.x,6.x i386; FreeBSD 5.x,6.x amd64;Linux 2.2,2.4,2.6 i386; Linux 2.6 amd64;Solaris 8 i386; Solaris 9 i386 and sun4u; Solaris 10 i386;MacOS X (10.4) PPC;
4、nginx的搭建
一、安裝
安裝前注意:
模塊依賴性:Nginx的一些模塊須要其餘第三方庫的支持,例如gzip模塊須要zlib 庫,rewrite模塊須要pcre庫,ssl功能須要openssl庫等。
(1) 確保底層庫都已安裝
運行 yum install zlib* pcre* openssl*
(2) 建立一個用戶和用戶組
建立www組與www用戶 ,理論上來說用戶與用戶組的名稱無所謂,但儘可能要有意義
groupadd www
useradd -g www -s /usr/sbin/nologin www
(3) 編譯安裝nginx
第一步:下載nginx
wget
第二步:解壓並進入目錄
tar ….
Cd …
第三步:配置
先查看configure的配置項,並保存成一個幫助文檔
將經常使用的配置項保存成一個安裝腳本文件
Vim nginx_install.sh
內容以下:
./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-http_flv_module --with-http_stub_status_module --with-http_gzip_static_module --with-http_realip_module --with-http_image_filter_module --with-pcre --http-client-body-temp-path=/usr/local/nginx/tmp/client_body_temp --http-fastcgi-temp-path=/usr/local/nginx/tmp/fastcgi_temp --http-proxy-temp-path=/usr/local/nginx/tmp/proxy_temp --http-uwsgi-temp-path=/usr/local/nginx/tmp/uwsgi_temp --http-scgi-temp-path=/usr/local/nginx/tmp/scgi_temp
給sh文件加上可執行的權限
而後執行
第四步:編譯安裝
make && make install
二、管理
(1)查看幫助文檔
Cd /usr/local/nginx/sbin
./nginx -h
(2)啓動nginx
直接執行安裝目錄下的sbin目錄下的nginx
(3)關閉nginx
能夠執行 nginx -s stop 或者 執行 pkill nginx
(4)熱啓動
能夠執行 nginx -s reload (前提是nginx已經在運行中)
擴展:若是想用service 服務名 選項來重啓或中止nginx,能夠按如下步驟操做:
知識點:service 服務名 能操做成功的前提是 /etc/rc.d/init.d目錄下要有與服務名同名的可執行文件
因此咱們能夠在這個目錄下新建nginx文件
vim /etc/rc.d/init.d/nginx
內容:
#!/bin/sh
# chkconfig: - 85 15
# description: nginx is a World Wide Web server. It is used to serve
start() {
echo 'Starting Nginx ...'
/usr/local/nginx/sbin/nginx > /dev/null 2>&1 &
}
stop() {
echo 'Stoping Nginx ...'
/usr/local/nginx/sbin/nginx -s stop > /dev/null 2>&1 &
}
reload() {
echo 'Reloading Nginx ...'
/usr/local/nginx/sbin/nginx -s reload
}
if [ $# -ne 1 ]
then
echo 'please input one params like start|restart|stop|reload'
exit 1
fi
case "$1" in
'start')
start
;;
'stop')
stop
;;
'restart')
stop
sleep 2
start
;;
'reload')
reload
;;
'*')
echo 'please input one params like start|restart|stop|reload'
;;
esac
記得給這個文件添加可執行權限
chmod +x /etc/rc.d/init.d/nginx
加入到開機自啓動:
chkconfig --add nginx
chkconfig --level 345 nginx on
5、虛擬主機配置
一、配置文件介紹
Nginx的配置文件位於安裝目錄下的conf目錄下
能夠用如下命令查看非註釋部分的內容
egrep -v '#|^$' nginx.conf
-v 表明取反(去掉匹配到的內容)
在配置文件中,http段裏面的server段是配置虛擬主機使用的。若是想要配置多個虛擬主機,則就在http段裏面建立多個 server段便可。
注意配置文件中,每一行要使用分號結束,指令與{之間有空格。
Listen 後面能夠是端口號,也能夠是IP:端口號
Server_name 後面能夠是域名,多個域名之間空格隔開,也能夠是IP地址
在 http{}代碼段裏添加 client_max_body_size 200m; 以支持 php 上傳大文件。(請根據本身項目需求來定值)
6、編譯 php與nginx整合
一、編譯安裝php
(1) 第一步:安裝PHP
1) 下載php
shell># cd ~
shell># wget
2) 解壓並進入目錄
shell># tar zxf php-5.6.24.tar.gz
shell># cd php-5.6.24
3) 將configure參數及詳情解析另存爲一個文件,以供學習參考用:
shell># ./configure --help > php_configure.txt
4) 編寫一個輔助shell文件,幫咱們配置php
shell># vim php_install.sh
爲了不寫錯,建議你們直接複製如下內容(都寫在一行上,不要換行):
./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --enable-fpm --enable-opcache --with-zlib-dir --with-bz2 --with-libxml-dir=/usr --with-gd --with-freetype-dir --with-jpeg-dir --with-png-dir --enable-mbstring --with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-pdo-mysql=/usr/local/mysql --with-iconv --disable-ipv6 --enable-static --enable-inline-optimization --enable-sockets --enable-soap --with-openssl --with-curl
以上內容的解釋如圖
把剛剛的shell文件加上可執行權限:
shell># chmod +x ./php_install.sh
5) 執行shell文件進行軟件的配置和環境檢測
shell># ./php_install.sh
6) 編譯軟件而且進行安裝
shell># make && make install
(2) 第二步:配置
1) 複製配置文件
shell># cp php.ini-production /usr/local/php/etc/php.ini
shell># cp sapi/fpm/init.d.php-fpm /etc/rc.d/init.d/php-fpm
賦予其可執行權限
shell># chmod +x /etc/rc.d/init.d/php-fpm
拷貝產生php-fpm的配置文件
shell># cd /usr/local/php/etc
shell># cp php-fpm.conf.default php-fpm.conf
2) 配置php.ini
shell># vim php.ini
· 找到;date.timezone = 修改成 date.timezone = Asia/Shanghai
· 根據本身的需求調整如下選項的值
error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
display_errors = On
max_execution_time = 60
max_input_time = 60
memory_limit = 256M
post_max_size = 256M
upload_max_filesize = 256M
3) 配置php-fpm.conf
shell># vim php-fpm.conf
· 找到user = nobody 和 group = nobody,將nobody改爲www
· 找到listen.owner=nobody和listen.group= nobody,將nobody改爲www
4) 將php-fpm加入服務並自動啓動
shell># service php-fpm start
shell># chkconfig --add php-fpm
shell># chkconfig --level 345 php-fpm on
二、配置nginx支持php
第一步:在nginx.conf中找到location ~ .php$
複製並去掉註釋,將root改爲你的虛擬主機的路徑
保存並重載配置文件,
shell># /usr/local/nginx/sbin/nginx -s reload
在html目錄下新建一個PHP文件,代碼以下:
在瀏覽器輸入php頁面的網址,能夠發現並不能訪問
緣由是官方給的默認配置文件中,
要求要把php文件放到/scripts目錄下。其實這個要求咱們不必定要聽從。
改進的方案以下:
保存並重載
就可讓nginx支持訪問相似http://www.a.com/index.php以及http://www.a.com/index.php?id=5這樣的頁面了。
三、優化nginx配置文件
第二步:優化
若是把全部的server代碼段都放在nginx.conf裏面的話,會讓nginx.conf顯得又臃腫又亂。建議把它們分離去。
例如,直接把全部的server代碼段都剪切到/usr/local/nginx/conf/vhost.conf裏面
而後在nginx.conf裏面換成
include vhost.conf
虛擬主機的代碼都移到了vhost.conf裏面了
至此,nginx.conf已經很優化了,咱們再來優化vhost.conf
第三步:優化vhost.conf
將root語句和 index語句都提取到location外面
第四步:再一次優化vhost.conf
把
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
這兩個語句都剪切到fastcgi.conf裏面去
只留下include fastcgi.conf;
fastcgi.conf文件中新增瞭如下兩句:
至此,nginx已經支持訪問php頁面,而且nginx.conf和vhost.conf已經很優化了。
只是還沒法支持像thinkphp的pathinfo形式的訪問
http://www.a.com/index.php/Admin/public/login
四、與ThinkPHP整合
第一步:將vhost.conf的location ~ .php$ { 的$去掉
能夠發現能支持pathinfo的訪問方式,可是沒法識別出模塊、控制器和方法
而後將location代碼段寫成
location ~ .php {
fastcgi_split_path_info ^(.+.php)(/.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
include fastcgi.conf;
保存並重載nginx
就能夠支持thinkphp的pathinfo形式的訪問
第二步:優化vhost.conf
將這兩句
fastcgi_split_path_info ^(.+.php)(/.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
都剪切到 fastcgi.conf裏面,只留下include fastcgi.conf; 語句便可
第三步:開啓僞靜態功能
在server裏面的location / { 代碼段裏,寫上
try_files $uri /index.php$uri;
保存並重載nginx
就能夠支持thinkphp的rewrite訪問
http://www.a.com/Admin/public/login
7、負載均衡
一、負載均衡原理圖
二、實現一個簡單的負載均衡
服務器列表
本機 192.168.81.1
VM 192.168.81.6
騰訊雲 123.207.231.180
負載均衡器的配置
upstream demo {
server 192.168.81.1;
server 123.207.231.180;
}
server {
listen 80;
server_name fzjh.com;
location / {
proxy_pass http://demo;
proxy_set_header Host $host;
proxy_set_header X-Peal-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}}
而且要確保 fzjh.com要解析到負載均衡器的IP地址
保存配置文件,而且重載
訪問效果: