文章目錄
- 一、Nginx簡述
- 1. 什么是Nginx
- 2. 為什么選擇Nginx
- 2.1 高性能、高并發
- 2.2 高擴展性
- 2.3 高可靠性
- 2.4 熱部署
- 2.5 應用廣泛
- 2.6 網路模型
- 3. 正向代理與反向代理
- 4. Nginx組成部分
- 二、Nginx應用場景
- 2.1 普通代理
- 2.2 負載均衡場景
- 2.3 代理快取場景
- 2.4 靜態資源場景
- 2.5 安全應用場景
- 三、Nginx安裝部署
- 3.1 安裝Nginx方式
- 3.2 安裝Nginx依賴
- 3.3 安裝Nginx服務
- 3.4 訪問Nginx服務
- 3.5 檢查Nginx版本和編譯引數
- 四、Nginx目錄結構
- 4.1 主組態檔
- 4.2 Nginx代理組態檔
- 4.3 Nginx編碼組態檔
- 4.4 Nginx管理命令檔案
- 4.5 Nginx日志相關檔案
- 五、Nginx基本配置
- 5.1 總覽
- 5.2 Global全域模塊
- 5.3 Events事件模塊
- 5.4 HTTP核心模塊
- 5.5 總結
- 六、Nginx搭建小游戲網站
- 6.1 增加配置
- 6.2 修改本地hosts檔案
- 6.3 上傳游戲代碼
- 6.4 檢查配置語法
- 6.5 多載服務生效
- 七、Nginx虛擬主機
- 7.1 什么是虛擬主機
- 7.2 Nginx配置虛擬主機方式
- 7.3 基于主機多IP方式
- 7.4 基于多埠虛擬主機方式
- 7.5 基于多域名虛擬主機方式
一、Nginx簡述
1. 什么是Nginx
Nginx是一個開源且高性能、可靠的Http Web服務、反向代理服務器
- 開源,體現在直接獲取Nginx的源代碼(F5公司收購)
- 高性能,體現在支持海量的并發
- 高可靠,體現在服務穩定
2. 為什么選擇Nginx
2.1 高性能、高并發
通常正常情況下,客戶端單次請求會得到更快的回應,另一方面在高峰期(如有數以萬計的并發請求),Nginx可以比其他Web服務器更快地回應請求,
2.2 高擴展性
Nginx官方、第三方,提供了非常多優秀的模塊提供使用,這些模塊都可以實作快速增加和減少,
2.3 高可靠性
所謂高可靠性,是指Nginx可以在服務器上持續不間斷的運行,而很多web服務器往往運行幾周或幾個月就需要進行一次重啟,如windows的 IIS,對于nginx這樣的一個高并發、高性能的反向代理服務器而言,他往往運行網站架構的最前端,那么此時如果我們企業如果想提供9999、99999,對于nginx持續運行能夠宕機的時間,一年可能只能以秒來計算,所以在這樣的一個角色中,nginx的高可靠性為我們提供了非常好的保證,
2.4 熱部署
熱部署是指在不停服務的情況下升級nginx,這個功能非常的重要,
對于普通的服務,只需要kill掉行程再啟動即可,但對于Nginx而言,如果Nginx有很多的客戶端連接,那么kill掉Nginx,Nginx會像客戶端發送tcp reset復位包,但很多客戶端無法很好的理解reset包,就會造成例外,由于Nginx的master管理行程與worker作業行程的分離設計,使得Nginx能夠在7×24小時不間斷服務的前提下,升級Nginx的可執行檔案,當然,也支持不停止服務更新配置、更換日志檔案等功能,
2.5 應用廣泛
首先Nginx技術成熟,具備企業最常使用的功能,如代理、代理快取、負載均衡、靜態資源、動靜分離、Https、lnmp、lnmt等等;其次企業使用Nginx統一技術堆疊,可以降低維護成本,同時降低技術更新成本,
另外,tengine\OpenResty 都是基于Nginx進行的二次開發的,
2.6 網路模型
Nginx使用Epool網路模型,而Apache采用的是Select網路模型,
- Select:當用戶發起一次請求,select模型就會進行一次遍歷掃描,從而導致性能低下,
- Epoll:當用戶發起請求,epoll模型會直接進行處理,效率高效,
3. 正向代理與反向代理
- 正向代理,平時我們使用的加速器、翻墻等代理就是正向代理,客戶機請求代理服務器,代理服務器轉發請求到對應的目標服務器
- 反向代理,部署在Web服務器上,代理所有外部網路對內部網路的訪問,瀏覽器訪問服務器,必須經過這個代理,是被動的,
- 正向代理的主動方是客戶端,反向代理的主動方是Web服務器
反向代理的作用:
- 安全,客戶端對Web服務器的訪問需要先經過反向代理服務器,這樣可以防止外部程式對Web服務器的直接攻擊,
- 負載均衡,反向代理服務器可以根據Web服務器的負載情況,動態地把HTTP請求交給不同的Web服務器來處理,前提是要有多個Web服務器,
- 提升Web服務器的IO性能,一個HTTP請求的資料,從客戶端傳輸給服務器,是需要時間的,例如N秒,如果直接傳給Web服務器,Web服務器就需要讓一個行程阻塞N秒,來接收IO,這樣會降低Web服務器的性能,如果使用反向代理服務器,先讓反向代理服務器接收完整個HTTP請求,再把請求發給Web服務器,就能提升Web服務器的性能,還有一些靜態檔案的請求,可以直接交給反向代理來處理,不需要經過Web服務器,
4. Nginx組成部分
在這里我們將Nginx的組成架構比喻為一輛汽車:這個汽車提供了基本的駕駛功能,但是還需要一個駕駛員控制這輛汽車開往哪個方向,同時該汽車行駛過的地方還會形成GPS軌跡,如果汽車在行駛的程序中出現了任何問題,我們需要一個黑匣子,分析是汽車本身的問題,還是駕駛人員的操作出現了問題,

