網站服務

想必我們大多數人都是通過訪問網站而開始接觸互聯網的吧,我們平時訪問的網站服務 就是 Web 網路服務,一般是指允許用戶通過瀏覽器訪問到互聯網中各種資源的服務,
Web 網路服務是一種被動訪問的服務程式,即只有接收到互聯網中其他主機發出的 請求后才會回應,最終用于提供服務程式的 Web 服務器會通過 HTTP(超文本傳輸協議)或 HTTPS(安全超文本傳輸協議)把請求的內容傳送給用戶,
目前能夠提供 Web 網路服務的程式有 IIS、Nginx 和 Apache 等,其中,IIS(Internet Information Services,互聯網資訊服務)是 Windows 系統中默認的 Web 服務程式
2004 年 10 月 4 日,為俄羅斯知名門戶站點而開發的 Web 服務程式 Nginx 橫空出世, Nginx 程式作為一款輕量級的網站服務軟體,因其穩定性和豐富的功能而快速占領服務器市 場,但 Nginx 最被認可的還當是系統資源消耗低且并發能力強,因此得到了國內諸如新浪、 網易、騰訊等門戶站的青睞,
web服務器和web框架的關系
web服務器(nginx):接收HTTP請求(例如www.pythonav.cn/xiaocang.jpg)并回傳資料
web框架(django,flask):開發web應用程式,處理接收到的資料
NGINX
nginx是什么
nginx是一個開源的,支持高性能,高并發的www服務和代理服務軟體,它是一個俄羅斯人lgor sysoev開發的,作者將源代碼開源出來供全球使用, nginx比它大哥apache性能改進許多,nginx占用的系統資源更少,支持更高的并發連接,有更高的訪問效率,
nginx不但是一個優秀的web服務軟體,還可以作為反向代理,負載均衡,以及快取服務使用,
安裝更為簡單,方便,靈活,
nginx可以說是非常nb了
面試回答nginx技巧
支持高并發,能支持幾萬并發連接
資源消耗少,在3萬并發連接下開啟10個nginx執行緒消耗的記憶體不到200M
可以做http反向代理和負載均衡
支持異步網路i/o事件模型epoll

Tengine是由淘寶網發起的Web服務器專案,它在Nginx的基礎上,針對大訪問量網站的需求,添加了很多高級功能和特性,Tengine的性能和穩定性已經在大型的網站如淘寶網,天貓商城等得到了很好的檢驗,它的最終目標是打造一個高效、穩定、安全、易用的Web平臺,
安裝環境準備
一. gcc 安裝 安裝 nginx 需要先將官網下載的原始碼進行編譯,編譯依賴 gcc 環境,如果沒有 gcc 環境,則需要安裝: yum install gcc-c++ 二. PCRE pcre-devel 安裝 PCRE(Perl Compatible Regular Expressions) 是一個Perl庫,包括 perl 兼容的正則運算式庫,nginx 的 http 模塊使用 pcre 來決議正則運算式,所以需要在 linux 上安裝 pcre 庫,pcre-devel 是使用 pcre 開發的一個二次開發庫,nginx也需要此庫,命令: yum install -y pcre pcre-devel 三. zlib 安裝 zlib 庫提供了很多種壓縮和解壓縮的方式, nginx 使用 zlib 對 http 包的內容進行 gzip ,所以需要在 Centos 上安裝 zlib 庫, yum install -y zlib zlib-devel 四. OpenSSL 安裝 OpenSSL 是一個強大的安全套接字層密碼庫,囊括主要的密碼演算法、常用的密鑰和證書封裝管理功能及 SSL 協議,并提供豐富的應用程式供測驗或其它目的使用, nginx 不僅支持 http 協議,還支持 https(即在ssl協議上傳輸http),所以需要在 Centos 安裝 OpenSSL 庫,
yum install gcc patch libffi-devel python-devel zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel openssl openssl-devel -y
安裝,啟動nginx
1.下載原始碼包 wget -c https://nginx.org/download/nginx-1.12.0.tar.gz
2.解壓縮原始碼
tar -zxvf nginx-1.12.0.tar.gz
3.配置,編譯安裝 開啟nginx狀態監測功能
./configure --prefix=/opt/nginx1-12/ --with-http_ssl_module --with-http_stub_status_module
make && make install
4.啟動nginx,進入sbin目錄,找到nginx啟動命令
cd sbin
./nginx #啟動
./nginx -s stop #關閉
./nginx -s reload #重新加載
安裝完成后檢測服務
netstat -tunlp |grep 80
curl -I 127.0.0.1
#如果訪問不了,檢查selinux,iptables
部署一個web站點
nginx默認站點是Nginx目錄下的html檔案夾,這里可以從nginx.conf中查到
location /{
root html; #這里是默認的站點html檔案夾,也就是 /opt/nginx1-12/html/檔案夾下的內容
index index.html index.htm; #站點首頁檔案名是index.html
}
如果要部署網站業務資料,只需要把開發好的程式全放到html目錄下即可
[root@oldboy_python /tmp 11:34:52]#ls /opt/nginx1-12/html/ index.html jssts.jpeg lhy.mp4 man.jpg wget-log
因此只需要通過域名/資源,即可訪問
http://www.pyyuc.cn/man.jpg
Nginx的目錄結構
[root@oldboy_python /opt/nginx1-12 11:44:02]#ls client_body_temp conf fastcgi_temp html logs proxy_temp sbin scgi_temp static uwsgi_temp
- conf 存放nginx所有組態檔的目錄,主要nginx.conf
- html 存放nginx默認站點的目錄,如index.html、error.html等
- logs 存放nginx默認日志的目錄,如error.log access.log
- sbin 存放nginx主命令的目錄,sbin/nginx
Nginx主組態檔決議
Nginx主組態檔/etc/nginx/nginx.conf是一個純文本型別的檔案,整個組態檔是以區塊的形式組織的,一般,每個區塊以一對大括號{}來表示開始與結束,

