一、引言
1.1 代理問題
客戶端到底要將請求發送給哪臺服務器。
發送給服務器1還是服務器2 |
---|
image.png
|
1.2 負載均衡問題
如果所有客戶端的請求都發送給了服務器1,那么服務器2將沒有任何意義
負載均衡問題 |
---|
image.png
|
1.3 資源優化
客戶端發送的請求可能是申請動態資源的,也有申請靜態資源,但是都是去Tomcat中獲取的
靜態資源訪問 |
---|
image.png
|
1.4 Nginx處理
在搭建集群后,使用Nginx |
---|
image.png
|
二、Nginx概述
Nginx是由俄羅斯人研發的,應對Rambler的網站,并且2004年發布的第一個版本。
Nginx之父 |
---|
image.png
|
Nginx的特點:
- 穩定性極強。 7*24小時不間斷運行。
- Nginx提供了非常豐富的配置實例。
- 占用內存小,并發能力強。
三、Nginx的安裝
3.1 安裝Nginx
使用Docker-Compose安裝,創建docker-compose.yml寫入以下內容:
version: '3.1'
services:
nginx:
restart: always
image: daocloud.io/library/nginx:latest
container_name: nginx
ports:
- 80:80
[root@iz8vbdmrir2n6xqzrbd93hz ~]# cd /opt
[root@iz8vbdmrir2n6xqzrbd93hz opt]# ls
containerd docker_mysql_tomcat docker_ssm yangl
[root@iz8vbdmrir2n6xqzrbd93hz opt]# mkdir docker_nginx
[root@iz8vbdmrir2n6xqzrbd93hz opt]# cd docker_nginx/
[root@iz8vbdmrir2n6xqzrbd93hz docker_nginx]# vim docker-compose.yml
[root@iz8vbdmrir2n6xqzrbd93hz docker_nginx]# docker-compose-Linux-x86_64 up -d
Creating network "docker_nginx_default" with the default driver
Pulling nginx (daocloud.io/library/nginx:latest)...
latest: Pulling from library/nginx
6ec8c9369e08: Pull complete
d3cb09a117e5: Pull complete
7ef2f1459687: Pull complete
e4d1bf8c9482: Pull complete
795301d236d7: Pull complete
Digest: sha256:deb724a427ea79face617392a5a471fdcb4cdb57f971ee6b7e492b90fecb199f
Status: Downloaded newer image for daocloud.io/library/nginx:latest
Creating nginx ... done
測試:瀏覽器訪問即可(80端口可以省略不寫,云服務器記得去開放80端口)
3.2 Nginx的配置文件
關于Nginx的核心配置文件nginx.conf
[root@iz8vbdmrir2n6xqzrbd93hz docker_nginx]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4d8af14af5cb daocloud.io/library/nginx:latest "/docker-entrypoint.…" 6 minutes ago Up 6 minutes 0.0.0.0:80->80/tcp nginx
[root@iz8vbdmrir2n6xqzrbd93hz docker_nginx]# docker exec -it 4d8 bash
root@4d8af14af5cb:/# cd /etc/nginx
root@4d8af14af5cb:/etc/nginx# ls
conf.d fastcgi_params koi-utf koi-win mime.types modules nginx.conf scgi_params uwsgi_params win-utf
root@4d8af14af5cb:/etc/nginx# cat nginx.conf
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
# 參數說明
# 以上統稱為全局塊,
# worker_processes的數值越大,Nginx的并發能力就越強(由運維人員修改)
# error_log 代表Nginx的錯誤日志存放的位置
events {
worker_connections 1024;
}
# 參數說明
# events塊
# worker_connections的數值越大,Nginx的并發能力就越強(由運維人員修改)
http {
include /etc/nginx/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 /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
# 參數說明
# http塊
# include代表引入一個外部的文件 -> /mime.types中放著大量的媒體類型
# include /etc/nginx/conf.d/*.conf; -> 引入了conf.d目錄下的以.conf為結尾的配置文件
root@4d8af14af5cb:/etc/nginx# ls
conf.d fastcgi_params koi-utf koi-win mime.types modules nginx.conf scgi_params uwsgi_params win-utf
root@4d8af14af5cb:/etc/nginx# cd conf.d/
root@4d8af14af5cb:/etc/nginx/conf.d# ls
default.conf
root@4d8af14af5cb:/etc/nginx/conf.d# cat default.conf
# 參數說明
# server塊
# listen: 代表Nginx監聽的端口號
# localhost:代表Nginx接收請求的ip
server {
listen 80;
listen [::]:80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html;
index 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;
#}
}
3.3 修改docker-compose文件
為了方便修改Nginx配置,修改docker-compose.yml文件,設置 volumes ,重新啟動
version: '3.1'
services:
nginx:
restart: always
image: daocloud.io/library/nginx:latest
container_name: nginx
ports:
- 80:80
volumes:
- /opt/docker_nginx/conf.d/:/etc/nginx/conf.d
root@4d8af14af5cb:/etc/nginx/conf.d# exit
exit
[root@iz8vbdmrir2n6xqzrbd93hz docker_nginx]# ls
docker-compose.yml
[root@iz8vbdmrir2n6xqzrbd93hz docker_nginx]# docker-compose-Linux-x86_64 down
Stopping nginx ... done
Removing nginx ... done
Removing network docker_nginx_default
[root@iz8vbdmrir2n6xqzrbd93hz docker_nginx]# vim docker-compose.yml
[root@iz8vbdmrir2n6xqzrbd93hz docker_nginx]# docker-compose-Linux-x86_64 build
nginx uses an image, skipping
[root@iz8vbdmrir2n6xqzrbd93hz docker_nginx]# docker-compose-Linux-x86_64 up -d
Creating network "docker_nginx_default" with the default driver
Creating nginx ... done
[root@iz8vbdmrir2n6xqzrbd93hz docker_nginx]# ls
conf.d docker-compose.yml
此時再使用瀏覽器訪問則無法訪問nginx.html頁面了,此時需要在conf.d目錄下創建default.conf文件,配置一個server,再重新啟動即可
server {
listen 80;
listen [::]:80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
[root@iz8vbdmrir2n6xqzrbd93hz docker_nginx]# cd conf.d/
[root@iz8vbdmrir2n6xqzrbd93hz conf.d]# ls
[root@iz8vbdmrir2n6xqzrbd93hz conf.d]# vim default.conf
[root@iz8vbdmrir2n6xqzrbd93hz conf.d]# cd ..
[root@iz8vbdmrir2n6xqzrbd93hz docker_nginx]# docker-compose-Linux-x86_64 restart
Restarting nginx ... done
四、Nginx的反向代理【重點
】
4.1 正向代理和反向代理介紹
正向代理:
- 正向代理服務是由客戶端設立的。
- 客戶端了解代理服務器和目標服務器都是誰。
- 幫助咱們實現突破訪問權限,提高訪問的速度,對目標服務器隱藏客戶端的ip地址。
正向代理 |
---|
image.png
|
反向代理:
- 反向代理服務器是配置在服務端的。
- 客戶端是不知道訪問的到底是哪一臺服務器。
- 達到負載均衡,并且可以隱藏服務器真正的ip地址。
image.png
4.2 基于Nginx實現反向代理
準備一個目標服務器,啟動了之前的tomcat服務器,使其能夠訪問到頁面
[root@iz8vbdmrir2n6xqzrbd93hz docker_nginx]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
818cd6a46ecb daocloud.io/library/nginx:latest "/docker-entrypoint.…" 3 hours ago Up 40 minutes 0.0.0.0:80->80/tcp nginx
[root@iz8vbdmrir2n6xqzrbd93hz docker_nginx]# cd ..
[root@iz8vbdmrir2n6xqzrbd93hz opt]# ls
containerd docker_mysql_tomcat docker_nginx docker_ssm yangl
[root@iz8vbdmrir2n6xqzrbd93hz opt]# cd docker_mysql_tomcat/
[root@iz8vbdmrir2n6xqzrbd93hz docker_mysql_tomcat]# ls
docker-compose.yml mysql_data tomcat_logs tomcat_webapps
[root@iz8vbdmrir2n6xqzrbd93hz docker_mysql_tomcat]# cd tomcat_webapps/
[root@iz8vbdmrir2n6xqzrbd93hz tomcat_webapps]# ls
[root@iz8vbdmrir2n6xqzrbd93hz tomcat_webapps]# mkdir ROOT
[root@iz8vbdmrir2n6xqzrbd93hz tomcat_webapps]# cd ROOT/
[root@iz8vbdmrir2n6xqzrbd93hz ROOT]# vim index.html
[root@iz8vbdmrir2n6xqzrbd93hz ROOT]# cd ..
[root@iz8vbdmrir2n6xqzrbd93hz tomcat_webapps]# cd ..
[root@iz8vbdmrir2n6xqzrbd93hz docker_mysql_tomcat]# docker-compose-Linux-x86_64 up -d
Starting tomcat ... done
Starting mysql ... done
然后修改nginx的default.conf配置文件,使其通過Nginx訪問到tomcat服務器。
server {
listen 80;
listen [::]:80;
server_name localhost;
# 基于反向代理訪問到Tomcat服務器
location / {
proxy_pass http://39.98.132.196:8080/;
}
}
[root@iz8vbdmrir2n6xqzrbd93hz docker_mysql_tomcat]# cd ..
[root@iz8vbdmrir2n6xqzrbd93hz opt]# ls
containerd docker_mysql_tomcat docker_nginx docker_ssm yangl
[root@iz8vbdmrir2n6xqzrbd93hz opt]# cd docker_nginx/
[root@iz8vbdmrir2n6xqzrbd93hz docker_nginx]# ls
conf.d docker-compose.yml
[root@iz8vbdmrir2n6xqzrbd93hz docker_nginx]# cd conf.d/
[root@iz8vbdmrir2n6xqzrbd93hz conf.d]# ls
default.conf
[root@iz8vbdmrir2n6xqzrbd93hz conf.d]# vim default.conf
[root@iz8vbdmrir2n6xqzrbd93hz docker_nginx]# docker-compose-Linux-x86_64 restart
Restarting nginx ... done
4.3 關于Nginx的location路徑映射
優先級關系如下:
# 1. 直接匹配
location = / {
# 精準匹配,主機名后面不能帶任何的字符串
}
# 2. 通用匹配
location /xxx {
# 匹配所有以/xxx開頭的路徑
}
# 3. 正則匹配
location ~ /xxx {
# 匹配所有以/xxx開頭的路徑
}
# 4. 匹配開頭路徑
location ^~ /images/ {
# 匹配所有以/images開頭的路徑
}
# 5. 匹配后綴
location ~* \.(gif|jpg|png)$ {
# 匹配以gif或者jpg或者png為結尾的路徑
}
# 6. 全部通配
location / {
# 匹配全部路徑
}