- 第一個組成部分Nginx二進制可執行檔案:它是Nginx本身框架以及相關模塊等構建的一個二進制檔案,這個檔案就相當于汽車本身,所有的功能都由它提供,
- 第二個組成部分Nginx.conf檔案:它相當于駕駛人員,雖然二進制可執行檔案已經提供了許多的功能,但是這些功能究竟有沒有開啟,或者開啟后定義怎樣的行為去處理請求,都是由nginx.conf這個檔案決定的,所以他就相當于這個汽車的駕駛員,控制這個汽車的行為,
- 第三個組成部分access.log:它相當于這輛汽車經過所有地方形成的GPS軌跡,access.log會記錄Nginx處理過的每一條HTTP的請求資訊、回應資訊,
- 第四個組成部分error.log:它相當于黑匣子,當出現了一些不可預期的問題時,可以通過error.log將問題定位出來,
小結:
Nginx的組成部分是相輔相成,Nginx二進制檔案和Nginx.conf檔案,它定義了Nginx處理請求的方式,
而如果我們想對nginx服務做一些web的運營和運維,需要對access.log做進一步分析,
而如果出現了任何未知的錯誤,或者預期的行為不一致時,應該通過error.log去定位根本性的問題,
二、Nginx應用場景
Nginx的主要使用場景,分為是代理資源服務、負載均衡服務、代理快取服務、靜態資源服務、安全服務,場景詳細介紹如下:
如下圖是一個網站的基本架構,首先用戶請求先到達nginx,然后在到 tomcat或php這樣的應用服務器,然后應用服務器在去訪問 redis、mysql這樣的資料庫,提供基本的資料功能,
2.1 普通代理

2.2 負載均衡場景
代碼的運行效率比較低,或者并行受限,所以我們需要很多應用服務組成一個集群,為更多用戶提供訪問,而應用服務一但構成集群,則需要我們的nginx具有反向代理功能,這樣可以將動態請求傳倒給集群服務,但很多應用構成集群,那么一定會帶來兩個需求,
- 應用服務器需要動態擴展,(手動擴展|自動擴展)
- 有些服務出問題需要做容災,那么我們的反向代理必須具備負載均衡功能,