######Nginx組態檔nginx.conf中文詳解#####
#定義Nginx運行的用戶和用戶組
user www www;
#nginx行程數,建議設定為等于CPU總核心數,
worker_processes 8;
#全域錯誤日志定義型別,[ debug | info | notice | warn | error | crit ]
error_log /usr/local/nginx/logs/error.log info;
#行程pid檔案
pid /usr/local/nginx/logs/nginx.pid;
#指定行程可以打開的最大描述符:數目
#作業模式與連接數上限
#這個指令是指當一個nginx行程打開的最多檔案描述符數目,理論值應該是最多打開檔案數(ulimit -n)與nginx行程數相除,但是nginx分配請求并不是那么均勻,所以最好與ulimit -n 的值保持一致,
#現在在linux 2.6內核下開啟檔案打開數為65535,worker_rlimit_nofile就相應應該填寫65535,
#這是因為nginx調度時分配請求到行程并不是那么的均衡,所以假如填寫10240,總并發量達到3-4萬時就有行程可能超過10240了,這時會回傳502錯誤,
worker_rlimit_nofile 65535;
events
{
#參考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型
#是Linux 2.6以上版本內核中的高性能網路I/O模型,linux建議epoll,如果跑在FreeBSD上面,就用kqueue模型,
#補充說明:
#與apache相類,nginx針對不同的作業系統,有不同的事件模型
#A)標準事件模型
#Select、poll屬于標準事件模型,如果當前系統不存在更有效的方法,nginx會選擇select或poll
#B)高效事件模型
#Kqueue:使用于FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X.使用雙處理器的MacOS X系統使用kqueue可能會造成內核崩潰,
#Epoll:使用于Linux內核2.6版本及以后的系統,
#/dev/poll:使用于Solaris 7 11/99+,HP/UX 11.22+ (eventport),IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+,
#Eventport:使用于Solaris 10, 為了防止出現內核崩潰的問題, 有必要安裝安全補丁,
use epoll;
#單個行程最大連接數(最大連接數=連接數*行程數)
#根據硬體調整,和前面作業行程配合起來用,盡量大,但是別把cpu跑到100%就行,每個行程允許的最多連接數,理論上每臺nginx服務器的最大連接數為,
worker_connections 65535;
#keepalive超時時間,
keepalive_timeout 60;
#客戶端請求頭部的緩沖區大小,這個可以根據你的系統分頁大小來設定,一般一個請求頭的大小不會超過1k,不過由于一般系統分頁都要大于1k,所以這里設定為分頁大小,
#分頁大小可以用命令getconf PAGESIZE 取得,
#[root@web001 ~]# getconf PAGESIZE
#4096
#但也有client_header_buffer_size超過4k的情況,但是client_header_buffer_size該值必須設定為“系統分頁大小”的整倍數,
client_header_buffer_size 4k;
#這個將為打開檔案指定快取,默認是沒有啟用的,max指定快取數量,建議和打開檔案數一致,inactive是指經過多長時間檔案沒被請求后洗掉快取,
open_file_cache max=65535 inactive=60s;
#這個是指多長時間檢查一次快取的有效資訊,
#語法:open_file_cache_valid time 默認值:open_file_cache_valid 60 使用欄位:http, server, location 這個指令指定了何時需要檢查open_file_cache中快取專案的有效資訊.
open_file_cache_valid 80s;
#open_file_cache指令中的inactive引數時間內檔案的最少使用次數,如果超過這個數字,檔案描述符一直是在快取中打開的,如上例,如果有一個檔案在inactive時間內一次沒被使用,它將被移除,
#語法:open_file_cache_min_uses number 默認值:open_file_cache_min_uses 1 使用欄位:http, server, location 這個指令指定了在open_file_cache指令無效的引數中一定的時間范圍內可以使用的最小檔案數,如果使用更大的值,檔案描述符在cache中總是打開狀態.
open_file_cache_min_uses 1;
#語法:open_file_cache_errors on | off 默認值:open_file_cache_errors off 使用欄位:http, server, location 這個指令指定是否在搜索一個檔案是記錄cache錯誤.
open_file_cache_errors on;
}
#設定http服務器,利用它的反向代理功能提供負載均衡支持
http
{
#檔案擴展名與檔案型別映射表
include mime.types;
#默認檔案型別
default_type application/octet-stream;
#默認編碼
#charset utf-8;
#服務器名字的hash表大小
#保存服務器名字的hash表是由指令server_names_hash_max_size 和server_names_hash_bucket_size所控制的,引數hash bucket size總是等于hash表的大小,并且是一路處理器快取大小的倍數,在減少了在記憶體中的存取次數后,使在處理器中加速查找hash表鍵值成為可能,如果hash bucket size等于一路處理器快取的大小,那么在查找鍵的時候,最壞的情況下在記憶體中查找的次數為2,第一次是確定存盤單元的地址,第二次是在存盤單元中查找鍵 值,因此,如果Nginx給出需要增大hash max size 或 hash bucket size的提示,那么首要的是增大前一個引數的大小.
server_names_hash_bucket_size 128;
#客戶端請求頭部的緩沖區大小,這個可以根據你的系統分頁大小來設定,一般一個請求的頭部大小不會超過1k,不過由于一般系統分頁都要大于1k,所以這里設定為分頁大小,分頁大小可以用命令getconf PAGESIZE取得,
client_header_buffer_size 32k;
#客戶請求頭緩沖大小,nginx默認會用client_header_buffer_size這個buffer來讀取header值,如果header過大,它會使用large_client_header_buffers來讀取,
large_client_header_buffers 4 64k;
#設定通過nginx上傳檔案的大小
client_max_body_size 8m;
#開啟高效檔案傳輸模式,sendfile指令指定nginx是否呼叫sendfile函式來輸出檔案,對于普通應用設為 on,如果用來進行下載等應用磁盤IO重負載應用,可設定為off,以平衡磁盤與網路I/O處理速度,降低系統的負載,注意:如果圖片顯示不正常把這個改成off,
#sendfile指令指定 nginx 是否呼叫sendfile 函式(zero copy 方式)來輸出檔案,對于普通應用,必須設為on,如果用來進行下載等應用磁盤IO重負載應用,可設定為off,以平衡磁盤與網路IO處理速度,降低系統uptime,
sendfile on;
#開啟目錄串列訪問,合適下載服務器,默認關閉,
autoindex on;
#此選項允許或禁止使用socke的TCP_CORK的選項,此選項僅在使用sendfile的時候使用
tcp_nopush on;
tcp_nodelay on;
#長連接超時時間,單位是秒
keepalive_timeout 120;
#FastCGI相關引數是為了改善網站的性能:減少資源占用,提高訪問速度,下面引數看字面意思都能理解,
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
#gzip模塊設定
gzip on; #開啟gzip壓縮輸出
gzip_min_length 1k; #最小壓縮檔案大小
gzip_buffers 4 16k; #壓碩訓沖區
gzip_http_version 1.0; #壓縮版本(默認1.1,前端如果是squid2.5請使用1.0)
gzip_comp_level 2; #壓縮等級
gzip_types text/plain application/x-javascript text/css application/xml; #壓縮型別,默認就已經包含textml,所以下面就不用再寫了,寫上去也不會有問題,但是會有一個warn,
gzip_vary on;
#開啟限制IP連接數的時候需要使用
#limit_zone crawler $binary_remote_addr 10m;
#負載均衡配置
upstream jh.w3cschool.cn {
#upstream的負載均衡,weight是權重,可以根據機器配置定義權重,weigth引數表示權值,權值越高被分配到的幾率越大,
server 192.168.80.121:80 weight=3;
server 192.168.80.122:80 weight=2;
server 192.168.80.123:80 weight=3;
#nginx的upstream目前支持4種方式的分配
#1、輪詢(默認)
#每個請求按時間順序逐一分配到不同的后端服務器,如果后端服務器down掉,能自動剔除,
#2、weight
#指定輪詢幾率,weight和訪問比率成正比,用于后端服務器性能不均的情況,
#例如:
#upstream bakend {
# server 192.168.0.14 weight=10;
# server 192.168.0.15 weight=10;
#}
#2、ip_hash
#每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個后端服務器,可以解決session的問題,
#例如:
#upstream bakend {
# ip_hash;
# server 192.168.0.14:88;
# server 192.168.0.15:80;
#}
#3、fair(第三方)
#按后端服務器的回應時間來分配請求,回應時間短的優先分配,
#upstream backend {
# server server1;
# server server2;
# fair;
#}
#4、url_hash(第三方)
#按訪問url的hash結果來分配請求,使每個url定向到同一個后端服務器,后端服務器為快取時比較有效,
#例:在upstream中加入hash陳述句,server陳述句中不能寫入weight等其他的引數,hash_method是使用的hash演算法
#upstream backend {
# server squid1:3128;
# server squid2:3128;
# hash $request_uri;
# hash_method crc32;
#}
#tips:
#upstream bakend{#定義負載均衡設備的Ip及設備狀態}{
# ip_hash;
# server 127.0.0.1:9090 down;
# server 127.0.0.1:8080 weight=2;
# server 127.0.0.1:6060;
# server 127.0.0.1:7070 backup;
#}
#在需要使用負載均衡的server中增加 proxy_pass http://bakend/;
#每個設備的狀態設定為:
#1.down表示單前的server暫時不參與負載
#2.weight為weight越大,負載的權重就越大,
#3.max_fails:允許請求失敗的次數默認為1.當超過最大次數時,回傳proxy_next_upstream模塊定義的錯誤
#4.fail_timeout:max_fails次失敗后,暫停的時間,
#5.backup: 其它所有的非backup機器down或者忙的時候,請求backup機器,所以這臺機器壓力會最輕,
#nginx支持同時設定多組的負載均衡,用來給不用的server來使用,
#client_body_in_file_only設定為On 可以講client post過來的資料記錄到檔案中用來做debug
#client_body_temp_path設定記錄檔案的目錄 可以設定最多3層目錄
#location對URL進行匹配.可以進行重定向或者進行新的代理 負載均衡
}
#虛擬主機的配置
server
{
#監聽埠
listen 80;
#域名可以有多個,用空格隔開
server_name www.w3cschool.cn w3cschool.cn;
index index.html index.htm index.php;
root /data/www/w3cschool;
#對******進行負載均衡
location ~ .*.(php|php5)?$
{
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
#圖片快取時間設定
location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 10d;
}
#JS和CSS快取時間設定
location ~ .*.(js|css)?$
{
expires 1h;
}
#日志格式設定
#$remote_addr與$http_x_forwarded_for用以記錄客戶端的ip地址;
#$remote_user:用來記錄客戶端用戶名稱;
#$time_local: 用來記錄訪問時間與時區;
#$request: 用來記錄請求的url與http協議;
#$status: 用來記錄請求狀態;成功是200,
#$body_bytes_sent :記錄發送給客戶端檔案主體內容大小;
#$http_referer:用來記錄從那個頁面鏈接訪問過來的;
#$http_user_agent:記錄客戶瀏覽器的相關資訊;
#通常web服務器放在反向代理的后面,這樣就不能獲取到客戶的IP地址了,通過$remote_add拿到的IP地址是反向代理服務器的iP地址,反向代理服務器在轉發請求的http頭資訊中,可以增加x_forwarded_for資訊,用以記錄原有客戶端的IP地址和原來客戶端的請求的服務器地址,
log_format access '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $http_x_forwarded_for';
#定義本虛擬主機的訪問日志
access_log /usr/local/nginx/logs/host.access.log main;
access_log /usr/local/nginx/logs/host.access.404.log log404;
#對 "/" 啟用反向代理
location / {
proxy_pass http://127.0.0.1:88;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
#后端的Web服務器可以通過X-Forwarded-For獲取用戶真實IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#以下是一些反向代理的配置,可選,
proxy_set_header Host $host;
#允許客戶端請求的最大單檔案位元組數
client_max_body_size 10m;
#緩沖區代理緩沖用戶端請求的最大位元組數,
#如果把它設定為比較大的數值,例如256k,那么,無論使用firefox還是IE瀏覽器,來提交任意小于256k的圖片,都很正常,如果注釋該指令,使用默認的client_body_buffer_size設定,也就是作業系統頁面大小的兩倍,8k或者16k,問題就出現了,
#無論使用firefox4.0還是IE8.0,提交一個比較大,200k左右的圖片,都回傳500 Internal Server Error錯誤
client_body_buffer_size 128k;
#表示使nginx阻止HTTP應答代碼為400或者更高的應答,
proxy_intercept_errors on;
#后端服務器連接的超時時間_發起握手等候回應超時時間
#nginx跟后端服務器連接超時時間(代理連接超時)
proxy_connect_timeout 90;
#后端服務器資料回傳時間(代理發送超時)
#后端服務器資料回傳時間_就是在規定時間之內后端服務器必須傳完所有的資料
proxy_send_timeout 90;
#連接成功后,后端服務器回應時間(代理接收超時)
#連接成功后_等候后端服務器回應時間_其實已經進入后端的排隊之中等候處理(也可以說是后端服務器處理請求的時間)
proxy_read_timeout 90;
#設定代理服務器(nginx)保存用戶頭資訊的緩沖區大小
#設定從被代理服務器讀取的第一部分應答的緩沖區大小,通常情況下這部分應答中包含一個小的應答頭,默認情況下這個值的大小為指令proxy_buffers中指定的一個緩沖區的大小,不過可以將其設定為更小
proxy_buffer_size 4k;
#proxy_buffers緩沖區,網頁平均在32k以下的設定
#設定用于讀取應答(來自被代理服務器)的緩沖區數目和大小,默認情況也為分頁大小,根據作業系統的不同可能是4k或者8k
proxy_buffers 4 32k;
#高負荷下緩沖大小(proxy_buffers*2)
proxy_busy_buffers_size 64k;
#設定在寫入proxy_temp_path時資料的大小,預防一個作業行程在傳遞檔案時阻塞太長
#設定快取檔案夾大小,大于這個值,將從upstream服務器傳
proxy_temp_file_write_size 64k;
}
#設定查看Nginx狀態的地址
location /NginxStatus {
stub_status on;
access_log on;
auth_basic "NginxStatus";
auth_basic_user_file confpasswd;
#htpasswd檔案的內容可以用apache提供的htpasswd工具來產生,
}
#本地動靜分離反向代理配置
#所有jsp的頁面均交由tomcat或resin處理
location ~ .(jsp|jspx|do)?$ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:8080;
}
#所有靜態檔案由nginx直接讀取不經過tomcat或resin
location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|
pdf|xls|mp3|wma)$
{
expires 15d;
}
location ~ .*.(js|css)?$
{
expires 1h;
}
}
}
######Nginx組態檔nginx.conf中文詳解#####
nginx.conf詳解
CoreModule核心模塊 user www; #Nginx行程所使用的用戶 worker_processes 1; #Nginx運行的work行程數量(建議與CPU數量一致或auto) error_log /log/nginx/error.log #Nginx錯誤日志存放路徑 pid /var/run/nginx.pid #Nginx服務運行后產生的pid行程號
events事件模塊
events {
worker_connections //每個worker行程支持的最大連接數
use epool; //事件驅動模型, epoll默認
}
http內核模塊
//公共的配置定義在http{}
http { //http層開始
...
//使用Server配置網站, 每個Server{}代表一個網站(簡稱虛擬主機)
'server' {
listen 80; //監聽埠, 默認80
server_name localhost; //提供服務的域名或主機名
access_log host.access.log //訪問日志
//控制網站訪問路徑
'location' / {
root /usr/share/nginx/html; //存放網站代碼路徑
index index.html index.htm; //服務器回傳的默認頁面檔案
}
//指定錯誤代碼, 統一定義錯誤頁面, 錯誤代碼重定向到新的Locaiton
error_page 500 502 503 504 /50x.html;
}
...
//第二個虛擬主機配置
'server' {
...
}
include /etc/nginx/conf.d/*.conf; //包含/etc/nginx/conf.d/目錄下所有以.conf結尾的檔案
} //http層結束
Nginx虛擬主機

如果每臺linux服務器只運行了一個小網站,那么人氣低,流量小的草根站長需要承擔高額的服務器租賃費,也造成了硬體資源浪費,
虛擬主機就是將一臺服務器分割成多個“虛擬服務器”,每個站點使用各自的硬碟空間,由于省資源,省錢,眾多網站都使用虛擬主機來部署網站,
虛擬主機的概念就是在web服務里的一個獨立的網站站點,這個站點對應獨立的域名(IP),具有獨立的程式和資源目錄,可以獨立的對外提供服務,
這個獨立的站點配置是在nginx.conf中使用server{}代碼塊標簽來表示一個虛擬主機,
Nginx支持多個server{}標簽,即支持多個虛擬主機站點,
虛擬主機型別
基于域名的虛擬主機 通過不同的域名區分不同的虛擬主機,是企業應用最廣的虛擬主機,
基于埠的虛擬主機
通過不同的埠來區分不同的虛擬主機,一般用作企業內部網站,不對外直接提供服務的后臺,例如www.pythonav.cn:9000
基于IP的虛擬主機
通過不同的IP區分不同的虛擬主機,此類比較少見,一般業務需要多IP的常見都會在負載均衡中系結VIP
Nginx狀態資訊(status)配置
Nginx狀態資訊(status)配置及資訊詳解 nginx與php-fpm一樣內建了一個狀態頁,對于想了解nginx的狀態以及監控nginx非常有幫助,為了后續的zabbix監控,我們需要先了解一下nginx的狀態頁, Nginx狀態資訊(status)介紹 Nginx軟體在編譯時又一個with-http_stub_status_module模塊,這個模塊功能是記錄Nginx的基本訪問狀態資訊,讓使用者了解Nginx的作業狀態,
要想使用狀態模塊,在編譯時必須增加--with-http_stub_status_module引數,
監測你的nginx是否安裝了status模塊
[root@master conf]# /opt/nginx/sbin/nginx -V nginx version: nginx/1.12.0 built by gcc 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC) configure arguments: --prefix=/opt/nginx/ --with-http_stub_status_module
啟動status狀態功能,修改組態檔
#在訪問ip/status的時候,進入狀態功能
location /status {
#開啟nginx狀態功能 stub_status on; }
平滑重啟nginx
./sbin/nginx -s reload
訪問status頁面
http://192.168.119.10/status
通過ab壓測命令檢測
yum -y install httpd-tools
-n requests #執行的請求數,即一共發起多少請求,
-c concurrency #請求并發數,
-k #啟用HTTP KeepAlive功能,即在一個HTTP會話中執行多個請求,
ab -kc 1000 -n 100000 http://192.168.119.10/
status頁面決議

基于域名的多虛擬主機實戰
nginx可以自動識別用戶請求的域名,根據不同的域名請求服務器傳輸不同的內容,只需要保證服務器上有一個可用的ip地址,配置好dns決議服務,
/etc/hosts是linux系統中本地dns決議的組態檔,同樣可以達到域名訪問效果
修改nginx.conf
[root@oldboy_python ~ 14:33:16]#egrep -v '#|^$' /opt/nginx1-12/conf/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name www.pyyuc.cn;
location /{
root html/pyyuc;
index index.html index.htm;
}
}
}
上述代碼配置了一個www.pyyuc.cn域名的站點,虛擬主機的部分就是server{}里的內容
創建pyyuc.cn的站點目錄和檔案
[root@oldboy_python /opt/nginx1-12/html 14:36:08]#mkdir pyyuc
[root@oldboy_python /opt/nginx1-12/html 14:36:18]#echo "<meta charset=utf8>我是pyyuc站點" > pyyuc/index.html
[root@oldboy_python /opt/nginx1-12/html 14:37:21]#cat pyyuc/index.html
<meta charset=utf8>我是pyyuc站點
上述作用創建了一個html/pyyuc站點目錄,對應于虛擬主機組態檔里的root根目錄的設定html/pyyuc
然后生成一個首頁檔案index.html,內容是“我是pyyuc站點”
檢查nginx語法重新加載nginx
[root@oldboy_python /opt/nginx1-12/html 14:37:28]#../sbin/nginx -t
nginx: the configuration file /opt/nginx1-12/conf/nginx.conf syntax is ok
nginx: configuration file /opt/nginx1-12/conf/nginx.conf test is successful
#平滑重啟nginx
[root@oldboy_python /opt/nginx1-12/html 14:39:18]#../sbin/nginx -s reload
檢查nginx埠,行程,訪問pyyuc虛擬站點
[root@oldboy_python /opt/nginx1-12/html 14:40:02]#netstat -tunlp|grep nginx
[root@oldboy_python /opt/nginx1-12/html 14:40:29]#ps -ef|grep nginx
#我這里是有dns決議,沒有的話則需要/etc/hosts決議
#成功配置了pyyuc虛擬主機站點
[root@oldboy_python /opt/nginx1-12/html 14:41:37]#curl www.pyyuc.cn
<meta charset=utf8>我是pyyuc站點
配置多個域名的虛擬主機
其實就是新增一個server{}虛擬主機
egrep -v '#|^$' /opt/nginx1-12/conf/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name www.pyyuc.cn;
location /{
root html/pyyuc;
index index.html index.htm;
}
}
server {
listen 80;
server_name www.pythonav.cn;
location /{
root html/pythonav;
index index.html index.htm;
}
}
}
創建pythonav虛擬主機站點的目錄和檔案
[root@oldboy_python /opt/nginx1-12 14:47:21]#mkdir -p /opt/nginx1-12/html/pythonav
[root@oldboy_python /opt/nginx1-12 14:49:33]#echo "<meta charset=utf8>我是pythonav,未成年禁止入內"> /opt/nginx1-12/html/pythonav/index.html
[root@oldboy_python /opt/nginx1-12 14:50:44]#./sbin/nginx -t nginx: the configuration file /opt/nginx1-12/conf/nginx.conf syntax is ok nginx: configuration file /opt/nginx1-12/conf/nginx.conf test is successful [root@oldboy_python /opt/nginx1-12 14:51:32]#./sbin/nginx -s reload
大功告成,基于域名的虛擬主機實戰搞定
[root@oldboy_python /opt/nginx1-12 14:52:12]#curl www.pythonav.cn <meta charset=utf8>我是pythonav,未成年禁止入內 [root@oldboy_python /opt/nginx1-12 14:52:40]#curl www.pyyuc.cn <meta charset=utf8>我是pyyuc站點
nginx訪問日志(access_log)
日志功能對每個用戶訪問網站的日志資訊記錄到指定的日志檔案里,開發運維人員可以分析用戶的瀏覽器行為,此功能由ngx_http_log_module模塊負責,官網地址是:
http://nginx.org/en/docs/http/ngx_http_log_module.html
控制日志的引數
log_format 記錄日志的格式,可定義多種格式 accsss_log 指定日志檔案的路徑以及格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
對應引數決議
$remote_addr 記錄客戶端ip $remote_user 遠程用戶,沒有就是 “-”
$time_local 對應[14/Aug/2018:18:46:52 +0800]
$request 對應請求資訊"GET /favicon.ico HTTP/1.1"
$status 狀態碼
$body_bytes_sent 571位元組 請求體的大小
$http_referer 對應“-” 由于是直接輸入瀏覽器就是 -
$http_user_agent 客戶端身份資訊
$http_x_forwarded_for 記錄客戶端的來源真實ip 97.64.34.118
日志效果如下
66.102.6.6 - - [14/Aug/2018:18:46:52 +0800] "GET /favicon.ico HTTP/1.1" 404 571 "-"
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36 Google Favicon" "97.64.34.118"
nginx.conf默認配置
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
日志格式配置定義
log_format是日志關鍵字引數,不能變 main是日志格式指定的標簽,記錄日志時通過main標簽選擇指定的格式,
nginx限制網站來源IP訪問
如果哪天發現你的nginx很慢,或者檢查access.log時候,有一個some body瘋狂請求你的nginx server,那么可以禁止這個IP訪問
限制ip或ip段訪問
禁止訪問/av/底下的資源
location /av { deny 122.71.240.254; #alias /opt/nginx1-12/html/av; allow 10.1.1.0/16; }
Nginx錯誤頁面優化
在網站運行程序中,可能因為頁面不存在等原因,導致網站無法正常回應請求,此時web服務會回傳系統的錯誤碼,但是默認的錯誤頁面很不友好,


因此我們可以將404,403等頁面的錯誤資訊重定向到網站首頁或者其他指定的頁面,提升用戶訪問體驗,
server {
listen 80;
server_name www.pythonav.cn;
root html/pythonav;
location /{
index index.html index.htm;
}
#在pythonav路徑下的40x.html錯誤頁面
error_page 400 403 404 405 /40x.html;
}
40x.html
<img style='width:100%;height:100%;' src=https://pic1.zhimg.com/80/v2-77a9281a2bebc7a2ea5e02577af266a8_hd.png>
此時訪問www.pythonav.cn/asdasd錯誤頁面已經優化了
Nginx代理

正向代理
正向代理,也就是傳說中的代理,他的作業原理就像一個跳板(VPN),簡單的說:
我是一個用戶,我訪問不了某網站,但是我能訪問一個代理服務器,這個代理服務器呢,他能訪問那個我不能訪問的網站,于是我先連上代理服務器,告訴他我需要那個無法訪問網站的內容,代理服務器去取回來,然后回傳給我,

反向代理
對于客戶端而言,代理服務器就像是原始服務器,


nginx實作負載均衡的組件
ngx_http_proxy_module proxy代理模塊,用于把請求拋給服務器節點或者upstream服務器池
實作一個簡單的反向代理
機器準備,兩臺服務器
master 192.168.11.63 主負載
slave 192.168.11.64 web1
主負載均衡節點的組態檔

worker_processes 1;
error_log logs/error.log;
pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
sendfile on;
keepalive_timeout 65;
upstream slave_pools{
server 192.168.11.64:80 weight=1;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://slave_pools;
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
nginx.conf
檢查語法并啟動nginx
[root@master 192.168.11.63 /opt/nginx1-12]$/opt/nginx1-12/sbin/nginx -t nginx: the configuration file /opt/nginx1-12/conf/nginx.conf syntax is ok nginx: configuration file /opt/nginx1-12/conf/nginx.conf test is successful
#啟動nginx
[root@master 192.168.11.63 /opt/nginx1-12]$/opt/nginx1-12/sbin/nginx
#檢查埠
[root@master 192.168.11.63 /opt/nginx1-12]$netstat -tunlp|grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 8921/nginx: master
此時訪問master的服務器192.168.11.63:80地址,已經會將請求轉發給slave的80埠
除了頁面效果的展示以外,還可以通過log(access.log)查看代理效果
master端日志

slave端日志

nginx語法之location詳解
Location語法優先級排列
匹配符 匹配規則 優先級 = 精確匹配 1 ^~ 以某個字串開頭 2 ~ 區分大小寫的正則匹配 3 ~* 不區分大小寫的正則匹配 4 !~ 區分大小寫不匹配的正則 5 !~* 不區分大小寫不匹配的正則 6 / 通用匹配,任何請求都會匹配到 7
nginx.conf組態檔實體
server {
listen 80;
server_name pythonav.cn;
#優先級1,精確匹配,根路徑
location =/ {
return 400;
}
#優先級2,以某個字串開頭,以av開頭的,優先匹配這里,區分大小寫
location ^~ /av {
root /data/av/;
}
#優先級3,區分大小寫的正則匹配,匹配/media*****路徑
location ~ /media {
alias /data/static/;
}
#優先級4 ,不區分大小寫的正則匹配,所有的****.jpg|gif|png 都走這里
location ~* .*\.(jpg|gif|png|js|css)$ {
root /data/av/;
}
#優先7,通用匹配
location / {
return 403;
}
}
nginx語法之root和alias區別實戰
nginx指定檔案路徑有root和alias兩種方法
區別在方法和作用域:
方法:
root
語法 root 路徑;
默認值 root html;
配置塊 http{} server {} location{}
alias
語法: alias 路徑
配置塊 location{}
root和alias區別在nginx如何解釋location后面的url,這會使得兩者分別以不同的方式講請求映射到服務器檔案上
root引數是root路徑+location位置
root實體:
location ^~ /av {
root /data/av; 注意這里可有可無結尾的 /
}
請求url是pythonav.cn/av/index.html時
web服務器會回傳服務器上的/data/av/av/index.html
root實體2:
location ~* .*\.(jpg|gif|png|js|css)$ {
root /data/av/;
}
請求url是pythonav.cn/girl.gif時
web服務器會回傳服務器上的/data/static/girl.gif
alias實體:
alias引數是使用alias路徑替換location路徑
alias是一個目錄的別名
注意alias必須有 "/" 結束!
alias只能位于location塊中
請求url是pythonav.cn/av/index.html時
web服務器會回傳服務器上的/data/static/index.html
location ^~ /av {
alias /data/static/;
}
Keepalived高可用軟體
什么是keepalived
Keepalived是一個用C語言撰寫的路由軟體,該專案的主要目標是為Linux系統和基于Linux的基礎架構提供簡單而強大的負載均衡和高可用性設施, 還可以作為其他服務(nginx,mysql)的高可用軟體 keepalived主要通過vrrp協議實作高可用功能,vrrp叫(virtual router redundancy protocol)虛擬路由器冗余協議,
目的為了解決單點故障問題,他可以保證個別節點宕機時,整個網路可以不間斷的運行,
高可用故障切換原理
在keepalived作業時,主master節點會不斷的向備節點發送心跳訊息,告訴備節點自己還活著,
當master節點故障時,就無法發送心跳訊息,備節點就無法檢測到來自master的心跳了,于是呼叫自身的接管程式,接管master節點的ip資源以及服務,
當master主節點恢復時,備backup節點又會釋放接管的ip資源和服務,回復到原本的備節點角色,
1.硬體環境準備
實驗環境應該最好是4臺虛擬機,環境有限因此用2臺機器 master slave
2.centos系統和nginx代理環境
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/157121.html
標籤:Linux
下一篇:nginx負載均衡
