Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to enable xdebug with nginx?

Tags:

nginx

xdebug

My situation is the following:

I have a VM (Ubuntu server 13.04) with PHP 5.4.9-4ubuntu2.2, nginx/1.2.6, php5-fpm and Xdebug v2.2.1.

I'm developing an app using PhpStorm 6.0.3 (which I deploy on the VM).

My problem is, whenever I try to start a debugging session, the IDE never gets a connection request from the webserver (And thus, the session never starts).

I looked through a lot of recommendations about xdebug configuration and found nothing useful.

What I recently realized is that if I set the XDEBUG_SESSION cookie myself through the browser (Thanks FireCookie) I can debug my app... so my guess is there's something keeping the webserver from sending the cookie back to the client.

The thing is, I'm using the same IDE configuration in a different project, which is deployed into a different CentOS based VM (with lighttpd), and it works just fine.

I tried to deploying my current project into such VM (changing the webserver to NginX) and it worked allright (Unfortunately I lost that VM and can't check the config :().

So... here's my NginX config:

server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;
    server_name localhost;

    location / {
        try_files $uri $uri/ /dispatch.php;
    }

    #
    location ~ \.php$ {
        root /var/www/bresson/web;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index  dispatch.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www/$fastcgi_script_name;
        include fastcgi_params;
        #fastcgi_pass   127.0.0.1:9009;
    }

}

fpm config (/etc/php5/fpm/pool.d/www.conf):

listen = /var/run/php5-fpm.sock

xdebug.ini:

zend_extension=/usr/lib/php5/20100525/xdebug.so
xdebug.remote_port=9000
xdebug.remote_enable=On
xdebug.remote_connect_back=On
xdebug.remote_log=/var/log/xdebug.log

Any idea will be much appreciated. Thanks!

EDIT:

Another thing I tried was to start a session from php and I saw that the session cookie was created without any problem...

2nd Edit:

I think I found where the problem is: the URI.

I wrote another script in order to try configuration parameters and stuff (A much simpler one), and it worked right out!.

So eventually I figured the problem was that the query parameters (i.e.: XDEBUG_SESSION_START=14845) were not reaching my script.

The problem is my starting URI, which is of the form /images/P/P1/P1010044-242x300.jpg. Through some virtual host configuration I should be able to route it to something of the like /dispatch.php/images/P/P1/P1010044-242x300.jpg, and use the rest of the URI as parameters. So... I haven't found a solution per se, but now I have a viable workaround (pointing my starting URL to /dispatch.php) which will do it for a while. Thanks

like image 890
Muc Avatar asked Aug 30 '13 19:08

Muc


People also ask

How do I enable debugging in nginx?

To activate debugging log you have to compile NGINX with –with-debug configure option and set debug level in error_log directive. It's possible to debug only connections from specified addresses via debug_connection directive.

Where do I put Xdebug DLL?

On Windows, you should place the php_xdebug. dll in the ext/ directory, which is a child directory in your PHP installation tree.

Where do I put Xdebug in PHP INI?

XAMPP for Mac OS X includes the XDebug PHP debugger, but it needs to be added to the "php. ini" file so that XDebug runs when Apache is started. To do this, open up the php. ini file, located at "/Applications/XAMPP/xamppfiles/etc/php.


1 Answers

Just in case there's someone reading this... I got it!

The problem was nginx's configuration. I had just copied a template from somewhere, but now I read a little more and found out that my particular config was much simpler:

location / {
        root /var/www/bresson/web/;
        include fastcgi_params;     
        fastcgi_param SCRIPT_FILENAME $document_root/dispatch.php;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
    }

In my case, every request has to be forwarded to my front-controller (which then analyzes the URI), so it was really simple.

like image 120
Muc Avatar answered Oct 17 '22 11:10

Muc