Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

nginx configuration for a RESTful API

Tags:

php

nginx

I am a beginner with nginx and php, so please excuse my basic question.

For a RESTful based API (nginx + php) I would need some help with nginx configuration.

Here is the relevant snippet of the nginx configuration (as suggested here) for redirecting all /api/v1/* requests to my apiv1.php script:

    server {
        server_name myServer;
        root /usr/share/nginx/html;
        location /api/v1/ {
          try_files $uri $uri/ /apiv1.php?$args;
        }

        location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
    }

Now the issue is that when I type http://myServer//api/v1/resource/GetInfo in my browser, the apiv1.php script doesn't seem to receive the "resource/GetInfo". Actually, _GET and _REQUEST are empty, but _SERVER looks OK!

In my /etc/php5/fpm/php.ini, the following relevant config is enabled:

request_order = "GP"
variables_order = "GPCS"
register_argc_argv = Off
auto_globals_jit = On.

Do you maybe know why the php _GET and _REQUEST are empty? Is this related to my php configuration only?

Best regards, M.

like image 390
knowledge_quest Avatar asked Jan 22 '15 17:01

knowledge_quest


People also ask

Can I use NGINX as API gateway?

One advantage of using NGINX as an API gateway is that it can perform that role while simultaneously acting as a reverse proxy, load balancer, and web server for existing HTTP traffic.

What is the default NGINX config?

The way nginx and its modules work is determined in the configuration file. By default, the configuration file is named nginx. conf and placed in the directory /usr/local/nginx/conf , /etc/nginx , or /usr/local/etc/nginx .

Can NGINX act as load balancer?

It is possible to use nginx as a very efficient HTTP load balancer to distribute traffic to several application servers and to improve performance, scalability and reliability of web applications with nginx.


2 Answers

If someone else hit this page, there is solution I got for myself after a bit research:

location ~ ^/api/v0/(.*)/?$ {
    try_files $uri $uri/ /v0.php?req=$1&$args;
}

Here I'm not limited with class/method structure and location seems more readable than rewrite.

like image 121
Sergej Wouldnttell Avatar answered Oct 21 '22 11:10

Sergej Wouldnttell


Replace this:

location /api/v1/ {
    try_files $uri $uri/ /apiv1.php?$args;
}

With the following inside your server block:

rewrite ^/api/v1/([^/]+)/([^/]+)/?$ /apiv1.php?class=$1&method=$2? last;

Create a php file called apiv1.php and place in the root directory of your web server with the following lines of code:

<?php
$class  = filter_input(INPUT_GET, 'class',  FILTER_SANITIZE_STRING);
$method = filter_input(INPUT_GET, 'method', FILTER_SANITIZE_STRING);

echo $class;
echo '<br />';
echo $method;

Test by visiting the following link in your browser:

http://myServer/api/v1/members/getInfo
like image 35
PhearOfRayne Avatar answered Oct 21 '22 12:10

PhearOfRayne