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.
Instalación de 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 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.
#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
C:/Users/luisg/Nginx/html
, estoy seguro de que puede que te funcione conhtml
o/html