一、nginx
nginx:是一個高性能的http和反向代理服務器,特點是佔用內存少,併發能力強。 專門爲性能優化而開發,性能是其重要考量,實現上非常注重性能,能夠經受住高負載的考驗,有報告表名能支持50000併發量。
反向代理:客戶端對代理是無感知的,因爲客戶端不需要任何配置就可以訪問,我們只需要將請求發送到代理服務器由反向代理服務器去選擇目標服務器獲取數據後再返回給客戶端,此時反向代理服務器和目標服務器對外就是一個服務器,暴露的是代理服務器地址,隱藏了真是服務器ip地址。
二、linux安裝nginx
pcre-8.37.tar.gz
openssl-1.01t.tar.gz
zlib-1.2.8.tar.gz
nginx-1.11.1.tar.gz
第一步 pcre-config --version
安裝方式:wget http://downloads.sourceforge.net/project/pcre/pcre/8.37/pcre-8.7.tar.gz
wget https://netix.dl.sourceforge.net/project/pcre/pcre/8.40/pcre-8.40.tar.gz
解壓文件 ./configure完成後回到pcre目錄制定make ,再執行make install
第二步,安裝openssl
第三步,安裝zlib
yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
第四步 安裝nginx
解壓nginx-xx.tar.gz包
進入目錄執行./configure
make && make install
安裝成功後再usr中有個local/neginx ,在sbin有啓動腳本
三、nginx常用命令
/usr/local/nginx/sbin
查看nginx版本
./neginx -v
啓動nginx
./neginx
關閉nginx
./nginx -s stop
重新加載nginx
./neginx -s reload
/******************
四、nginx.conf配置文件組成
(1)全局快
從配置文件開始到enents塊之間,主要會設置一些影響nginx服務整體運行的配置
指令,比如:worker_processes:1 值越大代表支持的併發數越大
(2) events塊
設計的指令主要nginx服務器與用戶網絡連接
比如:worker_connections:1024 支持的最大連接數
(3)http塊
nginx服務皮遏制最頻繁的部分
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#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;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
http包括http全局塊和server塊
五、nginx配置實例
location 指令說明:
該指令用於匹配url
語法如下
localhost [= | ~ | ~* | ^~] url {}
1 = : 用於不含有正則表達式的uri前面,要去請求字符串與uri嚴格匹配,如果匹配成功,就停止繼續向下搜索並立即處理該請求。
2 ~ : 用於表示uri包含正則表達式並且區分大小寫
3 ~* :用於表示uri包含正則表達式,並且不區分大小寫
4 ^~ : 用於不含有正則表達式的uri前面,要去nginx服務器找到標識uri和請求字符串匹配度最高的localhost後。立即使用該localhost·處理請求,而不再使用location塊中正則的rui和請求字符串做匹配。
注意,如果rui中包含正則表達式則必須有~ 或者~*標識。
反向代理,動靜分離,負載均衡,高可用
1 反向代理-1
實現效果:打開瀏覽器輸入地址www.123.com,跳轉到linux的tomcat首頁
2 反向代理-2
實現效果:使用nginx反向代理,根據訪問路徑跳轉不同端口的服務器中,nginx監聽9001端口
打開http://192.168.163.131:9001/deu 直接跳轉到127.0.0.1:8080
打開http://138.168.163.131:9001/vod 直接跳轉到127.0.0.1:8081
準備兩個tomcat服務器,一個端口8080 ,一個端口8081
然後8080webapps創建文件夾edu下面有a.html,,8081的webapps下面有vod文件夾下面a.html,,8081的webapps下面有vod有a.html
找到nginx的配置文件配置:/usr/location/nginx/conf/nginx.conf
3 負載均衡
瀏覽器中輸入http://192.168.163.131/deu/a.html,負載均衡效果拍平均8080和8081端口
1準備兩臺tomcat 8080 8081
2在webapps找那個創建edu文件夾,然後創建a.html文件用於測試。
3nginx中配置負載
隨着互聯網信息技的爆發性增長,負載均衡已經不在是一個很遙遠陌生的詞彙,顧名思義負載均衡就是將負載分攤道不同的服務單元。
既可保證服務的可用又可以保證服務的響應足夠快,給用戶很好的體驗。快速增長的訪問量和數據流量催生了各式各樣的負載均衡剷平。
很多專業的負載均衡硬件提供了很好地功能。但價格不菲,這使得聚在均衡軟件大受歡迎。
nginx就是其中一個。在linux下有nginx ,LVS , hparoxy等服務可以提供聚在均衡服務。而且ngin提供幾種分配方式(策略)
1 輪詢(默認)
每個請求按照時間順序逐一分配到不同的後端服務器,如果服務器down掉,自動剔除。
2 weight
weight代表權,重默認爲1,權重越高分配的客戶端越多
指定輪詢機率,weight和訪問比率成正比,用於後端服務器性能不均衡的情況,如
upstream server_pool{
server 192.168.163.131:8080 weight=10;
server 192.168.163.132:8081 weight=10;
}
3 ip_hash
每個請求按照ip的hash結果分配,這樣每個訪客固定訪問一個後端服務器,可以解決session問題,如果rui中包含正則表達式則必須有~
upstream server_pool {
ip_hash;
server 192.168.5.21:80;
server 192.168.5.22:80;
}
4 fair(第三方)
按後端服務器響應時間分配請求,響應時間越短有限分配
upstream server_pool{
server 192.168.5.21:80;
server 192.168.5.22:80;
fair;
}
4 動靜分離
nginx動靜分離就是把動態跟靜態請求分開,不能理解爲只是單純的動態頁面和靜態頁面物理分離。嚴格意義上說應該動態請求跟靜態請求分開,可以理解爲使用nginx處理靜態頁面,tomcat處理動態頁面。 動靜分離從目前實現上來說有兩種:
一種是純粹把靜態文件獨立成單獨的域名,放在獨立的服務器上,也是目前主流推崇的方案。
另一種是將動態和動態文件混合在一起發佈。通過nginx來分開。通過location指定不同的後綴名實現不同的請求和轉發。通過expires參數設置可以使瀏覽器緩存過期時間。減少與服務器之前的請求和流量。具體expires定義: 給一個資源設定一個過期時間,也就是說無需去服務端驗證直接通過瀏覽器本身 確定是否過期即可。所以不會產生額外的流量。此種方法非常適合不經常變動的資源。(如果經常更新文件,不建議使用expires來緩存),比如這裏設置3d,表示3天之內訪問這個url 發送一個請求,比如服務器該文件最後更新時間沒有變化。則不會從服務器抓取。返回狀態碼304, 如果有修改,則直接從服務器重新下載,返回狀態碼200;
準備工作:
1 在linux系統準備靜態資源,用於一會訪問。
2 www image
3 修改配置文件
4 訪問:http://192.168.163.131/image/%E5%AF%92%E7%83%9F%E6%9F%94.jpg
http://192.168.163.131/www/a.html
5 高可用
1準備工作:
1兩臺nginx服務器
2需要keepalived
3需要虛擬ip
2配置高可用準備工作:
(1)需要兩臺服務器
(2)在兩臺服務器安裝nginx
(3)在兩臺服務器安裝keepalived
3 在兩臺服務器安裝keepalived
(1)使用yum命令安裝
yum install keepalived -y
(2)安裝之後再etc目錄keepalived目錄有文件keepalived.conf配置文件
4 完成高可用配置(主從配置)
修改etc/keepalived修改配置文件
在 usr/local/src添加檢測腳本
/etc/hosts文件配置
配置文件:keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
smtp_server 192.168.163.131
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_http_port{
script "/usr/local/src/nginx_check.sh"
interval 2 # 檢查腳本執行間隔時間
weight 2
}
vrrp_instance VI_1 {
state BACKUP # 備份服務器上將MASTER改爲BACKUP
interface ens33 # 網卡
virtual_router_id 51 # 主備機器的必須一致
priority 90 #主備機器獲取不同的優先級,主機大,備機小
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.163.50 #vrrp h虛擬地址
# 192.168.200.16
# 192.168.200.17
# 192.168.200.18
}
}
virtual_server 192.168.200.100 443 {
delay_loop 6
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 192.168.201.100 443 {
weight 1
SSL_GET {
url {
path /
digest ff20ad2481f97b1754ef3e12ecd3a9cc
}
url {
path /mrtg/
digest 9b3a0c85a887a256d6939da88aabd8cd
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
virtual_server 10.10.10.2 1358 {
delay_loop 6
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
sorry_server 192.168.200.200 1358
real_server 192.168.200.2 1358 {
weight 1
HTTP_GET {
url {
path /testurl/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl3/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.200.3 1358 {
weight 1
HTTP_GET {
url {
path /testurl/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334c
}
url {
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334c
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
virtual_server 10.10.10.3 1358 {
delay_loop 3
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 192.168.200.4 1358 {
weight 1
HTTP_GET {
url {
path /testurl/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl3/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.200.5 1358 {
weight 1
HTTP_GET {
url {
path /testurl/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl3/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
腳本文件:
#!/bin/bash
A=`ps -C nginx -no-header | wc -l`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header | wc -l` -eq 0 ]
killall keepalived
fi
fi
六 nginx原理
首先,對於每個worker進程來說,獨立的進程,不需要加鎖,所以省去了鎖帶來的開銷。同時在變成以及問題查找時候也會更加方便。其次,採用獨立的進程,可以讓相互之間不會影響,一個進程退出後其他的進程還在工作,服務不會中斷,master進程則很快啓動新的worker進程。當然,worker進程異常退出肯定程序有bug,異常退出會導致單前worker上所有的請求失敗,不過不會影響所有的進程。所以降低了風險。
nginx採用redis類似的io多路複用機制,每個woker都是獨立的進程。但是每個進程裏只有一個主線程。通過異步非阻塞的方式來處理請求。即使千萬個請求也沒問題。沒給worker線程可以把一個cup性能發揮到極致。所以worker數和服務器cup數相等最爲適宜。設置少了浪費cup,設置多了cup頻繁切換上下文帶來損耗。
1 一個master和多個worker的好處
(1) 可以使用nginx -s reload 熱部署
(2)每個worker是獨立的進程,如果其中一個worker出現問題,其他woker還 可以繼續爭搶。實現請求過程不會服務中斷。
2需要設置多少個worker
worker數和服務器cup數相等最爲適宜
worker processes 4
# work綁定cup(4 work板頂4cpu)
worker cpu affinity 0001 0010 0100 1000
4 連接數worker_connection
表示每個worker進程所能建立連接的最大值。所以一個nginx能建立的最大連接數。應該是worker_connection * worker proceses.當然這裏說的是最大連接數。對於http請求本地資源來說。能夠支持的最大併發數是除以2 或者4.
發送請求佔用woker的幾個連接數:2或者4