先来讲讲目前的场景吧,目前已有的api项目是跑在apache下的,接下来打算新的业务接口上swoole+imi。为了保证不给前端那边造成困扰,打算新老接口,都用同一个域名(api.xxx.com)。
这时候就需要Nginx了,之前说实话没怎么用过,研究了一下,暂时没什么问题。把配置发出来,供大家参考,也是给自己做一个记录。
首先,我打算Apache和Nginx同时监听80端口,因为Apache下跑的项目如果改其他端口可能会出现一些问题。于是,我把Apache的80端口监听到127.0.0.1上,Nginx的80端口监听到外网的IP上。
upstream abcdef {
server 127.0.0.1:80;
}
server {
listen 外网IP:80 default_server;
server_name api.xxx.com;
location / {
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://abcdef;
}
}如上代码实现了旧项目通过Nginx访问。下面代码是加入到server中的,可以实现指定请求,去请求另外的地址。
# 访问http://api.xxx.com/abc时候,去请求http://127.0.0.1:8081/abc
location /abc {
proxy_pass http://127.0.0.1:8081;
}
# 访问http://api.xxx.com/def时候,去请求http://127.0.0.1:8081/def123
location /def {
rewrite ^ /def123$1;
proxy_pass http://127.0.0.1:8081;
}
接下来实现https也踩了一个坑,首先https的配置方式:
server {
listen 外网IP:443 default_server;
server_name *.xxx.com;
location / {
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 https://abcdef;
}
ssl on;
ssl_certificate /etc/apache2/ssl/nginx-cert.crt;
ssl_certificate_key /etc/apache2/ssl/private.key;
ssl_prefer_server_ciphers on;
}
如上所示,配置一下ssl证书,但ssl_certificate这里有个坑,不能使用和apache一样。需要手动将ca_bundle.crt内容+换行+certificate.crt内容合并,建立一个新文件。如果不这么做,电脑、iOS可以正常请求,但安卓就不行了。通过网上的ssl检测也无法通过,从这里看貌似安卓对证书的验证更加严格,更加安全……