1. 应用场景
①反向代理
②负载均衡
③ 实现http 缓存
④动静分离
⑤数据压缩
⑥跨域访问 (响应头添加 允许跨域 的 响应头)
1.
HTTP 协议特点:
简单快速
灵活
无连接
无状态
1.
Nginx 虚拟主机 (Virtual Host)
②Nginx 实现反向代理(反向代理隐藏了真实的服务端,反向代理在服务端)
正向代理:隐藏了真实的客户端(正向代理在客户端)
用户 通过 ------> 正向代理 ------> YouTube
安装:
在nginx的根目录打开cmd 输入start nginx
启动nginx(此时需要注意,不要直接点击nginx.exe来启动),启动成功或者失败都会有一个黑窗口闪一下,所以看不出来是否成功。可以通过
http://localhost:80
看是否有nginx的成功提示- 查看任务管理器 -> 进程 看有没有nginx判断启动成功与否
- 常用命令:
- start nginx 启动nginx
- nginx -s reload 重新加载配置文件
- nginx -s quit 关闭
- nginx -s stop 快速关闭
案例:
启动:
反向代理:
server {
# 默认是80,这里我改为7077端口,我只需要打开http://localhost:7077就可以看到nginx启动的页面了。
listen 7077;
# server_name 指 url 输入的域名或者 IP
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
# proxy_pass 反向代理到哪台机器
proxy_pass http://192.168.43.161:8099;
# 将请求方法 转为 POST 请求
proxy_method POST;
# 设置请求头 信息
# 请求头 Host 为key ,值为 host
proxy_set_header Host $host;
#获取客户端的IP 地址设置到 header 中
# 请求头 X-Real-IP ,值为 remote_addr
proxy_set_header X-Real-IP $remote_addr;
# 获取所有转发请求的 ip 信息列表
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
浏览器访问:
http://localhost:7077/nginx/hello
就可以转到 localhost:8099/nginx/hello
负载均衡:
配置文件:
http {
include 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 logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
# 其他负载策略:
# ip_hash 每个 客户端ip 都打在 同一个服务器上
# least_conn: 当前活跃连接数越小,权重越大,越优先选择
# 第三方负载均衡模块 fair
# upstream ecif{
# fair ;
#server 192.168.43.161:8090 weight=2 max_fails=3 fail_timeout=15;
#server 192.168.43.161:8091 weight=3 ;
#server 192.168.43.161:8092 weight=1;
#}
# 定义服务组 (默认 是权重 轮训 策略)
upstream ecif{
server 192.168.43.161:8090 weight=2 max_fails=3 fail_timeout=15;
server 192.168.43.161:8091 weight=3 ;
server 192.168.43.161:8092 weight=1;
}
server {
listen 7077;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
# 服务组
proxy_pass http://ecif;
}
#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;
}
}
}
③ 实现http 缓存
http {
include 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 logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
# 定义缓存文件目录和缓存名称
# 10 分钟内没有访问就会被过去
# 缓存文件最多占用 1g
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=nginx01_cache:50m inactive=10m max_size=1g;
# 其他负载策略:
# ip_hash 每个 客户端ip 都打在 同一个服务器上
# least_conn: 当前活跃连接数越小,权重越大,越优先选择
# 第三方负载均衡模块 fair
# upstream ecif{
# fair ;
#server 192.168.43.161:8090 weight=2 max_fails=3 fail_timeout=15;
#server 192.168.43.161:8091 weight=3 ;
#server 192.168.43.161:8092 weight=1;
#}
# 定义服务组 (默认 是权重 轮训 策略)
upstream ecif{
server 192.168.43.161:8090 weight=2 max_fails=3 fail_timeout=15;
server 192.168.43.161:8091 weight=3 ;
server 192.168.43.161:8092 weight=1;
}
server {
listen 7077;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
# 服务组
proxy_pass http://ecif;
# nginx01_cache 为共享区域内存名称
proxy_cache nginx01_cache;
# 官网可看 nginx 内置的变量
proxy_cache_key $host$uri$is_args$args;
# 200 304 状态 的 设置 1分钟
proxy_cache_valid 200 304 1m;
# 响应数据给客户端 时候添加头信息,代表 是否 命中缓存
# ngx_cache_purge 这个第三方模块 可以 清理 缓存
add_header X-Proxy-Cache $upstream_cache_status ;
}
#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;
}
# 含有 purge 就进来,在 url 输入 地址含有 purge 就可以 清空缓存
location ~ /purge(/.*) {
allow all ;
proxy_cache_purge nginx01_cache $host$uri$is_args$args
}
}
}
④ 动静分离
#user nobody;
user root;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include 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 logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 7077;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
#
proxy_pass http://192.168.43.161:8090;
}
location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|js|css)$ {
# 直接访问目录下的 文件
root /usr/local/soft/nginx/data/static;
}
#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;
}
}
}
⑤ 数据压缩 (好处:增加传输速度)
压缩后验证:
⑥ 跨域访问
这是前段报错了,实际上已经访问到了后台方法。
方案一:前段 JSONP
方法二:
目标方法上 加 @CrossOrigin
原理:
会在响应方法上加上如下的响应头:
access-control-allow-origin : 具体到 哪个IP(允许 哪个机器 访问 我 )
添加个配置类:
@Configuration
方法三:
nginx
① (同源策略:浏览器禁止跨域的访问)
给 响应头 添加 允许跨域的 响应头
location / {
# 该字段是必须的。它的值要么是请求时Origin字段的值,要么是一个*,表示接受任意域名的请求。
add_header 'Access-Control-Allow-Origin' '*';
# 该字段可选。它的值是一个布尔值,表示是否允许发送Cookie。
# 默认情况下,Cookie不包括在CORS请求之中。设为true,即表示服务器明确许可,
# Cookie可以包含在请求中,一起发给服务器。这个值也只能设为true,
# 如果服务器不要浏览器发送Cookie,删除该字段即可
add_header 'Access-Control-Allow-Credentials' 'true';
# 该字段是必须的,用来列出浏览器的CORS请求会用到哪些HTTP方法,上例是PUT。
add_header 'Access-Control-Allow-Methods' '*';
add_header Access-Control-Allow-Headers *;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://localhost:8080;
}
or: WebMvcConfigurer接口
@Configuration
public class WebMvcConfig implements WebMvcConfigurer{
@Override
public void addCorsMappings(CorsRegistry registry) {
super.addCorsMappings(registry);
registry.addMapping("/**")
.allowedHeaders("*")
.allowedMethods("POST","GET")
// 允许跨域
.allowedOrigins("*");
}
}