1. 什么是Nginx
1.1. 介紹
Nginx是一款高性能的http 服務(wù)器聋迎、反向代理服務(wù)器及電子郵件(IMAP/POP3)代理服務(wù)器。由俄羅斯的程序設(shè)計師Igor Sysoev用c語言所開發(fā),官方測試nginx能夠支支撐5萬并發(fā)鏈接,并且cpu、內(nèi)存等資源消耗非常低绑榴,運行非常穩(wěn)定。
1.2. 主要運用場景
http服務(wù)器拣展。Nginx是一個http服務(wù)可以獨立提供http服務(wù)彭沼〉薰洌可以做網(wǎng)頁靜態(tài)服務(wù)器备埃。
虛擬主機。可以實現(xiàn)在一臺服務(wù)器虛擬出多個網(wǎng)站褐奴。例如個人網(wǎng)站使用的虛擬主機按脚。
反向代理,負載均衡敦冬。當(dāng)網(wǎng)站的訪問量達到一定程度后辅搬,單臺服務(wù)器不能滿足用戶的請求時,需要用多臺服務(wù)器集群可以使用nginx做反向代理。并且多臺服務(wù)器可以平均分擔(dān)負載堪遂,不會因為某臺服務(wù)器負載高宕機而某臺服務(wù)器閑置的情況介蛉。
2. Nginx的安裝與使用
2.1. 準備安裝環(huán)境
第一步:在Linux系統(tǒng)上安裝gcc環(huán)境。
yum -y install gcc-c++
第二步:安裝第三方開發(fā)包PCRE庫溶褪,nginx的http模塊使用pcre來解析正則表達式币旧,所以需要在linux上安裝pcre庫。
yum install -y pcre pcre-devel
第三步:安裝第三方zlib庫猿妈,nginx使用zlib對http包的內(nèi)容進行壓縮與解壓縮吹菱。
yum install -y zlib zlib-devel
第四步:安裝OpenSSL安全套接字密碼庫,囊括主要的密碼算法彭则、常用的密鑰和證書封裝管理功能及SSL協(xié)議鳍刷。
yum install -y openssl openssl-devel
2.2. 安裝Nginx
第一步:下載Nginx源碼包,并解壓到自己創(chuàng)建目錄俯抖。
第二步:進入到解壓目錄输瓜,依次輸入指令./configure、make芬萍、make install前痘,進行安裝,安裝完成后Nginx的相關(guān)文件在/usr/local/nginx目錄下担忧。如需要改變相關(guān)路徑芹缔,首先創(chuàng)建client目錄,然后在執(zhí)行configure命令時瓶盛,添加配置路徑項最欠,指令如下:
mkdir /var/temp/nginx/client -p
./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi
第三步:進入安裝目錄/usr/local/nginx/sbin/,啟動nginx惩猫,執(zhí)行命令:
[root@localhost sbin]# ./nginx
第四步:輸入指令ps aux|grep nginx檢查nginx是否啟動成功芝硬,并在瀏覽器中輸入ip進行訪問。
注:訪問的默認端口是80端口轧房。注意:看是否關(guān)閉防火墻拌阴。
2.3. Nginx相關(guān)命令
/usr/local/nginx/sbin/nginx # 啟動服務(wù)
/usr/local/nginx/sbin/nginx -s reload # 重新加載服務(wù)
/usr/local/nginx/sbin/nginx -s stop # 停止服務(wù)
/usr/local/nginx/sbin/nginx -s quit # 停止服務(wù)
補充:為Nginx添加開機自動啟動。
第一步:修改/etc/rc.local文件奶镶,添加一行/usr/local/nginx/sbin/nginx迟赃,保存并退出。
第二步:在/etc目錄下執(zhí)行指令厂镇,使其生效纤壁。
chmod 755 rc.local
3. Nginx配置多個虛擬主機
虛擬的主機就是在一臺服務(wù)器啟動多個網(wǎng)站。Nginx可以通過端口不同和域名不同來區(qū)分不同的網(wǎng)站捺信。
3.1. 通過端口區(qū)分虛擬主機
第一步:vim打開配置文件/usr/local/nginx/conf/nginx.conf酌媒,添加兩個不同端口的Server,并修改listen訪問端口和root對應(yīng)的訪問目錄,此目錄默認為/usr/local/nginx/html秒咨,這里改為html1和html2喇辽。
第二步:復(fù)制/usr/local/nginx/html文件夾兩份,名字分別為html1和html2雨席。注意名字要去第一步root修改的名字一樣茵臭。
第四步:為了區(qū)分是否為不同虛擬主機,修改html1和html2目錄下的index.html文件舅世,如下:
第三步:執(zhí)行Nginx重啟命令旦委,重啟。
/usr/local/nginx/sbin/nginx -s reload
第四步:在瀏覽器中輸入地址+端口雏亚,訪問如下缨硝,表示配置成功。
3.2. 通過域名區(qū)分虛擬主機
3.2.1 域名的分類
域名分為一級域名(頂級域名)罢低、二級域名和三級域名查辩。舉例如下:
一級域名:又叫頂級域名
Baidu.com
Taobao.com
Jd.com
二級域名:
Image.baidu.com
Item.baidu.com
三級域名:
1.Image.baidu.com
Aaa.image.baidu.com
3.2.2 域名訪問網(wǎng)站的過程
域名訪問網(wǎng)站,其本質(zhì)還是通過Tcp/ip協(xié)議訪問,以下為通過域名訪問的流程圖:
DNS服務(wù)器:把域名解析為ip地址网持。保存的就是域名和ip的映射關(guān)系,可以簡單的理解為一個MAP<KEY,VALUE>宜岛。
本地測試可以修改host文件。修改window的hosts文件:(C:\Windows\System32\drivers\etc)功舀,可以通過SwitchHosts工具萍倡,以管理員權(quán)限運行的方式進行修改。
3.2.3 配置域名并訪問
第一步:修改Window系統(tǒng)文件C:\Windows\System32\drivers\etc\hosts辟汰,添加需要訪問的域名列敲,可以通過SwitchHosts工具添加。
第二步:打開hosts文件帖汞,檢查是否添加成功戴而。如果沒有添加成功,請檢查是否開啟相關(guān)權(quán)限控制軟件翩蘸,如360安全衛(wèi)士所意。
第三步:在Linux系統(tǒng)中,vim打開配置文件/usr/local/nginx/conf/nginx.conf催首,添加兩個不同端口的Server扶踊,并修改server_name訪問域名和root對應(yīng)的訪問目錄,這里改為html3和html4翅帜。
第四步:復(fù)制/usr/local/nginx/html文件夾兩份姻檀,名字分別為html3和html4。注意名字要去第三步root修改的名字一樣涝滴。
第五步:為了區(qū)分是否為不同虛擬主機,修改html3和html4目錄下的index.html文件,如下:
第六步:執(zhí)行Nginx重啟命令歼疮,重啟杂抽。
/usr/local/nginx/sbin/nginx -s reload
第七步:在瀏覽器中輸入域名,訪問如下韩脏,表示配置成功缩麸。
4. Nginx代理模式
Nginx代理模式分為正向代理和反向代理。正向代理指的是赡矢,用戶訪問代理服務(wù)器杭朱,代理服務(wù)器直接轉(zhuǎn)發(fā)請求到指定服務(wù)器;反向代理指的是吹散,用戶訪問公網(wǎng)ip網(wǎng)站入口弧械,由代理服務(wù)器決定內(nèi)部網(wǎng)絡(luò)上哪一臺服務(wù)器提供對應(yīng)服務(wù)。以下正向代理和反向代理通過tomcat服務(wù)器演示空民。
4.1. 配置正向代理
正向代理刃唐,需要在客戶機中安裝代理軟件。用戶訪問網(wǎng)站時界轩,會被代理軟件攔截画饥,然后代理軟件去請求用戶訪問的網(wǎng)站,獲得網(wǎng)站數(shù)據(jù)浊猾,在返回給用戶抖甘,在訪問過程中,瀏覽器地址欄網(wǎng)站不會發(fā)生改變葫慎。
4.2. 配置反向代理
第一步:安裝兩個tomcat单山,修改配置文件端口分別為8081和8082。為了進行區(qū)分幅疼,修改tomcat目錄下/ webapps/ROOT/index.jsp文件米奸,然后啟動兩個tomcat。
第二步:修改Window系統(tǒng)文件C:\Windows\System32\drivers\etc\hosts爽篷,添加需要訪問的域名悴晰,可以通過SwitchHosts工具添加。
第三步:在Linux系統(tǒng)中逐工,vim打開配置文件/usr/local/nginx/conf/nginx.conf铡溪,添加兩個不同端口的Server,并修改server_name訪問域名泪喊;分別添加upstream tomcat1和upstream tomcat2棕硫;在location中添加proxy_pass 為tomcat1和tomcat2訪問地址。(也可不添加upstream袒啼,直接在proxy_pass中添加訪問地址)
第四步:執(zhí)行Nginx重啟命令哈扮,重啟纬纪。
第五步:在瀏覽器中輸入指定域名,訪問如下滑肉,表示配置成功包各。
5. 負載均衡
如果一個服務(wù)由多臺服務(wù)器提供,需要把負載分配到不同的服務(wù)器處理靶庙,需要配置負載均衡问畅,默認的負載均衡的策略就是輪詢的方式。
upstream tomcat2 {
server 192.168.25.130:8081;
server 192.168.25.130:8082;
}
也可以根據(jù)服務(wù)器的實際情況調(diào)整服務(wù)器權(quán)重六荒。權(quán)重越高分配的請求越多护姆,權(quán)重越低分配的請求越,默認是都是1掏击。
upstream tomcat2 {
server 192.168.25.130:8081;
server 192.168.25.130:8082 weight=2;
}
其他的負載均衡的策略:1.通過IP地址的hash值 做映射卵皂。2.通過URL的方式計算出Hash值 。3.隨機策略铐料。4.最少并發(fā)量渐裂。
查考nginx.conf
配置方案:
user nginx;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream myapp1 {
server 192.168.25.132:9090 weight=2;
server 192.168.25.132:9091 weight=10;
}
server {
listen 80;
server_name www.demon.com;
location / {
proxy_pass http://myapp1;
index index.jsp index.html index.htm;
}
}
}
6. 擴展知識
6.1. Nginx解決跨域問題
以下為文件上傳的跨域配置方案:
user nginx;
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 www.demon.com;
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range';
location / {
proxy_pass http://192.168.25.134:8888;
if ($request_method = 'OPTIONS') {
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers X-Requested-With;
add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,PATCH,OPTIONS;
# 解決假請求問題,如果是簡單請求則沒有這個問題钠惩,但這里是上傳文件柒凉,首次請求為 OPTIONS 方式,實際請求為 POST 方式
# Provisional headers are shown.
# Request header field Cache-Control is not allowed by Access-Control-Allow-Headers in preflight response.
add_header Access-Control-Allow-Headers DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range;
return 200;
}
}
}
}
6.2. Keepalived實現(xiàn)Nginx主備
Keepalived是集群管理中保證集群高可用的一個服務(wù)軟件篓跛,用來防止單點故障膝捞。
Keepalived的作用是檢測web服務(wù)器的狀態(tài),如果有一臺web服務(wù)器死機愧沟,或工作出現(xiàn)故障蔬咬,Keepalived將檢測到,并將有故障的web服務(wù)器從系統(tǒng)中剔除沐寺,當(dāng)web服務(wù)器工作正常后Keepalived自動將web服務(wù)器加入到服務(wù)器群中林艘,這些工作全部自動完成,不需要人工干涉混坞,需要人工做的只是修復(fù)故障的web服務(wù)器狐援。
6.3 配置HTTPS
編譯命令
./configure --prefix=/data/test/nginx/ --with-http_stub_status_module --with-http_ssl_module --with-stream
配置文件:
#user nobody;
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 fin-uatms.vvtechnology.cn;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
# HTTPS server
#
server {
listen 443 ssl;
server_name fin-uatms.vvtechnology.cn;
ssl_certificate /data/test/nginx/fin-uatms.vvtechnology.cn.pem;
ssl_certificate_key /data/test/nginx/fin-uatms.vvtechnology.cn.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
}
}