第四部筆記
php
---私人文章html
- 在性能上佔用的系統資源少;支持更多的併發鏈接(特別是靜態小文件場景下)達到更高的訪問效率;
- 在功能上Nginx不可是一個優秀的Web服務軟件,還能夠做爲反向代理負載均衡及緩存服務使用;
- 在安裝配置上Nginx更爲方便,簡單,靈活;
- Nginx是一個開源的,支持高性能高併發的www服務和代理服務軟件
- Nginx因具備高併發(特別是靜態資源)佔用系統資源少等特性且功能豐富逐漸流行起來
- Nginx不可是一個優秀Web服務軟件,還具備反響代理負載均衡功能和緩存服務功能,與LVS負載均衡及Haoroxy等專業代理軟件相比Nginx部署起來更爲簡單,方便;在緩存功能方便它又相似Squid等專業的緩存服務軟件
- 支持高併發:能支持幾萬併發鏈接(特別是靜態小文件業務環境)
- 資源消耗少:在3萬併發連接下,開啓10個Nginx線程小號的內存不到200MB
- 能夠作HTTP反向代理及加速緩存,即都在均衡功能,內置對RS節點服務器健康的檢查功能,至關於專業的Haproxy軟件或LVS的功能
- 具有Squid等專業緩存軟件等的緩存功能
- 支持異步網絡I/O事件模型epoll(linux2.6+) #跟據epoll實現的Web服務
(1)做爲Web服務軟件前端
Nginx是一個支持高性能高併發的Web服務軟件,它具備不少優秀的特性,做爲Web服務器與Apache相比Nginx可以支持哼多的併發鏈接訪問,但因佔用的資源更少效率更高,在功能上也強大了不少,幾乎不遜色與Apache(動態文件支持更好一些)linux
(2)反向代理或負載均衡服務nginx
在反向代理或負載均衡服務方面,Nginx能夠做爲Web服務,PHP等動態服務及Memcached混村的代理服務器,它具備相似專業反響代理軟件的功能(如Haproxy),同時也是一個宿友的郵件代理服務軟件,但Nginx的代理功能仍是相對簡單了一些,特別不知此話TOP的代理(Nginx1.9.0版本已經開始支持TCP代理了)web
(3)前端業務數據緩存服務---->Web緩存面試
在Web緩存服務方面,Nginx可經過自身的proxy_cache模塊實現類Squid等專業花奴才你軟件的功能正則表達式
###3.3爲何Nginx整體性能比Apache高apache
- Nginx使用最新的epoll(Linux2.6內核)和kqueue(freebsd)異步網絡I/O模型,而Apache使用的是傳統的select模型。目前Linux下可以承受高併發訪問的Squid,Memcached軟件採用的都是epoll模型
- 處理大量鏈接的讀寫是,Apache所採用的slect(同步I/O網絡模型)I/O模型比較低效!
###如何正確選擇Web服務器vim
- 靜態業務:高併發場景儘可能採用Nginx或Lighttpd,兩者首選Nginx
- 動態業務:理論上採用Nginx和Apache都可,爲了不相同業務的服務軟件多樣化增長額外維護成本,建議現有Nginx兼作前端代理在根據頁面元素的類型或目錄轉發到後端相應的服務器進行處理
- 既有靜態業務又有動態業務:採用Nginx
- 若是併發不是很大,又對Apache很熟悉,採用Apache也是能夠的。
mount /dev/sr0 /media/cdrom/
yum -y install pcre-devel openssl-devel
tar xf nginx-1.10.3.tar.gz -C /usr/src
useradd -s /sbin/nologin -M yinuo
cd /usr/src/nginx-1.10.3 ./configure --user=yinuo --group=yinuo --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
--user=yinuo --group=yinuo --->告訴它用戶和用戶組是誰
--prefix=/usr/local/nginx --->安裝到哪去叫什麼
--with-http_stub_status_module --with-http_ssl_module --->定製模塊
make && make install
conf(配置) html(網頁) logs(日誌) sbin
nginx.conf--->配置文件 nginx-conf--->配置文件備份 mime.types--->媒體類型 mime.typel.default--->媒體類型備份
egrep -v "#|^$" nginx.conf.default > nginx.conf ---> 去掉#號去掉空號從備份配置文件裏寫回到配置文件
vim nginx.conf
worker_processes 1; ----> Nginx工做的進程個數,CPU幾核就配幾
events { ----> 事件函數(進程裏的線程個數)
worker_connections 1024; ----> 工做中通常寫20倍,20480
}
http { ----> Web服務函數
include mime.types; ----> include--->導入某個文件
default_type application/octet-stream;
sendfile on; ----> 文件的高效傳輸功能,默認爲開
keepalive_timeout 65; ----> 鏈接保持功能,持續65秒server { ---->一個Server表明一個虛擬網站
listen 80; ----> socket進程的監聽端口
server_name localhost; ----> 域名,網站首頁名
location / {
root html; ----> 網頁的根目錄路徑
index index.html index.htm; ----> 首頁,索引
}
}
}
備註:咱們本身修改換一個域名就行了 server_name 後改本身的域名
絕對路徑啓動 /usr/local/nginx/sbin/nginx 沒提示不要緊,查看端口號看是否啓動 ss -antup | grep 80
1.第一步:進入/usr/local/nginx/html下刪除裏面全部文件
cd /usr/local/nginx/html rm -rf *
2.寫一個文件
echo "`hostname -I` www.yunjisuan.com" > index.html
3.給本地作映射
echo "`hostname -I` www.yunjisuan.com" >> /etc/hosts(映射文件位置)
4.模擬瀏覽器訪 curl--->模擬瀏覽器訪問命令
curl www.yunjisuan.com 出現: 192.168.200.156 www.yunjisuan.com 證實訪問成功
1.修改Windows映射文件
C盤-->windows-->system32-->drivers-->etc-->hosts
2.用原始瀏覽器登陸
www.yunjisuan.com 便可
1. 配置文件中 若是 root html 後加 /XXX 那xxx爲根,加幾個 /xxx,最後一個 /xxx 爲根,根之上的東西不管怎麼操做都看不了
2. /usr/local/nginx/sbin/nginx -s reload 平滑重啓Nginx
3.nginx: [error] invalid PID number "" in "/usr/local/nginx/logs/nginx.pid"
報錯?
解決辦法:/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
1.vim 配置文件增長server函數---> vim /usr/local/nginx/conf/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name bbs.yunjisuan.com;
location / {
root html/bbs;
index index.html index.htm;
}
}
server {
listen 80;
server_name blog.yunjisuan.com;
location / {
root html/blog;
index index.html index.htm;
}
}
server {
listen 80;
server_name www.yunjisuan.com;
location / {
root html/www;
index index.html index.htm;
}
}
2.進入 /usr/local/nginx/html 目錄裏建立它的網頁目錄。目錄和域名名稱儘可能同樣
[root@LianXiJi html]# mkdir bbs blog [root@LianXiJi html]# echo "`hostname -I` bbs.yunjisuan.com" > bbs/index.html [root@LianXiJi html]# echo "`hostname -I` blog.yunjisuan.com" > blog/index.html
3.修改映射文件
vim /etc/hosts 192.168.200.156 www.yunjisuan.com bbs.yunjisuan.com blog.yunjisuan.com ---> 添加其餘網站域名便可
4.模擬瀏覽器訪 curl--->模擬瀏覽器訪問命令
curl www.yunjisuan.com 出現: 92.168.200.156 www.yunjisuan.com curl bbs.yunjisuan.com 出現: 92.168.200.156 bbs.yunjisuan.com curl blog.yunjisuan.com 出現: 92.168.200.156 blog.yunjisuan.com 證實訪問成功
而輸入IP卻只得出 192.168.200.156 bbs.yunjisuan.com
[root@LianXiJi html]# curl 192.168.200.156 192.168.200.156 bbs.yunjisuan.com
答:當它可以區分你是誰的時候你想看誰就看誰,當它區分不了你是誰的時候默認給第一個。
1.1 經過域名訪問 :curl -v www.yunjisuan.com (-v 看內容和報頭)
答:Web服務器能夠經過報頭來查看你具體想看的域名的名字
1.2 經過IP訪問 : curl -v 192.168.200.156
答:用戶發給Web服務器的報文的報頭裏面只有IP地址,因此Web服務器不知道我想看的域名,所以它默認第一個
1.配置文件修改端口號-->vim /usr/local/nginx/conf/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name bbs.yunjisuan.com;
location / {
root html/bbs;
index index.html index.htm;
}
}
server {
listen 81;
server_name blog.yunjisuan.com;
location / {
root html/blog;
index index.html index.htm;
}
}
server {
listen 82;
server_name www.yunjisuan.com;
location / {
root html/www;
index index.html index.htm;
}
}
2.重啓服務 /usr/local/nginx/sbin/nginx -s reload
3.瀏覽器輸入 IP:端口號
總結:
1.一個Web服務器搭建多個網站有三種方法
1.1基於不一樣域名的虛擬網站 1.2基於不一樣監聽端口的虛擬網站 1.3基於不一樣IP的虛擬網站 ---> 本地須要多個網卡
2.通常工做中都是用域名搭建不一樣網站
3.修改配置文件必須重啓服務
問題1.怎樣讓非法訪問個人用戶一概都不能看到個人網站的信息?非法指的就是直接拿IP地址過來訪問個人
答:1.vim 修改配置文件
listen 80 後加 default_server --> 讓用IP地址訪問的用戶強制進入本Server
一般加一個server,咱們這裏直接修改了一個server
2.location / {}函數里加入直接犯錯錯誤碼讓其直接跳出錯誤頁面
1.在配置文件目錄下在建立目錄
cd /usr/local/nginx/conf mkdir extra
2.把配置文件裏的Server都寫到 extra 目錄下
vim extra/bbs.conf server { listen 80; server_name bbs.yunjisuan.com; location / { root html/blog; index index.html index.htm; } } vim extra/www.conf server { listen 80; server_name www.yunjisuan.com; location / { root html/blog; index index.html index.htm; } }
3.修改配置文件
vim /usr/local/nginx/conf/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
include extra/bbs.conf;
include extra/www.conf;
server {
listen 80 default_server;
server_name blog.yunjisuan.com;
location / {
return 403;
}
}
}
--with-http_stub_status_module ---> 狀態信息檢測模塊,通常編譯時都會安裝
1.在extra裏設定狀態信息配置 vim status.conf
erver {
listen 80;
server_name status.yunjisuan.com;
location / {
stub_status on; ----> 打開這個功能
access_log off; ----> 不記錄日誌
allow 192.168.200.156; ---->只容許我本身訪問(能夠制定用戶)
deny all; ----> 其餘一概拒絕
}
}
2.重啓服務 /usr/local/nginx/sbin/nginx -s reload
3.修改映射文件,把狀態信息配置添加進去 vim /etc/hosts
192.168.200.156 www.yunjisuan.com bbs.yunjisuan.com blog.yunjisuan.com status.yunjisuan.com
3.Nginx status 顯示結果詳解
curl status.yunjisuan.com`
Active connections: 1` ---> 表示Nginx正在處理的活動鏈接數1個
server accepts handled requests
19 19 19
Reading: 0 Writing: 1 Waiting: 0
- 一個server表示Nginx啓動到如今1共處理了19次握手
- 第二個accepts表示Nginx啓動到如今共成功建立了19次握手
- 請求丟失數=(握手數-鏈接數),能夠看出本次狀態顯示沒有丟失請求
- 第三個handled requests表示總共處理了19次請求
- Reading爲Nginx讀取到客戶端的Header信息數,這個數永遠是0
- waiting爲Nginx返回給客戶端的Header信息數
- Waiting爲Nginx已經處理完正在等候一下次請求指令的駐留鏈接。在開啓k- eep-alive的狀況下這個值等於active-(reading+writing)
測試:
修改Windows配置文件 C盤-->windows-->system32-->drivers-->etc-->hosts
在原配置文件後加如stauts.yunjisuan.com bbs.yunjisuan.com
瀏覽器登錄status.yunjisuan.com
常見的日誌級別【debug|info|notice|warn|error|crit|alert|emerg】
生產場景通常是warn|error|crit這三個級別之一,注意不要配置info等較低級別,會帶來巨大磁盤I/O消耗
error_log的默認值爲: default:error_log logs/error.log error
在配置文件裏增長內容,寫在全局裏
寫在函數體裏面函數生效,寫在函數體外面全局生效 vim /usr/local/nginx/conf/nginx.conf
worker_processes 1;
error_log logs/error.log; ----> 添加此行便可
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name bbs.yunjisuan.com;
location / {
root html/bbs;
index index.html index.htm;
}
}
默認狀況下Nginx會把全部的訪問日誌生成到一個指定的訪問日誌文件access.log裏,可是這樣時間長了就會致使日誌個頭數很大,不利於日誌的分析和處理,所以有必要對Nginx日誌按天或按小時進行切割,使其分紅不一樣的文件保存
6.5.1 寫一個日誌切割腳本--->本質來講就是某個時間給它移動更名
#!/bin/bash
#日誌切割腳本可掛定時任務,天天00點整執行
Dateformat=`data +%Y%m%d` ----> 時間
Basedir="/usr/local/nginx" ----> 路徑
Nginxlogdir="$Basedir/logs" ---->
Logname="access" ----> 名字
[ -d $Nginxlogdir ] && cd $Nginxlogdir || exit 1
[ -f ${Logname}.log ] || exit 1
/bin/mv ${logname}.log ${Dateformat}_${Logname}.log
$Basedir/sbin/nginx -s reload1 ----> 把日誌名在重新刷出來
6.5.2將腳本放在定時任務裏 crontab -e
00 00 * * * /bin/bash /root/cut_nginx_log.sh >/dev/null 2>&1
location是Nginx很是重要的過濾函數,能夠經過正則表達式來匹配過濾不一樣URL裏的URI部分,匹配到不一樣的URI進入到不一樣的location也就能夠進到不一樣的網頁目錄。
例:修改/usr/local/nginx/conf/extra目錄裏的www.conf文件
server {
listen 80;
server_name www.yunjisuan.com;
location / {
return 401;
}
location = /images/ {
return 402;
}
location ~/images/ {
return 502;
}
location = / {
return 403;
}
location /documents/ {
return 404;
}
location ^~/images/ {
return 501;
}
location ~*\.(gif|jpg|jpeg)$ {
return 500;
}
}
字符串前綴型模糊匹配:必須是從根開始,在URI的起始部分出現,後面能夠任意
- 精確匹配 (=)
- 前綴型正則匹配 (特殊正則--->^~)
- 普通正則 (~或~*,~*爲bu'q,~爲區分大小寫)
- 字符串前綴型匹配 (/images/)默認匹配 ( / )
和Apache等Web服務軟件同樣,Nginx rewrite的只要功能也是實現URL地址重寫。
Nginx的rewrite規則須要PCRE軟件的支持即經過Perl兼容正則表達式語法進行規則匹配。
沒騙人蔘數編譯時,Nginx就會安裝支持rewrite的模塊,可是,也必需要有PCRE軟件的支持。
(1) rewrite指令語法
指令語法:rewrite regex replacement 【結尾標記:flag】;
默認值:none
應用位置:server,location,if
replacement是實現URL重寫的關鍵指令,根據regex(正則表達式)部分的內容重定向到replacement部分,結尾是flag標記。
例:rewrite ^/(.*) http://www.baidu.com/$1 permanent; ---> ()小括號至關於sed裏的分組,這裏$1值相等
(2)regex經常使用的正則表達式說明
- \ ---> 將後面接着的字符標記爲一個特殊字符或一個原義字符或一個向後引用。
- ^ --->匹配輸入字符串的起始位置,若是設置了RegExp 對象的 Multiline 屬性,^也匹配 「\n」 或 「r」 以後的位置。
- $ ---> 匹配輸入字符串的結束爲止,
,若是設置了RegExp 對象的 Multiline 屬性,^也匹配 「\n」 或 「r」 以前的位置。- ( * ) ---> 匹配前面的字符零次或屢次, 例如:Ol* 能夠匹配 「o」及 「oll」,*等價於{o,}
- (+) ---> 匹配前面的字符一次或屢次,例如:ol+ 能匹配 ol 及 oll 但不能匹配 o 。+等價於{l.}
- ? ---> 匹配前面的字符零次或一次。
- . ---> 匹配除 「\n」以外的任何單個字符,要匹配包括 「\n」在內的任何字符,請使用想「[.\n]」這樣的模式。
(3) rewrite 指令的最後一項參數fiag標記說明
注:redirect是不會顯示跳轉後的URL地址
- 在以上flag標記中,last和break用來實現URL重寫,瀏覽器地址欄的URL地址不變但在服務器端訪問的程序及路徑發生了變化。
- redirect和permanent用來實現URL跳轉,瀏覽器地址欄會顯示跳轉後idURL地址。
last和break標記的實現功能相似,但而這之間有細微的差異,使用alias指令時必須用last標記,使用proxy_pass指令時要只用bredk標記,last標記在本條rewrite規則執行完畢後嗎會對其多有的server{...}標籤從新發起請求,而bradk標記則會在本條規則匹配完成後終止匹配再也不匹配後面的規則。
- 能夠調整用戶瀏覽的URL,使其看起來更規範,合乎開發及產品人員的需求。
- 爲了讓搜索引擎收錄網站內容並讓用戶體驗更好,企業會將動態URL地址假裝成靜態地址提供服務。
- 網站換新域名後,讓舊網址的訪問跳轉到新的域名上,例如:讓京東的360buy換成了jd.com
- 根據特殊變量,目錄,客戶端的信息進行URL跳轉等。
以往咱們是經過別名方式實現yunjisuan.com和www.yunjisuan.com訪問同一個地址的,事實上除了這個方式外還可使用nginx rewrite 301 跳轉的方式來實現,配置以下:
server{
listen 80;
server_name yunjisaun.com;
rewrite ^/(.*) http://www.yunjisuan.com/$1 permanent;
# 當用戶訪問yunjisuan.com及下面的任意內容是,都會經過這條rewrite跳轉到www.yunjisuan.com對應的地址
}
示例:實現訪問http://mail.yunjisuan.com跳轉到http://www.yunjisuan.com/mail/yunjisuan.html
外部跳轉時,使用這種方法可讓瀏覽器地址變爲跳轉後的地址,另外,要實現這隻http://www.yunjisuan.com/nail/yunjisuan.html有結果輸出否則會出現401等權限錯誤。
(1) 配置Nginx rewrite 規則
server {
listen 80;
server_namen mail.yunjisuan.com;
location / {
root /var/www/html/mailcom;
index index.html index.htm;
}
if ( $http_host ~* "^(.*)\.yunjisuan\.com$") {
set $domain $1;
rewrite ^(.*) http://www.yunjisuan.com/$domain/yunjisuan.html break;
}
}
注:
1. http_host ---> 存放域名的變量
2. if 和 location 是並列的,若是後面成立就執行小括號裏的東西
3. $1,只能重複一次,再出現它的值就會發生變化,要想不讓它變化就得把值付給一個別的變量。 (set爲設置的意思 set 變量=值)
在實際工做中企業要求咱們爲網站設置訪問帳號和密碼權限,這樣操做後只有擁有帳號密碼的用戶才能夠訪問網站內容。這樣使用帳號密碼才能夠訪問網站的功能,漢族要用用在企業內部人員訪問的地址上。
例如:企業網站後臺,MySQL客戶端phpmyadmin,企業內部的CRM,WIK網站平臺。
咱們能夠借用apache和htpasswd軟件來建立加密的帳號和密碼
先查看有沒有這個命令 : which htpasswd
沒有就yum安裝一個: yum -y install httpd
htpasswd -bc /usr/local/nginx/conf/htpasswd yunjisuan 「123456」
提示:Adding password for user yunjisuan
看一下里面內容,加密的: cat /usr/local/nginx/conf/htoasswd
yunjisuan:I8e2m4n9mbxDQ
vim /usr/local/nginx/conf/exyra/status.conf server { listen 80; server_name status.yunjisuan.com; location / { stub_status on; access_log off; auth_basic "Welcome to 167"; ---> 增長的文件 auth_basic_user_file /usr/local/nginx/conf/htpasswd --->增長的文件 } }
配置解釋:
auth_basic :驗證的基本信息選項(後面跟着的雙引號裏就是驗證窗口的名字)
auth_basic_user_file : 驗證的用戶文件(後面跟帳號密碼文件的絕對路徑)
答:Tengine是淘寶開源Nginx的分支,官方站點爲http://tengine.taobao.org/
答:
(1)Nginx配置文件裏沒有配置默認首頁參數,或者首頁文件在站點目錄下沒有如下內容:index index.php index.html index.htm;
(2)站點目錄或內部的程序文件沒有Nginx用戶訪問權限
(3)Nginx配置文件中設置了allow,deny等權限控制致使客戶端沒有訪問權限