统一环境
在实际开发中,会有不同的环境:
- 开发环境:自己的电脑
- 测试环境:提供给测试人员使用的环境
- 预发布环境:数据是和生成环境的数据一致,运行最新的项目代码进去测试
- 生产环境:项目最终发布上线的环境
如果不同环境使用不同的ip去访问,可能会出现一些问题。为了保证所有环境的一致,就应该在各种环境下都用域名来访问
如一个项目可能用到以下域名
主域名是:www.example.com
管理系统域名: admin.example.com
网关域名:api.example.com
那么,浏览器是如何通过域名找到对应服务的ip和端口的呢?
域名解析
其实,这个过程分为两步:
1.本地域名解析
在本机的hosts文件中查找域名映射的IP地址,如果查找到就返回IP ,否则进行域名服务器解析,一般本地解析都会失败,因为默认这个文件是空的
- Windows下的hosts文件地址:C:/Windows/System32/drivers/etc/hosts
- Linux下的hosts文件所在路径: /etc/hosts
2.域名服务器解析
本地解析失败,才会进行域名服务器解析,域名服务器就是网络中的一台计算机,里面记录了所有域名和ip映射关系
本地域名
在没有域名情况下,可以修改本地的hosts文件,实现对域名的解析。例如:
#第一行不能注释
127.0.0.1 localhost
127.0.0.1 example.com www.example.com
127.0.0.1 api.example.com
127.0.0.1 admin.example.com
保存后ping一下域名,发现是通的就配置成功了。
如果项目中使用了webpack还需要做如下配置
webpack.dev.conf.js
devServer: {
...
//禁止检查host
disableHostCheck: true
},
现在已经可以通过域名:端口
访问网站了,如果希望通过只通过域名访问,那么应该把请求转发到某个端口,这时候要用到反向代理工具:Nginx
Nginx
nginx可以作为web服务器,但更多的时候,我们把它作为网关,因为它具备网关必备的功能:
- 反向代理
- 负载均衡
- 动态路由
- 请求过滤
nginx作为web服务器
Web服务器分2类:
- web应用服务器,如:
- tomcat
- resin
- jetty
- web服务器,如:
- Apache 服务器
- Nginx
- IIS
区分:web服务器不能解析jsp等页面,只能处理js、css、html等静态资源。
并发:web服务器的并发能力远高于web应用服务器。
nginx作为反向代理
什么是反向代理?
- 代理:通过客户机的配置,实现让一台服务器代理客户机,客户的所有请求都交给代理服务器处理。
- 反向代理:用一台服务器,代理真实服务器,用户访问时,不再是访问真实服务器,而是代理服务器。
nginx作为反向代理,完成以下工作:
- 根据我们在nginx中配置好的反向代理规则,将不同的请求交给不同的真实服务器处理
- 当请求到达nginx,nginx会根据已经定义的规则进行请求的转发,从而实现路由功能
nginx实现通过域名访问不同服务的策略
安装
mac通过homebrew的安装目录:/usr/local/etc/nginx
ubuntu安装nginx的目录:/etc/nginx
反向代理配置
/usr/local/etc/nginx/servers/example.com.conf
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
# access_log /var/log/nginx/example-access.log;
# error_log /var/log/nginx/example-error.log;
location / {
# 8080 是项目的运行端口
proxy_pass http://127.0.0.1:8080;
# 如果网站有大量实时交互的内容,则取消下面注释来禁用缓存
# proxy_buffering off;
# 如果需要将客户端IP加入到请求头,取消下面注释
# proxy_set_header X-Real-IP $remote_addr;
proxy_connect_timeout 600;
proxy_read_timeout 600;
}
}
检查配置文件是否出错
nginx -t
重启nginx
nginx -s reload