Estoy tratando de configurar una aplicación web php usando docker. La idea es ejecutar la aplicación usando php-fpm
un contenedor independiente y tener otro contenedor que ejecute nginx. La idea para esta configuración es usar ese mismo contenedor nginx para enviar solicitudes de proxy a otras aplicaciones web que ya están trabajando en la misma máquina. El problema es que no puedo nginx
procesar correctamente los archivos estáticos (js, css, etc.), ya que las solicitudes a esos continúan fpm
.
Así es como se ve el sistema de archivos:
/
├── Makefile
├── config
│ └── webapp.config
└── webapp
└── web
├── index.php
└── static.js
Estoy ejecutando todo usando un Makefile
aspecto similar a este (no estoy interesado en docker-compose
esto):
PWD:=$(shell pwd)
CONFIG:='/config'
WEBAPP:='/webapp'
run: | run-network run-webapp run-nginx
run-network:
docker network create internal-net
run-webapp:
docker run --rm \
--name=webapp \
--net=internal-net \
--volume=$(PWD)$(WEBAPP):/var/www/webapp:ro \
-p 9000:9000 \
php:5.6.22-fpm-alpine
run-nginx:
docker run --rm \
--name=nginx \
--net=internal-net \
--volume=$(PWD)$(CONFIG)/webapp.conf:/etc/nginx/conf.d/webapp.domain.com.conf:ro \
-p 80:80 \
nginx:1.11.0-alpine
Así es config/webapp.conf
como se ve mi .
server {
listen 80;
server_name webapp.domain.com;
# This is where the index.php file is located in the webapp container
# This folder will contain an index.php file and some static files that should be accessed directly
root /var/www/webapp/web;
location / {
try_files $uri $uri/ @webapp;
}
location @webapp {
rewrite ^(.*)$ /index.php$1 last;
}
location ~ ^/index\.php(/|$) {
include fastcgi_params;
fastcgi_pass webapp:9000;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTPS off;
}
}
Cualquier acción que necesite procesarse usando ese index.php
archivo funcionará. Sin embargo, los archivos estáticos no se servirán, lo que provocará 404
errores desagradables (ya que la aplicación web php realmente no tiene rutas configuradas para esos). Creo que nginx intenta cargarlos desde su propio sistema de archivos contenedor, cuando realmente están en el webapp
contenedor, fallando nuevamente @webapp
.
¿Hay alguna forma de configurarlo nginx
para servir esos archivos que residen en otro contenedor?
fuente
nginx
archivos de solicitud dentro de la aplicación php, estoy proxfpm
para hacerlo y necesitonginx
acceder a archivos estáticos no php.webapp
contenedor, no en elnginx
uno.Respuestas:
Logré resolver el problema montando el
webapp
volumen en elnginx
contenedor. Así esrun-nginx
como se ve el trabajo ahora:Y este es el
webapp.conf
archivo, que intentará cargar los archivos estáticos del contenedor y, si eso no es posible, enviará la solicitud alfpm
trabajador:Sin embargo, me gustaría saber si hay una mejor manera de hacerlo en lugar de compartir el mismo volumen dos veces. ¡Muchas gracias!
fuente
Quizás esto se pueda lograr usando NFS
Se podría hacer un contenedor de docker que ejecute NFS donde reside el código, que se podría vincular a los contenedores que ejecutan nginx y php. Los archivos se almacenarían en un solo contenedor. Esto también podría proporcionar otra capa de aislamiento.
fuente
Tengo dos opciones sugeridas: la primera es poner sus activos estáticos en eg / static e indicar a nginx que llame a un servicio back-end diferente para ellos. Pasos:
1) Actualice sus sitios web para que apunten a / static / * para cualquier activo estático, por ejemplo, /styles.css se convierte en /static/styles.css
2) Coloque sus activos en un contenedor separado servido por quizás otro nginx (para que pueda reutilizar el contenedor para varios sitios)
3) Edite nginx.conf para enviar todas las solicitudes a / static / * al nuevo contenedor:
La segunda opción es simplemente mover sus activos estáticos a un CDN, por lo que solo necesita actualizar su sitio web para cargar cada activo estático desde una URL externa ( https: //cdnwebsite/asdsadasda/styles.css en lugar de /styles.css o /static/styles.css)
La segunda opción tiene varias ventajas sobre las demás, principalmente en torno al rendimiento. Un CDN los servirá más rápido y también está trabajando alrededor del límite de conexión simultánea que un navegador puede establecer para cada FQDN, por lo que su página podría cargar más rápido debido a que se utilizan más conexiones simultáneas para cargar su sitio.
fuente