先来讲讲目前的场景吧,目前已有的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检测也无法通过,从这里看貌似安卓对证书的验证更加严格,更加安全……