Nginx
前提準備
首先是對于linux環境下的安裝(本地機器是windows版本,大家可以使用Vmware,但是需要配置網絡連接等,這里就不在展示虛擬機上的演示。這里使用到個人的阿里云云服務器搭配上xftp與xshell來進行文件的上傳與連接命令行的輸入)
注意:以下命令皆為centos7所使用。
下面開始進行系列依賴的安裝:
gcc 安裝:
yum -y install gcc automake autoconf libtool make
yum install gcc gcc-c++
復制代碼
pcre 安裝
cd /usr/local/src
wget https://netix.dl.sourceforge.net/project/pcre/pcre/8.40/pcre-8.40.tar.gz
tar -zxvf pcre-8.40.tar.gz
cd pcre-8.40
./configure
make && make install
復制代碼
zlib 安裝
cd /usr/local/src
wget http://zlib.net/zlib-1.2.11.tar.gz wget http://www.zlib.net/zlib-1.2.11.tar.gz
tar -zxvf zlib-1.2.11.tar.gz
cd zlib-1.2.11
./configure
make && make install
yum install -y zlib zlib-devel
復制代碼
openssl 安裝
cd /user/local/scr
wget https://www.openssl.org/source/openssl-1.0.1t.tar.gz
tar -zxvf openssl-1.0.1t.tar.gz
復制代碼
nginx 安裝
cd /user/local/scr
wget http://nginx.org/download/nginx-1.1.10.tar.gz
tar zxvf nginx-1.1.10.tar.gz
cd nginx-1.1.10
./configure
make && make install
啟動nginx
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
復制代碼
完成之后可以先行查看自己的自己的服務器開放了哪些的端口:
firewall-cmd --list-all
復制代碼
若是沒有進行端口的開發可以使用如下命令進行端口的開放:
firewall-cmd --zone=public --add-port=80/tcp --permanent
# 其中80 可以進行修改為自己想要開放的端口,當然前提下是你要打開了防火墻。
復制代碼
防火墻設置
systemctl status firewalld.service # 查看防火墻狀態
systemctl stop firewalld.service # 關閉防火墻
systemctl start firewalld.service # 打開防火墻
復制代碼
nginx基礎命令
- 再完成以上的基礎準備之后,已經對nginx進行了啟動,查看當前的nginx情況:
ps -ef | grep nginx
復制代碼
- 對nginx進行啟動,停止與重啟。
cd /usr/local/sbin # 注意要進入到安裝的nginx對應的相關的目錄下才能夠執行相關聯的語句。
./nginx # 表示啟動nginx
./nginx -s stop # 表示對nginx 進行停止。
./nginx - s reload # 表示重啟,一般在配置文件進行修改之后使用。
復制代碼
在啟動完成之后就可以進行ip地址的訪問(因為對于nginx來說默認是啟動在80 端口,所以可直接進行ip地址的訪問)
配置文件講解:
首先是配置文件地址:/usr/local/nginx/conf/nginx.conf。
對于nginx配置文件來說分為三大塊:
全局快
從配置文件開始到 events 塊之間的內容,主要會設置一些影響 nginx 服務器整體運行的配置指令,主要包括配置運行 Nginx 服務器的用戶(組)、允許生成的 worker process 數,進程 PID 存放路徑、日志存放路徑和類型以及配置文件的引入等。
比如下面第一行配置的:
worker_processes 1;
復制代碼
這是 Nginx 服務器并發處理服務的關鍵配置,worker_processes 值越大,可以支持的并發處理量也越多,但是會受到硬件、軟件等設備的制約
events 塊
events {
worker_connections 1024;
}
復制代碼
events 塊涉及的指令主要影響 Nginx 服務器與用戶的網絡連接,常用的設置包括是否開啟對多 work process 下的網絡連接進行序列化,是否允許同時接收多個網絡連接,選取哪種事件驅動模型來處理連接請求,每個 word process 可以同時支持的最大連接數等。
上述例子就表示每個 work process 支持的最大連接數為 1024. 這部分的配置對 Nginx 的性能影響較大,在實際中應該靈活配置。
http 塊
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;
}
…………………………
復制代碼
這算是 Nginx 服務器配置中最頻繁的部分,代理、緩存和日志定義等絕大多數功能和第三方模塊的配置都在這里。
需要注意的是:http 塊也可以包括http 全局塊,server塊
http 全局塊
http 全局塊配置的指令包括文件引入、MIME-TYPE 定義、日志自定義、連接超時時間、單鏈接請求數上限等。
server 塊
這塊和虛擬主機有密切關系,虛擬主機從用戶角度看,和一臺獨立的硬件主機是完全一樣的,該技術的產生是為了節省互聯網服務器硬件成本。
每個 http 塊可以包括多個 server 塊,而每個 server 塊就相當于一個虛擬主機。
而每個 server 塊也分為全局 server 塊,以及可以同時包含多個 locaton 塊。
1, 全局server塊
最常見的配置是本虛擬機主機的監聽配置和本虛擬主機的名稱或 IP 配置。
2,location塊
一個 server 塊可以配置多個 location 塊。
這塊的主要作用是基于 Nginx 服務器接收到的請求字符串(例如 server_name/uri-string),對虛擬主機名稱(也可以是 IP 別名)之外的字符串(例如 前面的 /uri-string)進行匹配,對特定的請求進行處理。地址定向、數據緩存和應答控制等功能,還有許多第三方模塊的配置也在這里進行。
反向代理
何為反向代理:
在了解反向代理之前,先了解正向代理:
正向代理:如果把局域網外的 Internet 想象成一個巨大的資源庫,則局域網中的客戶端要訪問 Internet,則需要通過代理服務器來訪問,這種代理服務就稱為正向代理。簡而言之就是起到一個幫助到達目標網絡的作用。
反向代理:反向代理,其實客戶端對代理是無感知的,因為客戶端不需要任何配置就可以訪問,我們只需要將請求發送到反向代理服務器,由反向代理服務器去選擇目標服務器獲取數據后,再返回給客戶端,此時反向代理服務器和目標服務器對外就是一個服務器,暴露的是代理服務器地址,隱藏了真實服務器 IP 地址。
舉個例子:我們在本地環境上安裝一個Tomcat 服務器,對于tomact來說默認訪問是8080端口,但是我們不想輸入80端口就可以直接進行訪問,就需要我們直接訪問80 端口 表示訪問到nginx服務器,然后進行配置文件的配置,將請求轉發到我們的tomcat服務器上。
我們可以進行如下配置:
在http模塊中 進行如下配置:
server {
listen 80;
# server_name localhost;
server_name 121.*.*.34;# 表示監聽的服務的名稱是 如下地址
location / {
root html;
proxy_pass http://127.0.0.1:8080; # 表示進行轉發的地址,首先需要在本機安裝tomact 并啟動 自行官網下載即可
index index.html index.htm;
}
}
復制代碼
完成配置之后記得重啟服務:即可看到如下展示:表示從80端口跳轉到8080端口
實例二
在上面的案例中我們訪問的還是默認的80端口,若是我們想要更換端口去訪問呢,我們若是想要訪問其他的端口,或者說是訪問帶路徑的信息呢,該如何進行操作,這個時候就可以添加一個server,因為一個server監聽一個唯一的端口,這里我們可以再創建一個server 選中我們監聽的端口信息。在location中進行配置即可。
server {
listen 3308; # 我們監聽不同的端口信息
server_name localhost;
location ~ /edu/ {
# 在tomcat 下的webpage下創建對應的目錄,下添加一個index.html 頁面。
proxy_pass http://127.0.0.1:8080;
}
}
復制代碼
這個時候我們就可以訪問如下網址:可以發現如下的3308(自己測試時候要提前開啟端口)端口搭配上edu路徑和對應的index.html 就可以訪問到我們tomact 服務器下面的對應的頁面信息。
負載均衡
概念
負載均衡即是將負載分攤到不同的服務單元,既保證服務的可用性,又保證響應足夠快,給用戶很好的體驗。快速增長的訪問量和數據流量催生了各式各樣的負載均衡產品,很多專業的負載均衡硬件提供了很好的功能,但卻價格不菲,這使得負載均衡軟件大受歡迎, nginx 就是其中的一個,在 linux 下有 Nginx、LVS、Haproxy 等等服務可以提供負載均衡服務,而且 Nginx 提供了幾種分配方式(策略):
- 輪詢(默認) 每個請求按時間順序逐一分配到不同的后端服務器,如果后端服務器 down 掉,能自動剔除。
- weight weight 代表權,重默認為 1,權重越高被分配的客戶端越多 指定輪詢幾率,weight 和訪問比率成正比,用于后端服務器性能不均的情況。 例如: upstream server_pool { server 121.111.2.34 weight = 10; server 121.111.2.35 weight = 10; } 復制代碼
- ip_hash 每個請求按訪問 ip 的 hash 結果分配,這樣每個訪客固定訪問一個后端服務器,可以解決 session 的問題。 upstream server_pool{ ip_hash; server 121.111.2.34 weight = 10; server 121.111.2.35 weight = 10; } 復制代碼
- fair(第三方)
按后端服務器的響應時間來分配請求,響應時間短的優先分配。
upstream server_pool{
fair;
server 121.111.2.34 weight = 10;
server 121.111.2.35 weight = 10;
}
復制代碼
實例
在http中添加upstream關鍵字:
http{
……
upstream myserver{
# 擁有兩臺服務器
fair # 表示 按照相應的時間進行分配哪個服務來相應當前的請求 。
server 121.111.2.34:8080;
server 121.111.2.35:8080;
# 注意 這里是模擬兩臺服務器,對于沒有兩臺真實的服務器的,可以開兩個tomcat 服務 配置不同的端口
server 121.111.2.34:8080;
server 121.111.2.34:8081;
}
server{
listen 80;
server_name 121.111.2.34;
……
location /{
proxy_pass http://myserver
# myserver 和上面自己所起的upstream 相對應
……
}
}
復制代碼
這樣就可以在訪問到本機的80端口時候進行數據的轉發處理,選擇一個特定的主機進行服務的相應接收
高可用
簡介
關于這部分知識,之前在學習基于MySQL與redis集群上項目負載均衡時候有使用的到Docker 來搭建后端的nginx負載均衡,同時,這部分的具體完成的信息也在我的個人githubgithub項目地址賬戶上有所體現。
無論是nginx集群的創建,還是負載均衡的完成上,對于docker 來說都為我們提供了很大的便利,當時的docker配置上夾雜了一些其他的配置,可能把這部分分割出來還是需要點時間去理解,這里就單獨進行分析與學習。
實例
關于具體的邏輯信息,在我如上的基于Mysql與Redis集群上項目負載均衡,主要就是說:為了防止只有一個nginx導致問題的出現的問題,然后添加兩個nginx進行輪詢,但是這個輪詢的工作不需要我們自行完成,而是借助第三方的工具Keepalived,幫助我們完成系列的工作,見下圖:利用心跳檢測,來具體檢測出故障的機器,并且進行ip的虛擬化,只需要記錄一個ip信息,然后后面的操作
- 首先是有兩臺服務器,然后在其上都進行keepalived的安裝 yum install keepalived -y # 安裝 rpm -q -a keepalived # 查看安裝的情況 cd /etc/keepalived vi keepalived.conf 復制代碼
- 然后修改兩臺keepalived中的文件的配置信息:
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 121.111.2.34
smtp_connect_timeout 30
router_id LVS_DEVEL #唯一
}
vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh"
interval 2 #(檢測腳本執行的間隔)2 s執行一次
weight 2 # 腳本成立 權重增加2。
}
vrrp_instance VI_1 {
state BACKUP # 備份服務器上將 MASTER(主) 改為 BACKUP
interface ens33 # 網卡
virtual_router_id 51 # 主、備機的 virtual_router_id 必須相同
priority 100 # 主、備機取不同的優先級,主機值較大,備份機值較小
advert_int 1 # 進行心跳檢測 每隔一秒 發送檢測信息 查看是否存活
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
121.111.2.20 # 虛擬地址
}
}
復制代碼
- 腳本文件的編寫,不同于使用docker 的方式,如下是使用到dcoker 的解決方案,配置文件的不同。
如下我們編寫具體的信息查看nginx是否存活。存放的目錄是/usr/local/src/。
#!/bin/bash
A = `ps -C nginx –no-header |wc -l`
if [$A - eq 0]; then
/ usr / local / nginx / sbin / nginx
# 查看nginx 是否還存活
sleep 2
if [`ps -C nginx --no-header |wc -l` - eq 0]; then killall keepalived
fi
fi
復制代碼
- 完成之后對nginx和keepalived 進行啟動即可keepalived 啟動命令:systemctl start keepalived
這個時候我們訪問虛擬地址:121.111.2.20,然后兩個keepalived會搶占這個虛擬ip,同時將服務請求發送到不同對應的nginx服務器上,這樣就保證了在一個服務器出現故障時候,另外一個還能夠正常的工作。
鏈接:https://juejin.im/post/6858430406736216072