一、正向代理与反向代理
1.1正向代理
正向代理就是一个位于客户端和目标服务器之间的代理服务器,为了从目标服务器取得内容,客户端向代理服务器发送一个请求并指定目标(目标服务器),然后代理服务器向目标服务器发送请求并将获得的内容返回给客户端。
此时的代理服务器是由用户自主设置的,客户端请求都被代理服务器的请求给替代,因此正向代理能够隐藏客户端的信息。
1.2 反向代理
反向代理方式是指代理服务器接受连接请求,然后将请求发送给内网服务器,并将从内网服务器收到的结果返回给客户端。
反向代理服务器也位于客户端和目标服务器之间,但是此时的代理服务器是由目标服务器设置的,因此对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问代理服务器就可以获得目标服务器的资源。此时用户也不需要知道目标服务器的地址。
反向代理服务器可以用来屏蔽内网服务器信息,负载均衡等等。
二、配置系统Host文件
我们知道在网络上访问网站,要首先通过DNS服务器把要访问的网络域名(XXXX.com)解析成XXX.XXX.XXX.XXX的IP地址后,计算机才能对这个网络域名作访问。
要是对于每个域名请求我们都要等待域名服务器解析后返回IP信息,这样访问网络的效率就会降低,因为DNS做域名解析和返回IP都需要时间。
为了提高对经常访问的网络域名的解析效率,可以通过利用Hosts文件中建立域名和IP的映射关系来达到目的。根据Windows系统规定,在进行DNS请求以前,Windows系统会先检查自己的Hosts文件中是否有这个网络域名映射关系。如果有则,调用这个IP地址映射,如果没有,再向已知的DNS服务器提出域名解析。也就是说Hosts的请求级别比DNS高。
因此在开发过程中,我们可以在Hosts文件中配置好域名与对应的虚拟机ip地址,方便我们开发过程中访问。
三、Nginx相关配置
Nginx配置文件结构
cat /mydata/nginx/conf/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;
}
可以看到,在 http 块中最后有 include /etc/nginx/conf.d/*.conf; 这句配置说明在 conf.d 目录下所有 .conf 后缀的文件内容都会作为 nginx 配置文件 http 块中的配置。这是为了防止主配置文件太复杂,也可以对不同的配置进行分类。
下面我们参考 conf.d 目录下的配置,来配置 gulimall 的 server 块配置。
gulimall.conf配置代理
server {
listen 80;
server_name gulimall.com;
#charset koi8-r;
#access_log /var/log/nginx/log/host.access.log main;
location / {
proxy_pass http://192.168.56.1:10000; //自己本机的ip地址
}
#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;
}
}
所以我们配置当访问 nginx请求时代理 192.168.56.1:10000转到商品服务首页,不过分布式情况下,商城系统可能有很多个,因此每次都得修改配置。因此改为将请求转发给网关,由网关转发给相应的服务。
反向代理:nginx 代理网关由网关进行转发
1. 修改 nginx.conf
vim /mydata/nginx/conf/nginx.conf
修改 http 块,配置上游服务器为网关地址,并取名gulimall
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;
upstream gulimall { //此处定义gulimall上游服务器
server 192.168.56.1:88;
}
include /etc/nginx/conf.d/*.conf;
}
2. 修改 gulimall.conf
配置代理地址为上面配置的上游服务器名gulimall
server {
listen 80;
server_name gulimall.com;
#charset koi8-r;
#access_log /var/log/nginx/log/host.access.log main;
location / {
proxy_set_header Host $host; //防止丢失host请求信息
proxy_pass http://gulimall; //路由给gulimall上游服务器
}
#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;
}
}
3、修改网关路由配置
#将主机地址为order.gulimall.com转发至gulimall-order
- id: gulimall_order_host
uri: lb://gulimall-order
predicates:
- Host=order.gulimall.com
#将主机地址为seckill.gulimall.com转发至gulimall-seckill
- id: gulimall_seckill_host
uri: lb://gulimall-seckill
predicates:
- Host=seckill.gulimall.com
#将主机地址为**.gulimall.com转发至gulimall-product
- id: gulimall_host
uri: lb://gulimall-product
predicates:
- Host=**.gulimall.com #这个放最后是为了让上面精确的路由规则先起作用
但此时访问API接口时能够成功
但是访问gulimall.com会出现
原因是Host主机地址没有匹配上,因为Nginx代理给网关的时候,会丢失host信息,因此通过设置proxy_set_header Host $host; 保留host信息。
至此,就达到如下效果了。
四、Nginx动静分离实现
1、什么是动静分离
Nginx动静分离简单来说就是把动态请求和静态请求分离,Nginx处理静态请求,Tomcat处理动态请求。
将css、js、jpg等静态资源存储于Nginx服务器,收到静态资源请求直接从Nginx返回,这样能够减轻Tomcat服务器压力,同时提升网页的响应速度。
所有项目的静态资源都放在Nginx。
规则:/static/**这类请求都有Nginx直接返回
2、具体实现步骤
(1)静态资源转移
将原idea的静态资源static
文件夹,全部移到服务器的/mydata/nginx/html/
目录下
(2)修改index.html的资源请求路径
统一在请求前加上/static/
(3)修改Nginx配置
vim /mydata/nginx/conf/conf.d/gulimall.conf