环境:
主机:centos7 nginx
php服务api位置:主机上 Docker 中
php配置的映射端口: 127.0.0.1:9001~900x
php服务的入口文件路径: app-server/application
请求Url格式:https://server-name/Info/XXXXXXXXXX ,https://server-name/Upload/XXXXXXXXXX 等
Nginx 分发配置如下:
server{
listen 443 ssl http2;
server_name server-name;
ssl on;
ssl_certificate /path-to-crt;
ssl_certificate_key /path-to-key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_prefer_server_ciphers on;
location ~ \.php {
fastcgi_index index.php;
#fastcgi_pass 127.0.0.1:9001;
include fastcgi_params;
set $path_info "";
set $app "";
set $app_port "";
set $real_script_name $fastcgi_script_name;
if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {
set $real_script_name $1;
set $path_info $2;
}
if ($path_info ~ "^(^(\/\w+))") {
set $app $1;
}
if ($app ~ "(\w+)$") {
set $app $1;
}
#信息服务
if ($app = Info){
set $app "macco-information/application";
set $app_port 127.0.0.1:9001;
}
#上传服务
if ($app = Upload){
set $app "macco_uploadfile/application";
set $app_port 127.0.0.1:9003;
}
#...省略其他服务
fastcgi_pass $app_port;
fastcgi_param SCRIPT_FILENAME /workspace/$app/$real_script_name;
fastcgi_param SCRIPT_NAME $real_script_name;
fastcgi_param PATH_INFO $path_info;
}
if (!-e $request_filename) {
rewrite ^/(.*) /index.php/$1 last;
}
}
server{
listen 80;
server_name server-name;
return 301 https://$host$request_uri;
}
思路:Nginx 获取 Url_path ,根据自己的服务 Url 的规则来做转发,由于每个微服务是在一个 Docker 中,所以需要设置端口 App_port 来映射到 Docker 中, 设置 App 来指定 Fastcgi 的 SCRIPT_FILENAME 位置。