2.3 代理快取場景
其次,隨著我們網路鏈路的增長,用戶體驗到的時延則會增加,如果我們能把一段時間內不會發生變化的"動態"內容,快取在Nginx,由Nginx直接向用戶提供訪問,那么這樣用戶請求的時延就會減少很多,所以在這里反向代理會演生出另外一個功能 “快取”,因為它能加速我們的訪問,

2.4 靜態資源場景
在很多時候我們訪問docs、pdf、mp4、png等這樣的靜態資源時,是沒有必要將這些請求通過Nginx交給后端的應用服務,我們只需要通過Nginx直接處理“靜態資源”即可,這是Nginx的靜態資源功能,

2.5 安全應用場景
當我們使用http網站時,可能會遭遇到篡改,如果使用https安全通訊協議,那么資料在傳輸程序中是加密的,從而能有效的避免黑客竊取或者篡改資料資訊,同時也能避免網站在傳輸程序中的資訊泄露,大大的提升我們網站安全,

三、Nginx安裝部署
3.1 安裝Nginx方式
安裝Nginx軟體的方式有很多種,分為如下幾種
- 原始碼編譯=>Nginx (1.版本隨意 2.安裝復雜 3.升級繁瑣)
- epel倉庫=>Nginx (1.版本較低 2.安裝簡單 3.配置不易讀)
- 官方倉庫=>Nginx (1.版本較新 2.安裝簡單 3.配置易讀,強烈推薦)
nginx官網,點右側download

官方指導如下:
Install the prerequisites:
sudo yum install yum-utils
To set up the yum repository, create the file named /etc/yum.repos.d/nginx.repo with the following contents:
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
這里我們選擇nginx-stable版本
如果自己配置的nginx.repo倉庫不生效,還是從epel倉庫中安裝,可以把我們的倉庫優先級設定高一點,
安裝yum優先級插件
yum install yum-priorities
在想優先檢測的repo檔案中加入
priority=1
#數字越小,優先級越高
[root@web01 ~]# vim /etc/yum/pluginconf.d/priorities.conf
確定這個組態檔里的 enabled = 1
yum clean all
yum makecache
就可以優先從我們指定的源里安裝了
3.2 安裝Nginx依賴
[root@web01 ~]# yum install -y gcc gcc-c++ autoconf pcre pcre-devel make automake httpd-tools
3.3 安裝Nginx服務
[root@web01 ~]# yum install nginx -y
[root@web01 ~]# systemctl enable nginx
[root@web01 ~]# systemctl start nginx
3.4 訪問Nginx服務

