FCGI协议

场景说明

  • 假设我们有一个http server对外提供服务,并且有2个服务实例;1个负责处理FastCGI协议请求,另外1个负责处理HTTP协议请求
    • 域名:example.org
    • 以/fcgi开头的请求都转发至FastCGI协议服务实例;地址:10.0.0.1:8001
    • 其他的请求都转发至HTTP协议服务实例;地址:10.0.0.1:8002

配置说明

样例配置上稍做修改,就可以实现上述转发功能

  • Step 1.在 conf/bfe.conf配置转发功能使用的配置文件路径
  1. hostRuleConf = server_data_conf/host_rule.data #域名规则配置文件
  2. routeRuleConf = server_data_conf/route_rule.data #分流规则配置文件
  3. clusterConf = server_data_conf/cluster_conf.data #集群配置文件
  4. clusterTableConf = cluster_conf/cluster_table.data #集群实例列表配置文件
  5. gslbConf = cluster_conf/gslb.data #子集群负载均衡配置文件
  • Step 2. 配置域名规则 (conf/server_data_conf/host_rule.data)
  1. {
  2. "Version": "init version",
  3. "DefaultProduct": null,
  4. "Hosts": {
  5. "exampleTag":[
  6. "example.org" // 域名example.org=>域名标签exampleTag
  7. ]
  8. },
  9. "HostTags": {
  10. "example_product":[
  11. "exampleTag" // 域名标签exampleTag=>产品线名称example_product
  12. ]
  13. }
  14. }
  • Step 3. 配置集群的基础信息 (conf/server_data_conf/cluster_conf.data) 配置集群cluster_demo_fcgi和cluster_demo_http 后端配置的参数,其他均使用默认值
  1. {
  2. "Version": "init version",
  3. "Config": {
  4. "cluster_demo_http": { // 集群cluster_demo_http的配置
  5. "BackendConf": {
  6. "TimeoutConnSrv": 2000,
  7. "TimeoutResponseHeader": 50000,
  8. "MaxIdleConnsPerHost": 0,
  9. "RetryLevel": 0
  10. }
  11. },
  12. "cluster_demo_fcgi": { // 集群cluster_demo_fcgi的配置
  13. "BackendConf": {
  14. "Protocol": "fcgi",
  15. "TimeoutConnSrv": 2000,
  16. "TimeoutResponseHeader": 50000,
  17. "MaxIdleConnsPerHost": 0,
  18. "RetryLevel": 0,
  19. "FCGIConf": {
  20. "Root": "/home/work",
  21. "EnvVars": {
  22. "VarKey": "VarVal"
  23. }
  24. }
  25. }
  26. }
  27. }
  28. }
  • Step 4. 配置集群下实例信息 (conf/cluster_conf/cluster_table.data)
  1. {
  2. "Version": "init version",
  3. "Config": {
  4. "cluster_demo_fcgi": { // 集群 => 子集群 => 实例列表
  5. "demo_fcgi.all": [{ // 子集群demo_fcgi.all
  6. "Addr": "10.0.0.1", // 实例地址:10.0.0.1
  7. "Name": "fcgi.A", // 实例名:fcgi.A
  8. "Port": 8001, // 实例端口:8001
  9. "Weight": 1 // 实例权重:1
  10. }]
  11. },
  12. "cluster_demo_http": {
  13. "demo_http.all": [{
  14. "Addr": "10.0.0.1",
  15. "Name": "http.A",
  16. "Port": 8002,
  17. "Weight": 1
  18. }]
  19. }
  20. }
  21. }
  • Step 5. 配置子集群内负载均衡 (conf/cluster_conf/gslb.data)
  1. {
  2. "Hostname": "",
  3. "Ts": "0",
  4. "Clusters": {
  5. "cluster_demo_fcgi": { // 集群 => 子集群权重
  6. "GSLB_BLACKHOLE": 0, // 黑洞的分流权重为0,表示不丢弃流量
  7. "demo_fcgi.all": 100 // 权重为100,表示全部分流到demo_fcgi.all
  8. },
  9. "cluster_demo_http": {
  10. "GSLB_BLACKHOLE": 0,
  11. "demo_http.all": 100
  12. }
  13. }
  14. }
  • Step 6. 配置分流规则 (conf/server_data_conf/route_rule.data)
    • 将/fcgi开头的流量转发到cluster_demo_fcgi集群
    • 其余流量转发到cluster_demo_http集群
  1. {
  2. "Version": "init version",
  3. "ProductRule": {
  4. "example_product": [ // 产品线 => 分流规则
  5. {
  6. // 以/fcgi开头的path分流到cluster_demo_fcgi集群
  7. "Cond": "req_path_prefix_in(\"/fcgi\", false)",
  8. "ClusterName": "cluster_demo_fcgi"
  9. },
  10. {
  11. // 其他流量分流到cluster_demo_http集群
  12. "Cond": "default_t()",
  13. "ClusterName": "cluster_demo_http"
  14. }
  15. ]
  16. }
  17. }
  • Step 7. 验证配置规则
  1. curl -H "host: example.org" "http://127.1:8080/fcgi/test"
  2. # 将请求转发至10.0.0.1:8001
  3. curl -H "host: example.org" "http://127.1:8080/http/test"
  4. # 将请求转发至10.0.0.1:8002