本章作為實戰篇,將從實際的命令行出發,通過安裝,啟動,配置Nginx來逐漸認識和使用Nginx,并能夠自己實現一些簡單的反向代理,負載均衡的配置。
不廢話,直接上干貨。
01 Nginx安裝
Nginx的安裝還是比較容易的,有離線安裝,在線安裝多種安裝方式,這里我只說最簡單的一種,打開我們的命令行終端,直接輸入yum命令進行安裝
yum install -y nginx
當終端顯示出Complete!字樣時,則代表我們的Nginx已經安裝成功了。
查看Nginx版本:
nginx -v #在這里我安裝的是1.16.1版本的nginx
02 Nginx基本操作
和我們之前的Docker一樣,nginx也有一些包括服務的啟動,停止,重載等基本操作。
2.1 啟動nginx
##在centos7+ 啟動nginx服務 systemctl start nginx.service #centos6+ 上啟動nginx服務 service nginx start #或,簡單粗暴一句 nginx
2.2 停止nginx
##在centos7+ 停止nginx服務 systemctl stop nginx.service #centos6+ 上停止nginx服務 service nginx stop #粗魯的停止,下班了,不干了,就算請求來了我也不接了。 nginx -s stop ##優雅的停止,Nginx在退出前完成已經接受的連接請求。 nginx -s quit
2.3 重啟nginx
當我們修改了nginx的某些配置,為了使配置生效,我們往往需要重啟nginx,同樣的,linux下依然有兩種方式來重啟我們的nginx服務:
##在centos7+ 重啟nginx服務 systemctl restart nginx.service #centos6+ 上重啟nginx服務 service nginx restart #使用nginx命令停止,推薦這個 nginx -s reload
而具體使用nginx原生的nginx -s 操作還是linux提供的systemctl ,這個主要看個人喜好,實際兩者的功能是差不多的,并沒有什么明顯的不同。
2.4 其他命令
查看配置文件是否ok:
#如果配置文件有問題的話會顯示failed,如果沒得問題的話,會顯示successful nginx -t
2.5 顯示幫助信息
nginx -h #或者 nginx -?
03 Nginx配置
nginx本身作為一個完成度非常高的負載均衡框架,和很多成熟的開源框架一樣,大多數功能都可以通過修改配置文件來完成,使用者只需要簡單修改一下nginx配置文件,便可以非常輕松的實現比如反向代理,負載均衡這些常用的功能,同樣的,和其他開源框架比如Tomcat一樣,nginx配置文件也遵循著相應的格式規范,并不能一頓亂配,在講解如何使用nginx實現反向代理,負載均衡等這些功能的配置前,我們需要先了解一下nginx配置文件的結構。
既然要了解nginx的配置文件,那我總得知道nginx配置文件在哪啊,nginx配置文件默認都放在nginx安裝路徑下的conf目錄,而主配置文件nginx.conf自然也在這里面,我們下面的操作幾乎都是對nginx.conf這個配置文件進行修改。
可是,我怎么知道我nginx裝哪了?我要是不知道nginx裝哪了咋辦?
這個,細心的朋友們可能會發現,運行nginx -t命令,下面除了給出nginx配置文件是否OK外,同時也包括了配置文件的路徑。諾,就是這個
[root@izuf61d3ovm5vx1kknakwrz ~]# nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
使用vim打開該配置文件,我們一探究竟,不同版本的配置文件可能稍有不同,我的配置文件內容如下:
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
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;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type Application/octet-stream;
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /usr/share/nginx/html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
}
? ? ?這一堆都是啥玩意er,完全沒有頭緒啊
沒關系,下面我們就來詳細分析一下nginx.conf這個文件中的內容。
按照功能劃分,我們通常將nginx配置文件分為三大塊,全局塊,events塊,http塊。
3.1 第一部分:全局塊
首先映入眼簾的這一堆:
user nginx; worker_processes auto; error_log /var/log/nginx/error.log; pid /run/nginx.pid; # Load dynamic modules. See /usr/share/doc/nginx/README.dynamic. include /usr/share/nginx/modules/*.conf;
我們稱之為全局塊,知識點吶朋友們,要記住,這里呢,主要會設置一些影響 nginx 服務器整體運行的配置指令,主要包括配 置運行 Nginx 服務器的用戶(組)、允許生成的 worker process 數,進程 PID 存放路徑、日志存放路徑和類型以及配置文件的引入等。
比如 worker_processes auto; 這一行,worker_processes 值越大,我們nginx可支持的并發數量就越多,很多人想這不就爽了嗎,我設置成正無窮,無限并發flag達成,秒殺問題輕松解決,這個,受自己服務器硬件限制的,不能亂來。
3.2 第二部分:events 塊
events {
worker_connections 1024;
}
這一堆,就是我們配置文件的第二部分,events 塊
起名字這么隨意的么,那第三部分是不是叫http塊?
wc,這你都知道,是的
events 塊涉及的指令主要影響 Nginx 服務器與用戶的網絡連接,常用的設置包括是否開啟對多 work process 下的網絡連接進行序列化,是否允許同時接收多個網絡連接,選取哪種事件驅動模型來處理連接請求,每個 word process 可以同時支持的最大連接數等。
3.3 第三部分:http塊
內容太多,略
http {
server {
}
}
注意:
http是一個大塊,里面也可以包括很多小塊,比如http全局塊,server塊等。
http 全局塊配置的指令包括文件引入、MIME-TYPE 定義、日志自定義、連接超時時間、單鏈接請求數上限等。
而http塊中的server塊則相當于一個虛擬主機,一個http塊可以擁有多個server塊。
server塊又包括全局server塊,和location塊。
全局server塊主要包括了本虛擬機主機的監聽配置和本虛擬主機的名稱或 IP 配置
location塊則用來對虛擬主機名稱之外的字符串進行匹配,對特定的請求進行處理。地址定向、數據緩 存和應答控制等功能,還有許多第三方模塊的配置也在這里進行。比如,對/usr相關的請求交給8080來處理,/admin則較給8081處理。
說了這么多,我還是不是特別理解咋辦,問題不大,接下來我們通過幾個實例來幫助大家更好的理解這些配置在實際中所發揮的作用。
04 Nginx配置實戰
接下來我們將通過對nginx配置文件的修改來完成反向代理,負載均衡,動靜分離的簡單配置。
4.1 nginx配置反向代理
我發現很多教程說nginx配置反向代理的時候上來就改host文件,這里的話,因為上一篇文章我們有總結過反向代理的精髓,也就是:
反向代理服務器和目標服務器對外就是一個服務器,暴露的是代理服務器地址,隱藏了真實服務器 IP 地址。
所以接下來我們通過一個小栗子,當我們訪問服務器的時候,由于我的服務器沒備案,阿里云默認80端口沒開,所以這里我們設置對外服務的端口為8888,當我們訪問8888端口的時候,實際上是跳轉到8080端口的。
首先我們用docker啟動一個tomcat容器,然后配置端口映射為8080。
等等,不會docker怎么辦?不會docker的話,可以看韓數最新的docker初級入門教程(滑稽)
如果對docker不是很了解的話,可以使用傳統的linux下運行tomcat,道理是一樣的。
然后修改我們的配置文件nginx.conf里面的server塊,修改之后的內容如下:
server {
listen 8888 ; ##設置我們nginx監聽端口為8888
server_name [服務器的ip地址];
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
proxy_pass http://127.0.0.1:8080; ##需要代理的服務器地址
index index.html;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
然后在瀏覽器中輸入:服務器ip:8888 發現瀏覽器顯示出來了8080端口tomcat的歡迎界面,從而實現了隱藏真實服務器地址這樣一個反向代理的要求。
哦?看著好神奇哦,那,我之前經常有看到那種,就是各種/image /video 不同的鏈接對應的是不同的網站,那也是這么做的咯?
聰明,這里我們再新建一個tomcat容器,端口為8081,同時把在容器中tomcat webapps目錄新建一個我們自己的目錄,這里叫hello,里面新建一個hello.html文件,內容為
<h1>I am Hello<h1>
同時我們在端口為8080的tomcat容器中,在webapps新建我們的文件家hi,并新建hi.html文件,內容為
<h1>I am Hi<h1>
啊,這樣的話配置是不是很難啊?
你想多了,敲簡單的。
修改我們配置文件中的server快,如下:
server {
listen 8888 ; ##設置我們nginx監聽端口為8888
server_name [服務器的ip地址];
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location /hi/ {
proxy_pass http://127.0.0.1:8080; ##需要代理的服務器地址
index index.html;
}
location /hello/ {
proxy_pass http://127.0.0.1:8081; ##需要代理的服務器地址
index index.html;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
在瀏覽器中輸入:服務器ip:8888/hi/hi.html
瀏覽器顯示 I am hi 對應服務器端口為 8080
在瀏覽器中輸入:服務器ip:8888/hello/hello.html
瀏覽器顯示 I am hello 對應服務器端口為 8081
從而實現了針對不同url請求分發給不同服務器的功能配置。
少俠,且慢,你是不是忘了什么東西,location /hello/ 是什么意思,只能這么寫么?
當然不是。學會location指令匹配路徑,隨便換姿勢
location指令說明:
功能:用于匹配URL
語法如下:
1、= :用于不含正則表達式的 uri 前,要求請求字符串與 uri 嚴格匹配,如果匹配 成功,就停止繼續向下搜索并立即處理該請求。 2、~:用于表示 uri 包含正則表達式,并且區分大小寫。 3、~*:用于表示 uri 包含正則表達式,并且不區分大小寫。 4、^~:用于不含正則表達式的 uri 前,要求 Nginx 服務器找到標識 uri 和請求字 符串匹配度最高的 location 后,立即使用此 location 處理請求,而不再使用 location 塊中的正則 uri 和請求字符串做匹配。
注意:如果 uri 包含正則表達式,則必須要有 ~ 或者 ~* 標識。
到這里,關于nginx如何簡單的配置一個反向代理服務器就大功告成了,下面我們來說一下怎么實現負載均衡的簡單配置。
4.2 nginx配置負載均衡
在nginx中配置負載均衡也是十分容易的,同時還支持了多種負載均衡策略供我們靈活選擇。首先依舊是準備兩個tomcat服務器,一個端口為8080,一個端口為8081,這里呢,推薦大家用docker部署,太方便了,什么,不會docker,可以移步我的面向后端的docker初級入門教程,真的挺好用,省了很多工作量。
然后修改我們的http塊如下:
http {
###此處省略一大堆沒有改的配置
##自定義我們的服務列表
upstream myserver{
server 127.0.0.1:8080;
server 127.0.0.1:8090;
}
server {
listen 8888 ; ##設置我們nginx監聽端口為8888
server_name [服務器的ip地址];
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
proxy_pass http://myserver; ##叮,核心配置在這里
proxy_connect_timeout 10; #超時時間,單位秒
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
}
這就完了?當然還沒有,之前就有說過,nginx提供了三種不同的負載均衡策略供我們靈活選擇,分別是:
- 輪詢(默認方式): 每個請求按時間順序逐一分配到不同的后端服務器,如果后端服務器 down 掉,能自動剔除。
- 用法:啥也不加,上文實例就是默認的方式,就是默認的
- 權重(weight): weight 代表權重,默認為 1,權重越高被分配的客戶端越多,權重越大,能力越大,責任越大,處理的請求就越多。
- 用法:
upstream myserver{
server 127.0.0.1:8080 weight =1;
server 127.0.0.1:8090 weight =2;
}
- ip_hash:每個請求按訪問 ip 的 hash 結果分配,這樣每個訪客固定訪問一個后端服務器,可以解決 session 的問題。
- 用法:
upstream myserver{
ip_hash;#可與weight配合使用
server 127.0.0.1:8080 weight =1;
server 127.0.0.1:8090 weight =2;
}
4.3 nginx配置動靜分離
接下來說最后一個實例,動靜分離的簡單配置。
等等,我記得明明是四個,明明還有一個正向代理呢?
這個,愛國守法,人人有責,有需要訪問某些國內不能訪問的網站需求的同學,可以自行下去查閱資料。
至于怎么配置正向代理,咱也不知道,咱也不敢說,咱也不敢問。
基礎篇回顧:
動靜分離就是把很少會發生修改的諸如圖像,視頻,css樣式等靜態資源文件放置在單獨的服務器上,而動態請求則由另外一臺服務器上進行,這樣一來,負責動態請求的服務器則可以專注在動態請求的處理上,從而提高了我們程序的運行效率,與此同時,我們也可以針對我們的靜態資源服務器做專屬的優化,增加我們靜態請求的響應速度。
具體的動靜分離配置也不是十分的復雜,和負載均衡,反向代理差不多。
為了演示動靜分離呢,首先我們需要準備兩個文件夾,一個是data文件夾,用來存放我們js,css這些靜態資源文件,一個是html文件夾,用來存放我們的html文件。
在html文件夾新建一個html文件,index.html,內容如下
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>我是一個靜態界面</title> </head> <script type="text/JAVAscript" src="jquery.js"></script> <body> <h1>我是一個靜態界面</h1> <div id="test_div"></div> </body </html>
注意,這里我們并沒有將jquery.js 這個文件放在html目錄下,而是將它放在了另外一個目錄data里面,當服務器接需要請求jquery.js這個文件時,并不會去index.html所在的那個服務器去請求這個文件,而是會直接去我們配置好的服務器或者路徑去尋找這個js文件,在本實例中,會去data文件夾下面去找這個jquery.js這個文件。
修改server的配置如下:
server {
listen 8886 ;
server_name [你的服務器ip地址];
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
root /html/;
index index.html;
}
#攔截靜態資源,static里面存放的我們圖片什么的靜態資源
location ~ .*.(gif|jpg|jpeg|bmp|png|ico|js|css)$ {
root /data/;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
測試:
在瀏覽器中輸入ip地址:8888/index.html,屏幕上顯示我是一個靜態界面,同時打開瀏覽器自帶的開發者工具
會發現jquery.js已經被正常請求到了。
05 下面開始技術總結:
寫到這里實戰篇結束了嗎?并沒有,盡管上面給出了負載均衡,反向代理,動靜分離的實例,但仍然只是最基礎的配置,比如多層負載均衡,緩存等高級配置,都需要我們在日后的開發生活逐漸的去接觸和了解。下一篇呢,我們將深入nginx腹地,去稍微稍微簡單不細致大致看一眼那種去了解一下nginx內部是如何保持如此高效率的工作的。
原文鏈接:
https://juejin.im/post/5db8f8c3f265da4d3e173c62






