72330
こんにちは。  
nginxにて、httpリクエストのgetパラメータの値を判定し、  
別のプロセスを呼び出す方法について質問させてください。

前提条件：  
・osはlinux(Ubuntu 7.5.0)  
・nginxは、port8080で起動しています  
・外部からのHTTPリクエストをnginx(port8080)が受け取る  
・nginxは、getパラメータの値を参照して、別のプロセスに(port8081,8082)に処理渡したい。  
・Pythonのtornadoプロセス(port8081,8082)は、nginxからリクエストを受け取る。  
・最終的な処理結果をnginxからレスポンスする

やりたいこと詳細：  
nginxが、外部からリクエスト「http://localhost:8080?id=API022」のように受信したら、  
GETパラメータの値「API022」の部分を判定して、使用するプロセス選択したいと思います。

①アクセスが「http://localhost:8080?id=API022」だったら  
ローカルサーバー「127.0.0.1:8081」のポート8081にhttpリクエストを渡す。

②アクセスが「http://localhost:8080?id=API022」以外だったら  
ローカルサーバー「127.0.0.1:8082」のポート8082にhttpリクエストを渡す。

上記のようにGetパラメータによって、処理を分けたいと思い、以下のように「nginx.conf」を編集しました。

「nginx.conf」の内容

```

    user www-data;
    worker_processes auto;
    pid /run/nginx.pid;
    
    
    events {
        worker_connections 768;
    }
    
    http {
        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 65;
        types_hash_max_size 2048;
        server_tokens off;
    
        include /etc/nginx/mime.types;
        default_type application/octet-stream;
    
        #access_log off;
        access_log   /var/log/nginx/debug.log;
    
        gzip on;
    
        upstream uwsgi_vox_server_backend {
            server unix:///var/run/uwsgi/web.sock;
            keepalive 65;
        }
    
    
        server {
            listen 8080 default_server;
    
    
                #使用するポートの設定
                set $backend01 "127.0.0.1:8081";
                set $backend02 "127.0.0.1:8082";    
            
                #API022があれば、「127.0.0.1:8081」を呼び出すようにしたい
                location ~* ^.*API022.$ {
                    #rewrite /fugadir/(.*) /$1 break;
                    proxy_pass http://$backend01;
                    #include /etc/nginx/conf.d/proxy.conf;
                }   
            
                location ~ ^/.*$ {
                    #root /var/www/html/;
                    proxy_pass http://$backend02;
                }
    
    
        }
        server {
            listen 80 default_server;
            server_name jp-dev.vvv.io;
            access_log off;
            uwsgi_intercept_errors on;
            location ~ ^/.*$ {
                if ($http_x_forwarded_proto = "https") {
                    set $http on;
                }
                uwsgi_pass uwsgi_vox_server_backend;
                include uwsgi_params;
                uwsgi_param HTTPS $http if_not_empty;
                uwsgi_param HTTP_X_REQUEST_ID $request_id;
                uwsgi_param HTTP_X_REQUEST_BODY $request_body;
            }
        }
    }
    
```

しかし、  
「http://localhost:8080?id=API022」  
でアクセスしても、  
「127.0.0.1:8082」の方にリクエストが渡されてしまいます(tornado側のログで確認)。  
API022でアクセスがある場合は、「127.0.0.1:8081」側に処理を渡してほしいです。

「location ~ ^.*API022.$ {」  
の部分で、「API022」だったら「127.0.0.1:8081」にアクセスできる想定でしたが、  
「127.0.0.1:8082」の方に処理(リクエスト)されます。

もしなにか分かることがありましたらご教示お願いします。
CC BY-SA 4.0
2020-12-01T09:45:42.857
72321
2020-12-01T13:34:06.307
28247
question
nginx
nginxにてgetパラメータ値で判断して別サーバ(別プロセス)に処理を渡したい
クエリストリングは `location` では判別できません。  
`$args` 変数で参照できますので、`location / { ... }` の中で if 文で分岐するといいと思います。

```

    location / {
        if ($args ~* id=API022) {
            proxy_pass http://127.0.0.1:8081;
        }
        if ($args !~* id=API022) {
            proxy_pass http://127.0.0.1:8082;
        }
    }
    
```
CC BY-SA 4.0
2020-12-01T13:34:06.307
72330
2020-12-01T13:34:06.307
4603
72321
answer