1瞧毙、Nginx簡介
1.1 什么是Nginx
Nginx(engine x)是一個高性能的Web服務(wù)器和反向代理服務(wù)器,也可以作為郵件代理服務(wù)器浸锨。
Nginx 特點是占有內(nèi)存少百侧,并發(fā)處理能力強(qiáng),以高性能谴供、低系統(tǒng)資源消耗而聞名块茁,Nginx官方測試為5萬并發(fā)請求。
Nginx是免費開源的桂肌,同時Nginx也有收費的商業(yè)版本数焊,商業(yè)版本提供了性能優(yōu)化、宕機(jī)等緊急問題處理等技術(shù)支持和服務(wù)崎场。
1.2 正向代理和反向代理概念
反向代理(Reverse Proxy)方式是指以==代理服務(wù)器==來接受internet上的連接請求佩耳,然后將請求轉(zhuǎn)發(fā)給內(nèi)部網(wǎng)絡(luò)上的服務(wù)器,并將從服務(wù)器上得到的結(jié)果返回給internet上請求連接的客戶端谭跨,此時代理服務(wù)器對外就表現(xiàn)為一個反向代理服務(wù)器干厚;
正向代理類似一個跳板機(jī)答恶,代理訪問外部資源。比如:我是一個用戶萍诱,我訪問不了某網(wǎng)站,但是我能訪問一個代理服務(wù)器污呼,這個代理服務(wù)器裕坊,它能訪問那個我不能訪問的網(wǎng)站,于是我先連上代理服務(wù)器燕酷,告訴它我需要那個無法訪問網(wǎng)站的內(nèi)容籍凝,代理服務(wù)器去取回來,然后返回給我。正向代理應(yīng)用最廣泛的就是“科學(xué)上網(wǎng)工具”苗缩。
綜上所述:==正向代理代理對象是客戶端饵蒂,反向代理代理對象是服務(wù)端。==
==軟件層面一般常用Nginx來做反向代理服務(wù)器酱讶,它的性能非常好退盯,用來做負(fù)載均衡。==
2泻肯、Nginx環(huán)境搭建
2.1 下載
wget http://nginx.org/download/nginx-1.14.2.tar.gz
2.2 安裝
Nginx的安裝需要確定Linux安裝相關(guān)的幾個庫渊迁,否則配置和編譯會出現(xiàn)錯誤,安裝的命令為:
yum install gcc openssl openssl-devel pcre pcre-devel zlib zlib-devel -y
開始安裝:
- tar -zxvf nginx-1.14.2.tar.gz
- cd nginx-1.14.2
- ./configure --prefix=/usr/local/nginx(--prefix是指定安裝路徑)
- make
- make install
2.3 Nginx常用命令
啟動:
- 普通啟動:cd nginx/sbin/;./nginx
- 通過配置文件啟動: ./nginx -c /usr/local/nginx/conf/nginx.conf
- 查看進(jìn)程灶挟,檢查Nginx是否啟動:ps -ef | grep nginx
關(guān)閉:
- kill -QUIT 主pid(這種關(guān)閉方式會處理完請求后再關(guān)閉)
- kill -TERM 主pid(暴力關(guān)閉)
重啟Nginx:
./nginx -s reload
檢查配置文件是否正確:/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf –t
3琉朽、Nginx配置文件說明
Nginx核心配置文件在/nginx/conf目錄下,名字為nginx.conf稚铣,內(nèi)容如下:
#配置worker進(jìn)程運(yùn)行用戶 nobody也是一個linux用戶箱叁,一般用于啟動程序,沒有密碼
user nobody;
#配置工作進(jìn)程數(shù)目惕医,根據(jù)硬件調(diào)整耕漱,通常等于CPU數(shù)量或者2倍于CPU數(shù)量
worker_processes 1;
#配置全局錯誤日志及類型,[debug | info | notice | warn | error | crit]曹锨,默認(rèn)是error
error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
pid logs/nginx.pid; #配置進(jìn)程pid文件
###====================================================
#配置工作模式和連接數(shù)
events {
worker_connections 1024; #配置每個worker進(jìn)程連接數(shù)上限孤个,nginx支持的總連接數(shù)就等于worker_processes * worker_connections
}
###===================================================
#配置http服務(wù)器,利用它的反向代理功能提供負(fù)載均衡支持
http {
#配置nginx支持哪些多媒體類型,可以在conf/mime.types查看支持哪些多媒體類型
include mime.types;
#默認(rèn)文件類型 流類型沛简,可以理解為支持任意類型
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日志及存放路徑齐鲤,并使用上面定義的main日志格式
#access_log logs/access.log main;
sendfile on; #開啟高效文件傳輸模式
#tcp_nopush on; #防止網(wǎng)絡(luò)阻塞
#keepalive_timeout 0;
keepalive_timeout 65; #長連接超時時間椒楣,單位是秒
#gzip on; #開啟gzip壓縮輸出
###-----------------------------------------------
#配置虛擬主機(jī)捧灰,可以有多個
server {
listen 80; #配置監(jiān)聽端口
server_name localhost; #配置服務(wù)名
#charset koi8-r; #配置字符集
#access_log logs/host.access.log main; #配置本虛擬主機(jī)的訪問日志
#默認(rèn)的匹配斜杠/的請求,當(dāng)訪問路徑中有斜杠/饲窿,會被該location匹配到并進(jìn)行處理
location / {
#root是配置服務(wù)器的默認(rèn)網(wǎng)站根目錄位置逾雄,默認(rèn)為nginx安裝主目錄下的html目錄
root html;
#配置首頁文件的名稱
index index.html index.htm;
}
#error_page 404 /404.html; #配置404頁面
# redirect server error pages to the static page /50x.html
#error_page 500 502 503 504 /50x.html; #配置50x錯誤頁面
#精確匹配
location = /50x.html {
root html;
}
#PHP 腳本請求全部轉(zhuǎn)發(fā)到Apache處理
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
#PHP 腳本請求全部轉(zhuǎn)發(fā)到FastCGI處理
# 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;
#}
#禁止訪問 .htaccess 文件
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
#配置另一個虛擬主機(jī)
# 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服務(wù)永品,安全的網(wǎng)絡(luò)傳輸協(xié)議鼎姐,加密傳輸,端口443喂走,運(yùn)維來配置
#
# 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;
# }
#}
}
4、Nginx主要應(yīng)用
4.1 靜態(tài)網(wǎng)站部署
Nginx是一個HTTP的web服務(wù)器帖池,可以將服務(wù)器上的靜態(tài)文件(如HTML睡汹、圖片等)通過HTTP協(xié)議返回給瀏覽器客戶端囚巴。
假設(shè)要將一個靜態(tài)網(wǎng)站ace部署到Nginx服務(wù)器上:
- 將ace上傳到linux的/opt/static目錄下
- 修改nginx.conf配置文件:
//在server中彤叉,通過location匹配訪問的路徑秽浇,然后轉(zhuǎn)發(fā)給靜態(tài)資源
location / {
root html;
root /opt/static/ace;
index index.html index.htm;
}
location /ace { //這里接受/ace請求审残,去/opt/static下找資源
root /opt/static;
index index.html index.htm;
}
- 重啟nginx
- 在瀏覽器中輸入http://localhost:80/ace進(jìn)行訪問
location中配置路徑講解:
規(guī)則:==ip + port 等于 root==搅轿,假設(shè)server的配置如下:
server {
listen 80; #端口號
location / {
root /opt/static/ace; #靜態(tài)文件路徑
}
}
替換:
http://localhost:80/ = root = /opt/static/ace
http://localhost:80/ace = root/ace = /opt/static/ace/ace
4.2 負(fù)載均衡
在網(wǎng)站創(chuàng)立初期,我們一般都使用單臺機(jī)器對外提供集中式服務(wù)。隨著業(yè)務(wù)量的增大铲敛,我們一臺服務(wù)器不夠用伐蒋,此時就會把多臺機(jī)器組成一個集群對外提供服務(wù)先鱼,但是焙畔,我們網(wǎng)站對外提供的訪問入口通常只有一個宏多,比如 www.web.com伸但。那么當(dāng)用戶在瀏覽器輸入www.web.com進(jìn)行訪問的時候更胖,如何將用戶的請求分發(fā)到集群中不同的機(jī)器上呢却妨,這就是負(fù)載均衡要做的事情管呵。
負(fù)載均衡通常是指將請求"均勻"分?jǐn)偟郊褐卸鄠€服務(wù)器節(jié)點上執(zhí)行捐下,這里的均勻是指在一個比較大的統(tǒng)計范圍內(nèi)是基本均勻的奸柬,并不是完全均勻婴程。
Nginx負(fù)載均衡
Nginx通過在nginx.conf文件進(jìn)行配置即可實現(xiàn)負(fù)載均衡
原理圖
配置如下:
- 在http模塊內(nèi)加上upstream配置
upstream myweb {
server 127.0.0.1:9100 weight=5;#這里可以是一個端口號為9100的tomcat
server 127.0.0.1:9200 weight=2;#同上
}
其中weight=1表示權(quán)重,用于后端服務(wù)器性能不均的情況铃肯,訪問比率約等于權(quán)重之比押逼,權(quán)重越大訪問機(jī)會越多挑格。
upstream是配置nginx與后端服務(wù)器負(fù)載均衡非常重要的一個模塊,并且==它還能對后端的服務(wù)器的健康狀態(tài)進(jìn)行檢查==灾搏,若后端服務(wù)器中的一臺發(fā)生故障士骤,則前端的請求不會轉(zhuǎn)發(fā)到該故障的機(jī)器拷肌。
- 在server模塊里添加location,并配置proxy_pass
location /myweb {
proxy_pass http://myweb;
}
==其中myweb字符串要和upstream后面的字符串相等==若锁。
==Nginx常用負(fù)載均衡策略:==
- 輪詢(默認(rèn))
upstream backserver {
server 127.0.0.1:8080;
server 127.0.0.1:9090;
}
==注意:這里的輪詢并不是每個請求輪流分配到不同的后端服務(wù)器又固,與ip_hash類似乏冀,但是按照訪問url的hash結(jié)果來分配請求辆沦,使得每個url定向到同一個后端服務(wù)器,主要應(yīng)用于后端服務(wù)器為緩存時的場景下。==
- 權(quán)重
upstream backserver {
server 192.168.0.14 weight=5;
server 192.168.0.15 weight=2;
}
每個請求按一定比例分發(fā)到不同的后端服務(wù)器,weight值越大訪問的比例越大育拨,用于后端服務(wù)器性能不均的情況。
- ip_hash
upstream backserver {
ip_hash;
server 127.0.0.1:8080;
server 127.0.0.1:9090;
}
==ip_hash也叫IP綁定析蝴,每個請求按訪問ip的hash值分配,這樣每個訪問客戶端會固定訪問一個后端服務(wù)器佑菩,可以解決會話Session丟失的問題。==
- 最少連接
upstream backserver {
least_conn;
server 127.0.0.1:8080;
server 127.0.0.1:9090;
}
web請求會被轉(zhuǎn)發(fā)到連接數(shù)最少的服務(wù)器上
4.3 靜態(tài)代理
把所有靜態(tài)資源的訪問改為訪問nginx,而不是訪問tomcat莲蜘,這種方式叫靜態(tài)代理。因為nginx更擅長于靜態(tài)資源的處理鞠眉,性能更好,效率更高。
所以在實際應(yīng)用中,我們將靜態(tài)資源比如圖片胆胰、css、html厚柳、js等交給nginx處理扎谎,而不是由tomcat處理移袍。
Nginx靜態(tài)代理實現(xiàn)方式
- 在nginx.conf的location中配置靜態(tài)資源的后綴觅够。例如:當(dāng)訪問靜態(tài)資源,從linux服務(wù)器/opt/static目錄下獲取。
location ~ .*\.(js|css|htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid
|doc|ppt|pdf|xls|mp3|wma)$ {
root /opt/static;
}
說明:
- ~表示正則匹配,也就是說后面的內(nèi)容可以是正則表達(dá)式匹配恨课。
- 第一個點 . 表示任意字符剂公。
- *表示一個或多個字符希俩。
- . 是轉(zhuǎn)移字符,是后面這個點的轉(zhuǎn)移字符诬留。
- | 表示或者斜纪。
- $ 表示結(jié)尾贫母。
- 在nginx.conf的location中配置靜態(tài)資源所在目錄文兑。例如當(dāng)訪問靜態(tài)資源,則從linux服務(wù)器/opt/static目錄下獲取腺劣。
location ~ .*/(css|js|img|images) {
root /opt/static;
}
xxx/css
xxx/js
xxx/img
xxx/images
我們將靜態(tài)資源放入 /opt/static 目錄下绿贞,然后用戶訪問時由nginx返回這些靜態(tài)資源。
4.4 動靜分離
Nginx的負(fù)載均衡和靜態(tài)代理結(jié)合在一起橘原,我們可以實現(xiàn)動靜分離籍铁,這是實際應(yīng)用中常見的一種場景。
動態(tài)資源趾断,如jsp由tomcat或其他web服務(wù)器完成拒名。
靜態(tài)資源,如圖片芋酌、css增显、js等由nginx服務(wù)器完成。
它們各司其職脐帝,專注于做自己擅長的事情同云。
動靜分離充分利用了它們各自的優(yōu)勢糖权,從而達(dá)到更高效合理的架構(gòu)。
整個架構(gòu)中炸站,一個nginx負(fù)責(zé)負(fù)載均衡星澳,兩個nginx負(fù)責(zé)靜態(tài)代理。Nginx在一臺Linux上安裝一份旱易,可以啟動多個Nginx禁偎,每個Nginx的配置文件不一樣即可。
4.5 虛擬主機(jī)
虛擬主機(jī)咒唆,就是把一臺物理服務(wù)器劃分成多個“虛擬”的服務(wù)器届垫,這樣我們的一臺物理服務(wù)器就可以當(dāng)做多個服務(wù)器來使用,從而可以配置多個網(wǎng)站全释。
Nginx提供虛擬主機(jī)的功能装处,就是為了讓我們不需要安裝多個Nginx,就可以運(yùn)行多個域名不同的網(wǎng)站浸船。
Nginx下妄迁,一個server標(biāo)簽就是一個虛擬主機(jī)。nginx的虛擬主機(jī)就是通過nginx.conf中server節(jié)點指定的李命,想要設(shè)置多個虛擬主機(jī)登淘,配置多個server節(jié)點即可;
配置虛擬主機(jī)方式
- 基于端口的虛擬主機(jī)
基于端口的虛擬主機(jī)配置封字,使用端口來區(qū)分黔州。
瀏覽器使用 同一個域名+端口 或 同一個ip地址+端口訪問;
server {
listen 8080;
server_name www.myweb.com;
location /myweb {
proxy_pass http://www.myweb.com;
}
}
server {
listen 9090;
server_name www.myweb.com;
location /p2p {
proxy_pass http://www.p2p.com;
}
}
- 基于域名的虛擬主機(jī)
基于域名的虛擬主機(jī)是最常見的一種虛擬主機(jī)阔籽。
server {
listen 80;
server_name www.myweb.com;
location /myweb {
proxy_pass http://www. myweb.com;
}
}
server {
listen 80;
server_name www.p2p.com;
location /myweb {
proxy_pass http://www.p2p.com;
}
}
需要修改一下本地的hosts文件流妻,在hosts文件中配置:
本機(jī)ip www.myweb.com
本機(jī)ip www.p2p.com