Nginx的安裝和使用
Nginx主要功能:反向代理悯森、負(fù)載均衡卧秘、動靜分離
使用docker-compose安裝
cd /opt/docker_compose
mkdir docker_nginx
cd docker_nginx
touch docker-compose.yml
編寫docker-compose.yml后保存
version: '3.1'
services:
nginx:
restart: always
image: daocloud.io/library/nginx:latest
container_name: nginx
ports:
- 80:80
執(zhí)行
docker-compose up -d
啟動容器
此時瀏覽器正常訪問
Nginx的配置文件
關(guān)于Nginx的核心配置文件nginx.conf
,所在容器內(nèi)部的位置是/etc/nginx/
user nginx; # Nginx用戶
worker_processes 1; # 工作進(jìn)程姆蘸,數(shù)目墩莫。根據(jù)硬件調(diào)整,通常等于CPU數(shù)量或者2倍于CPU
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid; # pid(進(jìn)程標(biāo)識符):存放路徑逞敷。
# 以上稱為全局塊狂秦。
# worker_processes他的數(shù)值越大,Nginx的并發(fā)能力就越強
# error_log 代表Nginx的錯誤日志存放的位置
events {
worker_connections 1024; # 每個工作進(jìn)程的最大連接數(shù)量推捐。根據(jù)硬件調(diào)整裂问,和前面工作進(jìn)程配合起來用,盡量大玖姑,但是別把cpu跑到100%就行
}
# events塊
# worker_connections他的數(shù)值越大愕秫,Nginx并發(fā)能力越強
http { # http塊
include /etc/nginx/mime.types;
default_type application/octet-stream;
#include代表引入一個外部的文件 -> mime.types中放著大量的媒體類型
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; # keepalive超時時間 單位是秒
#gzip on;
include /etc/nginx/conf.d/*.conf; # -> 引入了conf.d目錄下的以.conf為結(jié)尾的配置文件
# 相當(dāng)于引入外部的配置文件,咱們主要關(guān)注這個文件 include /etc/nginx/conf.d/*.conf;
}
default.conf
文件
# 這個是 /etc/nginx/conf.d/default.conf; 這個配置文件 大部分內(nèi)容被注釋掉了 是一些配置示例
server {
listen 80; # nginx 默認(rèn)監(jiān)聽的端口號
listen [::]:80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
# location塊
# root:將接收到的請求根據(jù)/url/share/nginx/html去查找靜態(tài)資源
# index:默認(rèn)去上述的路徑中找index.html或者index.htm
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
修改docker-compose文件
為了方便修改Nginx配置焰络,修改yml文件
version: '3.1'
services:
nginx:
restart: always
image: daocloud.io/library/nginx:latest
container_name: nginx
ports:
- 80:80
volumes:
- /opt/docker_compose/docker_nginx/conf.d:/etc/nginx/conf.d
這里注意戴甩,使用docker-compose創(chuàng)建容器,掛載的容器卷里面的內(nèi)容是空的闪彼,需要自己在容器卷內(nèi)創(chuàng)建配置文件甜孤,比如 默認(rèn)端口 默認(rèn)訪問頁面的配置 即上文的 default.conf內(nèi)的配置
Nginx的反向代理
正向代理和反向代理介紹
正向代理
- 正向代理服務(wù)是由客戶端設(shè)立的
- 客戶端了解代理服務(wù)器和目標(biāo)服務(wù)器都是誰
- 幫助咱們實現(xiàn)突破訪問權(quán)限,提高訪問的速度畏腕,對目標(biāo)服務(wù)器隱藏客戶端的ip地址
反向代理
- 反向代理服務(wù)器是配置在服務(wù)端的
- 客戶端是不知道訪問的到底是哪一臺服務(wù)器
- 達(dá)到負(fù)載均衡缴川,并且可以隱藏服務(wù)器真正的ip地址
基于Nginx實現(xiàn)反向代理
準(zhǔn)備一個目標(biāo)服務(wù)器
啟動了之前的tomcat服務(wù)器
編寫nginx的配置文件,通過Nginx訪問到tomcat服務(wù)
server {
listen 80;
server_name localhost;
# 基于反向代理訪問到Tomcat服務(wù)器
location / {
proxy_pass http://10.10.0.19:8080/;
}
}
剛剛訪問Nginx的80端口描馅,現(xiàn)在顯示的是Tomcat的頁面了
關(guān)于Nginx的location路徑映射
優(yōu)先級關(guān)系如下
- location = /路徑:優(yōu)先級最高把夸,精準(zhǔn)匹配,一旦匹配铭污,不再去找其他匹配項恋日。
- location ^- /路徑:優(yōu)先級辭職,字符串匹配嘹狞,一旦匹配岂膳,不再去找其他匹配項。
- location - 正則表達(dá)式:如果有多個location的正則表達(dá)式匹配的話磅网,則使用正則表達(dá)式最長的那個谈截。
- location -* 正則表達(dá)式:和location - 正則表達(dá)式相同,不過黨前方式不區(qū)分大小寫
- location /路徑:常規(guī)方式,匹配前綴簸喂,優(yōu)先級最低
注意:有沒有映射(陪陪)上是一回事毙死,映射上了location,有沒有找到對應(yīng)的資源是另一回事
舉個例子:
# 直接匹配 優(yōu)先級最高
location =/ {
# 精確匹配娘赴,主機名后不能帶任何的字符串
}
# 完全匹配 精確匹配 a
location /aaa/bbb/ccc/d.html {
proxy_pass http://10.10.0.19:8080/;
}
# 匹配開頭路徑 正則皮牌 b a>b
location ^- /aaa/bbb {
# 匹配所有以/aaa/bbb開頭的路徑规哲,陪陪后,不再篩選其他選項
}
# 正則匹配 優(yōu)先級 c b>c 但是 c>a
location - /aaa/bbb {
# 匹配所有以/aaa/bbb開頭的路徑
}
location -/aaa/bbb/ccc {
proxy_pass http://10.10.0.19:8080/;
}
# 正則匹配后綴 優(yōu)先級4
location -* \.(gif|jpg|png)$ {
# 匹配以gif或者jpg或者png為結(jié)尾的路徑
}
# 常規(guī)匹配 通用匹配 優(yōu)先級5
location /xxx {
# 匹配所有以/xxx開頭的路徑
}
# 全部通賠 優(yōu)先級6
location / {
# 匹配全部路徑
}
Nginx負(fù)載均衡
Nginx為我們默認(rèn)提供了三中負(fù)載均衡的策略:
- 輪詢:將客戶端發(fā)起的請求诽表,平均的分配給每一臺服務(wù)器唉锌。默認(rèn)策略
- 權(quán)重:會將客戶端的請求,根據(jù)服務(wù)器的權(quán)重值不同竿奏,分配不同的數(shù)量袄简。
- ip_hash:基于發(fā)起請求的客戶端的ip地址不同,他始終會將請求發(fā)送到指定的服務(wù)器上泛啸。根據(jù)ip地址計算出一個結(jié)果绿语,根據(jù)這個結(jié)果找對應(yīng)的服務(wù)器
輪詢
想實現(xiàn)Nginx輪詢負(fù)載均衡機制只需要在配置文件中添加以下內(nèi)容
upstream 名字 {
server ip:port;
server ip:port;
...
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://upstream的名字/;
}
}
########## 輪詢訪問 一次80 一次81
#負(fù)載均衡
upstream ssm {
server 10.10.0.19:8080;
server 10.10.0.19:8081;
...
}
server {
listen 80;
server_name localhost;
# 演示 負(fù)載均衡
location /ssm {
proxy_pass http://ssm;
}
}
權(quán)重
實現(xiàn)權(quán)重的方式
upstream 名字 {
server ip:port weight=權(quán)重比例;
server ip:port weight=權(quán)重比例;
...
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://upstream的名字/;
}
}
########## 輪詢訪問 一次80 四次81
#負(fù)載均衡
upstream ssm {
server 10.10.0.19:8080 weight=2;
server 10.10.0.19:8081 weight=8;
...
}
server {
listen 80;
server_name localhost;
# 演示 負(fù)載均衡
location /ssm {
proxy_pass http://ssm;
}
}
ip_hash
ip_hash實現(xiàn) 根據(jù)hash算法,固定訪問某個地址
只需加上ip_hash;
即可
upstream 名字 {
ip_hash;
server ip:port;
server ip:port;
...
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://upstream的名字/;
}
}
Nginx動靜分離
Nginx的并發(fā)能力公式:
worker_processes * worker_connections / 4 | 2 = Nginx最終的并發(fā)能力
動態(tài)資源需要/4候址,靜態(tài)需要需要/2
Nginx通過動靜分離吕粹,來提升Nginx的并發(fā)能力,更快的給客戶響應(yīng)
動態(tài)資源代理
使用proxy_pass動態(tài)代理
# 配置如下
location / {
proxy_pass 路徑;
}
靜態(tài)資源代理
使用root靜態(tài)代理
location / {
root 靜態(tài)資源路徑;
index 默認(rèn)訪問路徑下的什么資源;
autoindex on; # 代表展示靜態(tài)資源的全部內(nèi)容岗仑,以列表的行使展開匹耕。
}
# 先修改docker,添加一個數(shù)據(jù)卷荠雕,映射到Nginx服務(wù)器的一個目錄
version: '3.1'
services:
nginx:
restart: always
image: daocloud.io/library/nginx:latest
container_name: nginx
ports:
- 80:80
volumes:
- /opt/docker_compose/docker_nginx/conf.d:/etc/nginx/conf.d
- /opt/docker_compose/docker_nginx/images/:/usr/share/nginx/images
- /opt/docker_compose/docker_nginx/css/:/usr/share/nginx/css
- /opt/docker_compose/docker_nginx/js/:/usr/share/nginx/js
- /opt/docker_compose/docker_nginx/html/:/usr/share/nginx/html
# 添加了index.html和boy.png鏡頭資源
在tomcat的jsp 動態(tài)頁面 引用nginx 中的靜態(tài)資源
<img src="/image/boy.png">
# 修改配置文件
upstream test {
server ip:port weight=權(quán)重比例;
server ip:port weight=權(quán)重比例;
...
}
server {
listen 80; # nginx 默認(rèn)監(jiān)聽的端口號
listen [::]:80;
server_name localhost;
# location / {
# root /usr/share/nginx/html;
# index index.html index.htm;
# proxy_pass http://10.10.0.19:8080/;
# }
location /images {
root /usr/share/nginx/html;
autoindex on; # 代表展示靜態(tài)資源的全部內(nèi)容稳其,以列表的行使展開。
}
location /css {
root /usr/share/nginx/html;
autoindex on; # 代表展示靜態(tài)資源的全部內(nèi)容炸卑,以列表的行使展開既鞠。
}
location /js {
root /usr/share/nginx/html;
autoindex on; # 代表展示靜態(tài)資源的全部內(nèi)容,以列表的行使展開盖文。
}
location /html {
root /usr/share/nginx/html;
autoindex on; # 代表展示靜態(tài)資源的全部內(nèi)容嘱蛋,以列表的行使展開。
}
location / {
root /usr/share/nginx/html;
index index.html index.htm;
proxy_pass http://test/;
}
}
@歐幣杰昔