一: 正向代理和反向代理:
正向代理: 客户端想要访问谷歌是访问不了的, 通过正向代理, 可以访问谷歌.
客户端了解代理服务器和目标服务器是谁.
目的就是突破访问权限, 对目标服务器隐藏客户端ip地址;
反向代理: 配置在服务器端的, 与客户端完全没有关系的.
客户端不知道访问的是哪台服务器,
使用反向代理可以达到负载均衡, 并且可以隐藏真正的ip地址
一. 当有服务超过150的并发访问量时候, 需要配置多台tomcat服务器, 才能抗住压力.
但多台服务器时候, 客户端会向哪一台服务器发送请求怎么确定? 并且动静资源怎么处理? 然后请求通过数据库获取数据返回, 将数据返回给客户端
此时, 可以将nginx放到服务器前, 让服务器来通过自己的负载均衡策略,
-
- 决定将客户端的请求发送到哪台服务器.
- 并且将静态资源放到Nginx, 不需要去服务器请求静态资源
- nginx承受的并发访问量轻松到5w
二. niginx安装
2.1.准备yml文件
version: '3.1' services: nginx: image: daocloud.io/library/nginx:1.13.2 container_name: nginx restart: always environment: - TZ=Asia/Shanghai ports: - 80:80
volumes:
- /opt/docker_nginx/conf.d/:/etc/nginx/conf.d
2.2, 创建docker_nginx目录, docker-compose.yml文件, 并用docker-compose up -d 命令来启动.
之后, 访问80端口, 就可以查看到nginx的欢迎页面
2.3. 配置nginx
先进入nginx内部,然后cat nginx.conf的内容:
user nginx; worker_processes 1;# 值越大, 并发能力越强 error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; # 值越大, 并发能力越强 } 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; # 引入的配置文件 }
引入的conf.d下的default.conf文件内容(需要修改的是server块的这三个内容)
server { listen 80; # nginx的端口 server_name localhost; # nginx的域名 #charset koi8-r; #access_log /var/log/nginx/host.access.log main; 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; #} }
根据数据卷, 在/opt/docker_nginx/conf.d目录下, vi conf.d, 添加自己的配置:
server { listen 80; # nginx的端口 server_name localhost; # nginx的域名 #charset koi8-r; #access_log /var/log/nginx/host.access.log main; location / { # 路径映射 root /usr/share/nginx/html; # 路径 index index.html index.htm; } }
三. 基于nginx实现反向代理
3.1 准备:
- 启动一个tomcat服务器;保证能够通过服务器直接访问到tomcat
- 修改nginx的配置: 根据数据卷中的配置, vi default.conf , 通过nginx来访问tomcat
- 设置proxy_pass 值是tomcat的地址
server { listen 80; server_name localhost; # 配置反向代理 location / { proxy_pass http://192.168.43.173:8080/; } # location / { # root /usr/share/nginx/html; # index index.html index.htm; # } }
3.2 location块:配置请求的路由配置,
可以写多个location块, 对应不同的路径
配置规则:
-
- = 精准配置 location = / { 精准配置url, 后面不能带任何路径}
- ^~ 精准前缀匹配 location ~^ /img/{ 配置所有有以img开头的路径}
- ~ 正则匹配 location ~ /xxx{ 匹配所有以xxx开头的路径}
- ~* .(gif|jpg|png)${匹配以gif jpg png结尾的}
- / 通用配置 location /xxx { 后面能带xxx开头的路径}
example.com/admin -> http://127.0.0.1:8090
example.com/admin/test -> http://127.0.0.1:8090/test
example.com/admin/one -> http://127.0.0.1:8090/one
四. nginx负载均衡(轮询. 权重和ip哈希三种方式)
4.1.轮询: ababab这种大致情况,轮流访问nginx配置的proxy_pass下的路径
default.conf的配置(注意:自己声明的变量中不能用下划线)
#配置一个upstream
upstream my-server{ server 192.168.43.173:8080; server 192.168.43.173:8083; } server { listen 80; server_name localhost; #轮询的配置 location / { proxy_pass http://my-server/; } # 配置反向代理 # location / { # proxy_pass http://192.168.43.173:8080/; # } # location / { # root /usr/share/nginx/html; # index index.html index.htm; # } }
4.2. 权重: 按照 服务器的处理速度 来决定访问比例;下面的2:10的比例, 本人亲测, 比较准;
配置: 在轮询基础上加上权重即可
#不加权重是轮询,加权值是按权重划分访问比例次数 upstream my-server-weight{ server 192.168.43.173:8080 weight=2; server 192.168.43.173:8083 weight=10; } #upstream my-server{ # server 192.168.43.173:8080; # server 192.168.43.173:8083; #} server { listen 80; server_name localhost; #轮询的配置 location / { proxy_pass http://my-server-weight/; } # 配置反向代理 # location / { # proxy_pass http://192.168.43.173:8080/; # } # location / { # root /usr/share/nginx/html; # index index.html index.htm; # } }
4.3 ip哈希: nginx拿到ip地址后, 通过哈希运算得到结果, 来决定打到哪台服务器;
即如果ip地址不变, 则一直访问同一台服务器.
# ip哈希 upstream my-server-iphash{ ip_hash; server 192.168.43.173:8080; server 192.168.43.173:8083; } #不加权重是轮询,加权值是按权重划分访问比例次数 #upstream my-server-weight{ # server 192.168.43.173:8080 weight=2; # server 192.168.43.173:8083 weight=10; #} #upstream my-server{ # server 192.168.43.173:8080; # server 192.168.43.173:8083; #} server { listen 80; server_name localhost; #轮询的配置 location / { proxy_pass http://my-server-iphash/; } # 配置反向代理 # location / { # proxy_pass http://192.168.43.173:8080/; # } # location / { # root /usr/share/nginx/html;
四. nginx 动静分离
4.1 为什么动静分离: 通过动静分离提高并发能力
nginx的并发能力公式:
动态资源: worker_processes * worker_connections / 4 (为什么是4, 因为nginx要访问服务器和数据库,)
静态资源: worker_processes * worker_connections / 2 (因为nginx直接给就可以, 不需要访问数据库)
4.2 配置
动态资源代理:
location / {
proxy_pass 路径;
}
静态资源代理: 访问的是nginx所在的服务器的静态资源, 通过docker添加配置, 把nginx所在的服务器映射到数据卷中,达到修改数据卷就修改静态资源
location / {
root 静态资源路径;
index 默认访问的路径资源;
autoindex on: #代表展示全部静态资源, 以列表形式展开
}
1.修改docker-compose.yml
2 , 操作步骤
然后访问http://192.168.43.173/img/1.jpg或者http://192.168.43.173/html就会直接冲nginx服务器拿到了.
location /admin/ { proxy_pass http://127.0.0.1:8090 }