3.5 檢查Nginx版本和編譯引數
[root@web01 ~]# nginx -V
四、Nginx目錄結構
[root@web01 ~]# rpm -ql nginx
/etc/logrotate.d/nginx
/etc/nginx
/etc/nginx/conf.d
/etc/nginx/conf.d/default.conf
/etc/nginx/fastcgi_params
/etc/nginx/mime.types
/etc/nginx/modules
/etc/nginx/nginx.conf
/etc/nginx/scgi_params
/etc/nginx/uwsgi_params
/usr/lib/systemd/system/nginx-debug.service
/usr/lib/systemd/system/nginx.service
/usr/lib64/nginx
/usr/lib64/nginx/modules
/usr/libexec/initscripts/legacy-actions/nginx
/usr/libexec/initscripts/legacy-actions/nginx/check-reload
/usr/libexec/initscripts/legacy-actions/nginx/upgrade
/usr/sbin/nginx
/usr/sbin/nginx-debug
/usr/share/doc/nginx-1.20.1
/usr/share/doc/nginx-1.20.1/COPYRIGHT
/usr/share/man/man8/nginx.8.gz
/usr/share/nginx
/usr/share/nginx/html
/usr/share/nginx/html/50x.html
/usr/share/nginx/html/index.html
/var/cache/nginx
/var/log/nginx
4.1 主組態檔
/etc/nginx/nginx.conf # 主組態檔
/etc/nginx/conf.d/default.conf # 默認網站組態檔
4.2 Nginx代理組態檔
/etc/nginx/fastcgi_params # Fastcgi代理組態檔
/etc/nginx/scgi_params # scgi代理組態檔
/etc/nginx/uwsgi_params # uwsgi代理組態檔
4.3 Nginx編碼組態檔
/etc/nginx/mime.types # Content-Type與擴展名
/etc/nginx/win-utf # Nginx編碼轉換映射檔案
/etc/nginx/koi-utf
/etc/nginx/koi-win
4.4 Nginx管理命令檔案
/usr/sbin/nginx # Nginx命令列管理終端工具
/usr/sbin/nginxdebug # Nginx命令列與終端除錯工具
4.5 Nginx日志相關檔案
/var/log/nginx # Nginx默認存放日志目錄
access.log error.log
/etc/logrotate.d/nginx # Nginx默認的日志切割
五、Nginx基本配置
- Nginx主組態檔/etc/nginx/nginx.conf是一個純文本型別的檔案
- Nginx整個組態檔是以區塊的形式組織的,一般每個區塊以一對大括號{}來表示開始與結束
5.1 總覽
[root@web01 ~]# cat /etc/nginx/nginx.conf
user nginx; # ngix的運行身份,默認以nginx用戶運行,nginx用戶在安裝nginx程式時自動創建
worker_processes auto; # 啟動work的行程數量,建議不能超過cpu總執行緒數量
error_log /var/log/nginx/error.log notice; # 錯誤日志路徑,默認級別notice表示不設定
pid /var/run/nginx.pid; # 存盤行程的pid Number
events {
worker_connections 1024; # 一個worker最大連接數
use epoll; # 默認是采用epoll網路IO模型;
# worker_connections * worker_processes = 最大鏈接數
}
# 主要負責接受與回應http請求
http {
include /etc/nginx/mime.types; # 支持的型別;
default_type application/octet-stream;
# 默認型別(下載的方式)
# 1.提供下載包 zip
# 2.后端并沒有將代碼決議成功,所以直接成了下載;
# 定義日志的格式
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 /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65; #長連接超時時間;
#gzip on;
# 包含的子檔案;
include /etc/nginx/conf.d/*.conf;
}
為了便于維護管理,建議將配置都寫在子檔案/etc/nginx/conf.d/中
[root@web01 conf.d]# cat /etc/nginx/conf.d/bertwu.conf
server {
listen 80; # 監聽的埠
server_name www.bertwu.com; # 指定站點的域名
#uri路由匹配
location / {
root /usr/share/nginx/html; # 根目錄
index index.html index.htm; # 默認的回傳頁面
#完整路徑為 root+index = /usr/share/nginx/html/index.html;
}
}
5.2 Global全域模塊
user www; #啟動Nginx行程所使用的用戶
worker_processes 1; #Nginx運行的work行程數量(建議與CPU數量一致或auto)
error_log /log/nginx/error.log #Nginx錯誤日志存放路徑
pid /var/run/nginx.pid #Nginx服務運行后產生的pid行程號
5.3 Events事件模塊
events {
worker_connections 1024; # 一個worker最大連接數
use epoll; # 默認是采用epoll網路IO模型;
# worker_connections * worker_processes = 最大鏈接數
}
5.4 HTTP核心模塊
http {
include /etc/nginx/mime.types; # 支持的型別;
default_type application/octet-stream;
# 默認型別(下載的方式)
# 1.提供下載包 zip
# 2.后端并沒有將代碼決議成功,所以直接成了下載;
# 定義日志的格式
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 /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65; #長連接超時時間;
#gzip on;
#使用Server配置網站, 每個Server{}代表一個網站(簡稱虛擬主機)
'server' {
listen 80; # 監聽的埠
server_name www.bertwu.com; # 指定站點的域名
access_log access.log # 該網站的訪問日志
#uri路由匹配,控制網站訪問的路徑
'location' / {
root /usr/share/nginx/html; # 根目錄,存放網站源代碼的位置
index index.html index.htm; # 默認的回傳頁面
#完整路徑為 root+index = /usr/share/nginx/html/index.html;
}
}
....
# 第二個虛擬主機配置
'server' {
...
}
# 包含的子檔案;
# include作用是:簡化主組態檔寫太多造成臃腫,這樣會讓整體的組態檔更加的清晰,
# 建議將每個虛擬主機獨立寫在這個目錄下
include /etc/nginx/conf.d/*.conf;
} # http層結束
5.5 總結
Nginx中的 http、server、location 之間的關系
- http標簽主要用來解決用戶的請求與回應
- server標簽主要用來回應具體的某一個網站
- location標簽主要用于匹配網站具體URI路徑
- http{}下允許有多個Server{},一個 Server{} 下又允許有多個location{}
六、Nginx搭建小游戲網站
6.1 增加配置
[root@web01 conf.d]# cat /etc/nginx/conf.d/bertwu.conf
server {
listen 80;
server_name www.bertwu.com;
location / {
root /code;
index index.html index.htm;
}
}
6.2 修改本地hosts檔案
C:\Windows\System32\drivers\etc 添加一行
10.0.0.1 www.bertwu.com # ip為nginx服務器所在的主機ip
6.3 上傳游戲代碼
[root@web01 ~]# mkdir /code && cd /code
[root@web01 ~]# wget http://cdn.xuliangwei.com/html5.zip
[root@web01 code]# unzip html5.zip
[root@web01 code]# ls
ceshi game html5.zip img index.html __MACOSX readme.txt
6.4 檢查配置語法
[root@web01 code]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
6.5 多載服務生效
[root@web01 code]# systemctl reload nginx
七、Nginx虛擬主機
7.1 什么是虛擬主機
在一臺服務器上運行多套站點,
通常在企業中可能會有很多業務系統,那么多套業務服務如何使用Nginx配置?

如果使用如上方式部署,則需要多臺服務器配置Nginx,但如果使用虛擬主機方式,則在同一個Nginx上運行多套單獨服務,這些服務是相互獨立的,

7.2 Nginx配置虛擬主機方式
Nginx配置虛擬主機有如下三種方式
- 基于主機多IP方式
- 基于埠的配置方式
- 基于多個hosts名稱方式(多域名方式)
7.3 基于主機多IP方式
[root@web01 conf.d]# cat bertwu.conf
server {
listen 10.0.0.7:80;
location / {
root /server/eth0;
index index.html index.htm;
}
}
server {
listen 172.16.1.7:80;
location / {
root /server/eth1;
index index.html index.htm;
}
}
# 注:
#/server/eth0/index.html
#/server/eth1/index.html 需要自己手動創建
7.4 基于多埠虛擬主機方式
[root@web01 conf.d]# cat bertwu.conf
server {
listen 80;
server_name www.bertwu.com;
location / {
root /server/eth0;
index index.html index.htm;
}
}
server {
listen 81;
server_name www.bertwu.com;
location / {
root /server/eth1;
index index.html index.htm;
}
}
7.5 基于多域名虛擬主機方式
[root@web01 conf.d]# cat bertwu.conf
server {
listen 80;
server_name www.bertwu1.com;
location / {
root /server/eth0;
index index.html index.htm;
}
}
server {
listen 80;
server_name www.bertwu2.com;
location / {
root /server/eth1;
index index.html index.htm;
}
}
修改hosts檔案,加入即可
10.0.0.7 www.bertwu1.com
10.0.0.7 www.bertwu2.com5
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/293564.html
標籤:其他
下一篇:python Django 之 異步channels實作Websocket搭建 + redis + 點對點聊天思路詳解 (8)
