一、基本概念
1.什麼是Nginx
Nginx是一個高性能的HTTP和反向代理服務器,也是一個IMAP/POP3/SMTP代理server。其特點是佔有內存少。併發能力強,其併發能力確實在同類型的網頁server中表現較好。
http服務器
Web服務器是指駐留於因特網上某種類型計算機的程序。當Web瀏覽器(客戶端)連到服務器上並請求文件時,服務器將處理該請求並將文件反饋到該瀏覽器上,附帶的信息會告訴瀏覽器如何查看該文件(即文件類型)。服務器使用HTTP(超文本傳輸協議)與客戶機瀏覽器進行信息交流,這就是人們常把它們稱爲HTTP服務器的原因。
代理服務器
通常是指局域網內部的機器通過代理服務器發送請求到互聯網上的服務器,代理服務器一般作用在客戶端。
反向代理
客戶端向反向代理的命名空間中的內容發送普通請求,接着反向代理將推斷向何處(原始服務器)轉交請求,並將獲得的內容返回給客戶端。
正向代理
正向代理是一個位於客戶端和原始服務器之間的代理服務器,爲了從原始服務器取得內容,客戶端向代理服務器發送一個請求並指定目標原始服務器。然後代理服務器向原始服務器轉交請求並將獲得的內容返回給客戶端。
反向代理vs正向代理
從安全性來講,正向代理同意客戶端通過它訪問隨意站點而且隱藏客戶端自身,因此你必須採取安全措施以確保僅爲經過授權的客戶端提供服務。反向代理對外都是透明的,訪問者並不知道自己訪問的是一個代理。
2.Nginx特點
- 反向代理:
上面已經說過了。
- 負載均衡:
當請求過多,單個服務器難以負荷時,我們增加服務器的數量,然後將請求分發到各個服務器上,將原先請求集中到單個服務器上的情況改爲將請求分發到多個服務器上。
動靜分離:
爲了加快網站的解析速度,可以吧動態頁面和靜態頁面由不同的服務器來解析,加快解析速度,降低原來單個服務器的壓力。具體的內容見本博客後面第五章。
二、安裝、常用命令、配置文件
首先你得有一個linux操作系統的環境,要麼是你自己的服務器,要麼是你自己電腦上的虛擬機,要麼是你租的雲服務器。以下以centos爲例。
1.安裝
安裝gcc環境,用來將官網下載的源碼進行編譯:
yum install gcc-c++
安裝 pcre 庫:
yum install -y pcre pcre-devel
安裝zlib 庫:
yum install -y zlib zlib-devel
安裝安裝 OpenSSL 庫:
yum install -y openssl openssl-devel
下載nginx包:
wget -c https://nginx.org/download/nginx-1.12.0.tar.gz
解壓nginx包:
tar -zxvf nginx-1.12.0.tar.gz
進入nginx文件夾:
cd nginx-1.12.0
使用默認配置:
./configure
編譯安裝:
make
make install
到此,nginx算是安裝好了。
2.常用命令
以下所有命令都必須進入sbin目錄以後才能執行:
# 進入nginx目錄
cd /usr/local/nginx/sbin/
查看版本號:
./nginx -v
啓動nginx:
# 啓動nginx
./nginx
啓動時報錯端口占用,解決:
# 殺死80端口的進程
fuser -k 80/tcp
現在再次啓動nginx。
關閉nginx:
./nginx -s stop
重新加載配置文件:
./nginx -s reload
訪問nginx:
# 在瀏覽器中訪問以下地址
http://服務器ip:80/
3.配置文件
- 配置文件所在目錄:
執行以下命令,就可以訪問並修改配置
vim /usr/local/nginx/conf/nginx.conf
- 配置文件——全局塊:
這部分都是些影響nginx全局配置的指令:
#user nobody;
worker_processes 1;# 配置nginx併發處理量,但是併發也會受硬件、軟件的制約
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
- 配置文件——events塊:
這部分用來配置nginx服務器與用戶的網絡連接:
events {
worker_connections 1024;# nginx支持的最大連接數
}
- 配置文件——http塊:
http {
include mime.types;
default_type application/octet-stream;
location / { # 配置路徑跳轉
root html;
index index.html index.htm;
}
#server {
# listen 8000;# 監聽接口
# listen somename:8080;
# server_name somename alias another.alias;# 服務器名
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
4.防火牆相關命令
如果linux中開啓了防火牆,在windows系統中訪問linux系統中的nginx端口默認訪問不到,需要修改防火牆配置。
# 查看開放的端口號
firewall-cmd --list-all
# 設置開放的端口號
firewall-cmd --add-service=http --permanent
firewall-cmd --add-port=80/tcp --permanent
# 重啓防火牆
firewall-cmd --reload
三、配置——反向代理
1.反向代理實例1
我們想實現的效果是:打開瀏覽器,訪問www.123.com
將跳轉到linux系統tomcat主頁面中去。具體過程如下:
(1)在windows系統的hosts文件進行域名映射
進入以下路徑,並找到hosts文件:
C:\Windows\System32\drivers\etc
打開hosts文件後添加如下配置:
1.15.34.101 www.123.com
(2)安裝tomcat
- 依次執行以下命令下載安裝tomcat:
wget https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.31/bin/apache-tomcat-8.5.31.tar.gz
tar xf apache-tomcat-8.5.31.tar.gz -C /usr/local/
cd /usr/local/
ln -sv apache-tomcat-8.5.31 tomcat
- 配置環境變量:
# 執行此命令後粘貼下方配置
vim /etc/profile.d/tomcat.sh
# 配置內容
CATALINA_BASE=/usr/local/tomcat
PATH=$CATALINA_BASE/bin:$PATH
export PATH CATALINA_BASE
# 使配置文件生效
source /etc/profile.d/tomcat.sh
- 查看tomcat版本狀態:
catalina.sh version
- 啓動tomcat:
cd /usr/local/tomcat/bin
./startup.sh
- 訪問tomcat:
由於沒配置端口,默認爲8080。
# 在瀏覽器中輸入url訪問
http://服務器ip:8080/
- 如何配置端口號
# 進入配置文件夾
cd /usr/local/tomcat/conf
# 打開並修改server.xml配置文件,port屬性的值就是當前tomcat服務器的端口號
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
(3)在nginx中進行轉發請求的配置
在linux服務器中執行以下命令,打開nginx配置文件:
vim /usr/local/nginx/conf/nginx.conf
然後修改server部分的配置:
server {
listen 80;# 配置默認端口
server_name 1.12.34.101; # 配置服務器名爲ip
location / {
root html;
proxy_pass http://1.15.34.101:8080; # 添加這一行
index index.html index.htm;
}
}
現在,當我們在瀏覽器中訪問www.123.com
就會被nginx轉發給tomcat了。
2.反向代理實例2
我們想實現的效果是:使用nginx反向代理,根據訪問的路徑跳轉到不同的tomcat服務器。
nginx監聽端口爲9001,服務器ip爲1.12.34.101
訪問http://1.12.34.101:9001/edu/跳轉至tomcat服務器1(http://1.12.34.101:8000)
訪問http://1.12.34.101:9001/vod/跳轉至tomcat服務器2(http://1.12.34.101:8001)
(1)準備tomcat服務器
我們需要兩個tomcat服務器,一個8000端口,一個8001端口。
前面一節已經展示了怎麼安裝tomcat,安裝兩個tomcat步驟大同小異:
新建兩個目錄,分別裝兩個tomcat服務器,可以通過路徑文件夾名的不同予以區分
在另個目錄下下載、安裝tomcat
配置兩個服務器的端口號,一個爲8000,一個爲8001
(2)配置Nginx
nginx配置文件路徑上一節已經說過了,這裏只給出具體配置。
修改server部分配置:
server {
listen 9001;# 配置端口
server_name 1.12.34.101; # 配置服務器名爲ip
location ~ /edu/ {
proxy_pass http://1.15.34.101:8000;
}
location ~ /vod/ {
proxy_pass http://1.15.34.101:8001;
}
}
3.location指令說明
語法:
location [ = | ~ | ~* | ^~ ] uri {
}
= :用於不含正則表達式的uri前,表示嚴格匹配
~ :用於正則表達式的uri前,區分大小寫
~* :用於正則表達式的uri前,不區分大小寫
^~ :用於不含正則表達式的uri前,要求nginx服務器找到標識uri和請求字符串匹配度最高的location後,立即使用此location處理請求,而不再使用location塊中的正則uri和請求字符串做匹配。
四、配置——負載均衡
我們想要實現的效果是:在瀏覽器中訪問http://1.12.34.101/edu/a.html,nginx能實現負載均衡效果,將請求平均到8080和8081端口中去。簡單來說就是,雖然只有一個請求,但每次發起請求nginx會以相同的概率轉發到兩個tomcat服務器中去。
1.基本配置步驟
- 搭建兩個tomcat服務器,端口分別爲8080和8081。
- 在兩個tomcat服務器裏面的webapps目錄中,創建edu文件夾,再在edu文件夾中創建a.html頁面。
- 在nginx的配置文件中進行負載均衡的配置:
# 在http模塊中添加以下配置,指明要參與負載均衡的服務器
upstream myserver{
ip_hash;
server 1.12.34.101:8080 weight=1;
server 1.12.34.101:8081 weight=1;
}
# 修改server模塊
server {
listen 80;
server_name 1.12.34.101;
location / {
proxy_pass http://myserver;
root html;
index index.html index.htm;
}
}
2.Nginx中負載均衡的分配方式
(1)輪詢(默認)
每個請求按照時間順序逐一分配到不同後端服務器中去,掛了的服務器會被自動剔除。
(2)weight
weight代表權重,默認爲1,權重越高,被分配的客戶端請求會越多。
upstream myserver{
server 1.12.34.101:8080 weight=10;
server 1.12.34.101:8081 weight=10;
}
(3)ip_hash
每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端服務器,可以解決session的問題。
upstream myserver{
ip_hash;
server 1.12.34.101:8080;
server 1.12.34.101:8081;
}
(4)fair
按後端服務器的響應時間來分配請求,響應時間短的優先分配。
upstream myserver{
server 1.12.34.101:8080;
server 1.12.34.101:8081;
fair;
}
五、配置——動靜分離
什麼是動靜分離?嚴格意義上來說就是將動態請求和靜態請求分開,可以理解成使用Nginx處理靜態頁面,Tomcat處理動態頁面。
實現方式:
- 主流:純粹地把靜態文件獨立成單獨的域名,放在獨立的服務器上。
- 將動態文件和靜態文件放一起,通過Nginx分開。
基本配置步驟
- 在linux系統中準備靜態資源:
# 創建並進入data目錄,再進入data中創建目錄www,用來放靜態資源
mkdir data
cd data
mkdir www
# 在www中創建a.txt,並隨便寫入點內容作爲測試,保存退出
vi a.txt
- 修改nginx配置,使得靜態資源能被訪問:
# 修改server模塊
server {
listen 80;
server_name 1.12.34.101;
location /www/ {
root /data/;# 根目錄
proxy_pass http://myserver;
index index.html index.htm;
}
}
- 動態資源的準備及Nginx配置:
這部分內容第三、四章已經講過了,不再贅述。
六、配置——高可用集羣
什麼叫高可用?簡單來說就是,當我們的nginx服務器down機了,整個系統仍然能運轉,就說明整個體系是高可用的。
實現原理:
準備兩臺nginx服務器,一臺主服務器master,一臺備份服務器backup,當master掛了,立馬切換爲backup,使得整個體系仍然能運轉。
keepalived軟件:兩個nginx服務器都需要安裝keepalived,它的作用是判斷當前nginx服務器是否還存活着。
虛擬ip:我們還需要虛擬ip這麼個東西,用來訪問nginx服務器,當master掛了,虛擬ip會和backup進行綁定。
基本配置步驟
- 準備兩臺服務器,在兩臺服務器都裝上nginx和keepalived
假設一臺ip爲1.12.34.101
,另一臺爲1.12.34.131
。
# keepalived安裝命令:
yum install keepalived -y
# keepalived的配置文件路徑爲:
/etc/keepalived/keepalived.conf
- 配置主服務器的keepalived:
# 打開keepalived.conf
vim /etc/keepalived/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.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL # 主機名字,通過它能訪問到主機
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
# 針對檢測腳本的配置
vrrp_script chk_http_port{
script "/usr/local/src/nginx_check.sh" # 腳本所在路徑
interval 2 # 執行腳本的間隔
weight 2 # 設置當前服務器的權重
}
# 虛擬ip的配置
vrrp_instance VI_1 {
state MASTER # 主服務器這裏寫MASTER,備用服務器這裏寫BACKUP
interface eth0 # 綁定的網卡
virtual_router_id 51 # 主服務器、備用服務器這裏的值必須相同
priority 100 # 優先級,主服務器應該較大,備用服務器應該較小
advert_int 1 # 服務器心跳頻率,每1s跳一次
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.200.16 # vrrp H虛擬地址
192.168.200.17
192.168.200.18
}
}
- 配置主服務器的腳本nginx_check.sh:
在指定目錄下創建腳本文件:
vim /usr/local/src/nginx_check.sh
腳本內容:
#!/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 ];then
killall keepalived
fi
fi
- 配置從服務器的keepalived:
# 打開keepalived.conf
vim /etc/keepalived/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.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
# 針對檢測腳本的配置
vrrp_script chk_http_port{
script "/usr/local/src/nginx_check.sh"
interval 2 # 執行腳本的間隔
weight 2 # 權重參數
}
# 虛擬ip的配置
vrrp_instance VI_1 {
state BACKUP # 備用服務器這裏寫BACKUP
interface eth0 # 網卡要改成服務器對應的網卡
virtual_router_id 51 # 主服務器、備用服務器這裏的值必須相同
priority 90 # 優先級,主服務器應該較大,備用服務器應該較小
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.200.16 # vrrp H虛擬地址
192.168.200.17
192.168.200.18
}
}
- 配置主服務器的腳本nginx_check.sh:
同主服務器。
- 啓動兩臺服務器的nginx和keepalived:
keepalived啓動命令:
systemctl start keepalived.service
至此,高可用集羣就配置好了,可以自行配置並測試看看效果。