# 四、部署
### 1. nginx配置反向代理
> 我们要在本地部署测试,所以后台的地址是127.0.0.1:22222
项目开发完成后需要部署到服务器,因为是前后端分离,所以前端的应用部署到nginx,后端的应用部署到自己对应的服务器,所以我们需要配置一下,把后端的服务器变成上游服务,nginx做反向代理服务器
> 反向代理:服务器根据客户端的请求,从其关系的一组或多组后端服务器上获取资源,然后将这些资源返回给客户端。
由于上游服务器(后台服务器)要处理非常复杂的逻辑,所以性能不怎么样,我们使用nginx作为反向代理服务器后,可以将请求按照负载均衡算法代理给多台上游服务器。配置如下:
![image-20190311112112788](https://ws4.sinaimg.cn/large/006tKfTcgy1g0you8fbg4j30r10c60vn.jpg)
以上配置是将所有的请求转发给上游服务器,但如果我们只想将动态请求转发给上游服务器,静态资源由nginx自己处理,就可以这样做:
判断是否是后台api(根据location的匹配规则),如果是的话,就进行转发
匹配规则看这里:https://stackoverflow.com/questions/5238377/nginx-location-priority
```nginx
upstream local{
server 127.0.0.1:22222; #假设在本地部署
}
server{
listen:80;
server_name localhost;
location ~ /api/ { #以`/api/`开头的uri就行转发,否则不转发 ~代表正则表达式匹配
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://local;
}
location / {
#... alias index等配置
}
}
```
**这里需要注意一个问题**:proxy_pass是转发请求的模块,当你访问`localhost:80/api/users/login`时,会被转发到`local`的地址,即`127.0.0.1:22222/api/users/login`,所以开发环境下访问后台接口的URI要写你部署到nginx的URI,而不是真正的后台地址(因为被转发了)
前端配置
```js
//apis/api.config.js
//判断是否是生产环境
var isPro = process.env.NODE_ENV=== 'production'
module.exports = {
baseUrl: isPro ? 'http://localhost:80' : '/apis'//生产环境下的baseURl是nginx的hoost:port
}
```