Blog de programación, errores, soluciones

Chose Language:
Author: Admin/Publisher |finished | checked

Como usar NGINX y PHP en Windows

Para tener un server local que use PHP en Windows hay muchas opciones Nginx es una de ellas, pero tenemos que tener algo de ideas de como configurar Nginx para usar PHP.

Recientemente, realicé un formateo a mi PC y para no instalar de nuevo XAMPP decidí instalar NGINX y seguir la configuración recomendada por otros, aunque está a mí no me funciono demasiado bien, así que veamos como hice mi instalación y config.

La instalación que veremos en este post será para hacer proyectos en el ámbito local, para producción deberás tomar un enfoque diferente

Instalación de NGINX

Nginx

Para instalar Nginx en Windows no necesitamos demasiado, simplemente tenemos que ir a https://nginx.org/en/download.html y bajar la versión estable del momento.

Una vez bajado el archivo lo podemos descomprimir y copiar la carpeta que está dentro a donde queramos por ejemplo a C:\Nginx y le cambiamos su nombre a Nginx o también podemos colocarla en la carpeta de nuestro usuario en mi caso C:\Users\luisg\Nginx

Instalación de PHP

Para instalar PHP en este caso utilicé Chocolatey con su GUI(graphic user interface), puedes ver como instalar Chocolatey en https://blastcoding.com/chocolatey-un-package-manager-para-windows/

Solo selecciona lo que desees instalar y listo como puede ver, yo también instale composer, en estos días tener PHP sin composer es como competir con una carreta contra un auto.

Configuración de Nginx para usar PHP

De por sí, Nginx ya viene con una configuración por defecto para PHP, pero no nos funcionará en todos los casos, ya que está pensada para su uso en Linux. Veamos esta configuración:

NGINX – nginx.conf

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}

De este archivo nos interesa la parte que más nos importa es la de location ~\.php la cual deberemos des-comentar quedando de la siguiente manera.

location ~ \.php$ {
            root           html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            include        fastcgi_params;
}

En esta fracción de código perteneciente a nuestro archivo nginx.conf podemos ver que posee

root, fastcgi_pass, fastcgi_index y fastcgi_param

root – Es donde mirara nuestro server en mi caso yo lo deje en html pero con su ruta completa en todo el archivo.

Por alguna cuestion html no fucionaba bien en windows y por lo tanto mi ruta completa seria C:/Users/luisg/Nginx/html, estoy seguro de que puede que te funcione con html o /html

Por ejemplo si tengo yo quiero tener varios sitios que serán carpetas colocadas en la carpeta html, por tanto, cuando suba el server si busco localhost/automotora sea la página alojada en C:/Users/luisg/Nginx/html/automotora

fastcgi_pass – En esta configuración vemos que le pasamos un socket 127..0.0.1:9000 que está constituido por la ip y puerto donde escuchara php-cgi. No tocaremos esta configuración a menos que sea necesario

fastcgi_index – no lo tocaremos claramente, queremos que nuestro index sea index.php aunque también podríamos ponerle que fuese home.php

fastcgi_param – con esta configuración definiremos parámetros que le pasaremos a fastcgi.

En este caso SCRIPT_FILENAME es suficiente, en este caso le está diciendo que los archivos PHP están en la carpeta scripts cambiaremos esto a $document_root$fastcgi_script_name de esta manera le diremos que chequearemos desde root.

Tenga en cuenta que esto forma parte de un virtualhost si quisiera hacer múltiples virtualhost deberíamos configurar esto de una manera distinta
nginx.conf

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   C:/Users/luisg/Nginx/html;
            index  index.html index.htm index.php;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   C:/Users/luisg/Nginx/html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        location ~ \.php$ {

            root           C:/Users/luisg/Nginx/html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            #fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            include        fastcgi_params;
        }

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}

Creación de un archivo BATCH para levantar PHPCGI y NGINX

Bueno para iniciar PHP-CGI con este comando en consola bastaría C:\tools\phpX\php-cgi.exe -b 127.0.0.1:9000, X en este ejemplo sería la versión.

Pero tenga en cuenta que también deberíamos correr Nginx y finalizar los procesos cuando se lo indiquemos, para ello podríamos usar taskkill /f /im nginx.exe para terminar Nginx y taskkill /f /im php-cgi.exe para terminar PHP CGI.

El siguiente script the batch lo hice con ayuda de ChatGPT y le hice algunas correcciones para que corriera.

No sé tanto sobre batch como podría pensar al ver este archivo de todas maneras el archivo es lo suficientemente entendible, tenemos 2 etiquetas :terminate_services y :main, todos los REM son comentarios, start es para iniciar un comando, etc.

Con «goto» irá a la etiqueta designada, aunque parezca una buena idea, no haga esto en los lenguajes de programación o terminarás con un código espagueti.

archivo.bat
@echo off

:main
REM Start Nginx
start "Nginx" nginx.exe

REM Start PHP-CGI
start "PHP-CGI" "C:\tools\php83\php-cgi.exe" -b 127.0.0.1:9000

REM Wait for user input to stop services
set /p input=Enter 'exit' to stop services: 
if /I "%input%"=="exit" goto :terminate_services

goto :main

:terminate_services
REM Kill PHP-CGI task
taskkill /f /im php-cgi.exe
echo PHP-CGI has been stopped.

REM Kill Nginx task
taskkill /f /im nginx.exe
echo Nginx has been stopped.

exit /b
Category: php
Something wrong? If you found an error or mistake in the content you can contact me on Twitter | @luisg2249_luis.
Last 4 post in same category