Appearance
Nginx
概述
Nginx是一种http协议服务器软件,使用C和C++语言开发,让程序员可以将网页发布在Nginx服务器上,让成千上万的用户可以浏览。除此之外,Nginx还是一种高性能的HTTP和反向代理服务器,同时也是一个代理邮件服务器。国内使用Nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。由俄罗斯的程序设计师Igor Sysoev所开发,官方测试nginx能够支支撑5万并发链接,并且cpu、内存等资源消耗却非常低,运行非常稳定。
Nginx与Tomcat的区别
Nginx
是异步多进程处理请求,异步方式意味着多个请求(万级别的)只创建一个进程使用,适合高并发
只能处理静态资源请求,称为 http 协议服务器
Tomcat
Tomcat 是同步多进程处理请求,同步方式意味着 1 个请求创建一个进程使用,多个请求创建多个进程使用,不适合高并发。
不仅可以处理静态资源请求,还可以处理动态资源请求。成为 web 应用服务器
总结
使用nginx用来接收互联网上大量的高并发请求,之后nginx分发(反向代理)给多台tomcat去处理。
Nginx作用
反向代理
- 正向代理
- 反向代理
动静分离
负载均衡
当每次有用户来访问的时候,nginx服务器先判断哪个真实访问服务器负载最小,分配这个用户去访问这个真实的服务器。
Nginx命令
./nginx
启动Nginx
./nginx -s reload
重启Nginx
./nginx -s stop
停止Nginx
安装
安装Nginx
- docker-compose.yml
yml
version: '3.9'
services:
nginx:
restart: always
image: nginx:1.19.4
container_name: nginx
ports:
- 80:80
networks:
default:
external: true
name: global
- 命令行
bash
docker-compose up -d
Nginx配置文件
worker_processes
工作进程数
worker_connections
单个工作进程可以允许同时建立外部连接的数量
include
代表引入一个外部的文件
- nginx.conf
nginx
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;
}
修改docker-compose文件
- docker-compose.yml
yml
version: '3.9'
services:
nginx:
restart: always
image: nginx:1.19.4
container_name: nginx
ports:
- 80:80
volumes:
- ./conf.d/:/etc/nginx/conf.d
- ./nginx.conf:/etc/nginx/nginx.conf
networks:
default:
external: true
name: global
- 命令行
bash
docker-comopse up -d
反向代理
Location映射路径匹配策略
http://nginx.org/en/docs/beginners_guide.html
匹配语法
nginx
location [ = | ~ | ~* | ^~ ] uri { ... }
=
严格匹配
^~
前缀匹配
~
正则匹配,不区分大小写
~*
正则匹配,区分大小写
- ``
不严格匹配
示例
nginx
location = / {
[ configuration A ]
}
location / {
[ configuration B ]
}
location /documents/ {
[ configuration C ]
}
location ^~ /images/ {
[ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {
[ configuration E ]
}
/
匹配A配置
/index.html
匹配B配置
/documents/document.html
匹配C配置
/images/1.gif
匹配D配置
/documents/1.jpg
匹配E配置
练习
基于反向代理访问到Tomcat服务器
准备资源
docker-compose.yml
ymlversion: '3.9' services: nginx: restart: always image: nginx:1.19.4 container_name: nginx ports: - 80:80 volumes: - ./nginx.conf:/etc/nginx/nginx.conf - ./conf.d:/etc/nginx/conf.d - ./static:/usr/share/static tomcat: restart: always image: tomcat:8.5.68-jdk8 container_name: tomcat volumes: - ./webapps:/usr/local/tomcat/webapps networks: default: external: true name: global
config.d/default.conf
nginxserver { listen 80; listen [::]:80; server_name localhost; location / { root /usr/share/nginx/html; index index.html index.htm; } location /static { alias /usr/share/static/; index index.html index.htm; } location /dynamic { proxy_pass http://tomcat:8080/; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }
3 仿vue反向代理
rewrite即为vue-proxy中的pathRewrite 跨域主要涉及4个响应头:
Access-Control-Allow-Origin 用于设置允许跨域请求源地址 (预检请求和正式请求在跨域时候都会验证)
Access-Control-Allow-Headers 跨域允许携带的特殊头信息字段(只在预检请求验证)
Access-Control-Allow-Methods 跨域允许的请求方法或者说HTTP动词(只在预检请求验证)
Access-Control-Allow-Credentials 是否允许跨域使用cookies,如果要跨域使用cookies,可以添加上此请求响应头,值设为true(设置或者不设置,都不会影响请求发送,只会影响在跨域时候是否要携带cookies,但是如果设置,预检请求和正式请求都需要设置)。不过不建议跨域使用(项目中用到过,不过不稳定,有些浏览器带不过去),除非必要,因为有很多方案可以代替。
nginx
location /foo {
rewrite /foo/(.*) /$1 break;
proxy_pass http://localhost:3200;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header Access-Control-Allow-Origin *;
# proxy_set_header Access-Control-Allow-Methods: POST, GET, OPTIONS;
# proxy_set_header Access-Control-Allow-Headers: X-PINGOTHER, Content-Type;
# proxy_set_header Access-Control-Allow-Credentials: true;
}
动静分离
nginx
server {
listen 80;
server_name localhost;
location / {
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_pass http://localhost:8082;
# 真实的客户端IP
proxy_set_header X-Real-IP $remote_addr;
# 请求头中Host信息
proxy_set_header Host $host;
# 代理路由信息,此处取IP有安全隐患
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 真实的用户访问协议
proxy_set_header X-Forwarded-Proto $scheme;
}
#静态文件交给nginx处理
location ~ .*\.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ {
root /static;
expires 30d;
}
#静态文件交给nginx处理
location ~ .*\.(js|css)?$ {
root /static;
expires 1h;
}
#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 html;
}
负载均衡
Nginx支持以下负载均衡策略
- 轮循
- 权重
- ip_hash
- least_conn
- fair(第三方)
- url_hash(第三方)
轮循方案
docker-compose.yml
yml
version: '3.9'
services:
nginx:
restart: always
image: nginx:1.19.4
container_name: nginx
ports:
- 80:80
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./conf.d:/etc/nginx/conf.d
- ./static:/usr/share/static
tomcat1:
restart: always
image: tomcat:8.5.68-jdk8
container_name: tomcat1
volumes:
- ./webapps:/usr/local/tomcat/webapps
tomcat2:
restart: always
image: tomcat:8.5.68-jdk8
container_name: tomcat2
networks:
default:
external: true
name: global
default.conf
nginx
upstream user {
server tomcat1:8080;
server tomcat2:8080;
}
server {
listen 80;
listen [::]:80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
location /static {
alias /usr/share/static/;
index index.html index.htm;
}
location /dynamic {
proxy_pass http://user/;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
权重方案
default.conf
nginx
upstream 名字 {
server ip:port weight=权重比例,默认为1;
server ip:port weight=权重比例;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://upstream的名字/;
}
}
ip_hash方案
default.conf
nginx
upstream 名字 {
ip_hash;
server ip:port;
server ip:port;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://upstream的名字/;
}
}
参考资料
http://nginx.org/en/docs/http/ngx_http_core_module.html
学习目标总结
- 掌握 Nginx 的三种负载均衡方案
- 了解 Nginx 的六种负载均衡方案
- 掌握 Nginx 的动静分离配置