WordPress en Azure App Service no puede leer archivos a través de un enlace simbólico

7 minutos de lectura

Avatar de usuario de Oskar Persson
oskar persson

He configurado un proyecto de WordPress en contenedores como Azure App Service basado en el imagen oficial de WordPress Docker donde no he realizado modificaciones a la imagen en sí, aparte de agregar un servidor SSH según las instrucciones dadas por Azur. Así es como se ve el Dockerfile:

FROM wordpress:6.0.3-php7.4

########################################## Add SSH support for Azure ##########################################
# Install OpenSSH and set the password for root to "Docker!".
RUN apt update \
    && apt install -y openssh-server \
    && rm -rf /var/lib/apt/lists/*

RUN echo "root:Docker!" | chpasswd

# Copy the sshd_config file to the /etc/ssh/ directory
COPY docker/ssh/sshd_config /etc/ssh/

# Copy and configure the ssh_setup file
RUN mkdir -p /tmp
COPY docker/ssh/ssh_setup.sh /tmp
RUN chmod +x /tmp/ssh_setup.sh \
    && (sleep 1;/tmp/ssh_setup.sh 2>&1 > /dev/null)

# Open port 2222 for SSH access
EXPOSE 80 2222
###############################################################################################################

COPY docker/script.sh script.sh
RUN chmod +x script.sh
CMD []
ENTRYPOINT ["./script.sh"]

Y docker/script.sh

#!/bin/bash
exec service ssh start &
exec /usr/local/bin/docker-entrypoint.sh apache2-foreground

En el servicio de aplicaciones, he agregado el WEBSITES_ENABLE_APP_SERVICE_STORAGE=true configuración de la aplicación para habilitar almacenamiento persistente así como establecer la WORDPRESS_DB_HOST, WORDPRESS_DB_NAME, WORDPRESS_DB_PASSWORD y WORDPRESS_DB_USER configuración para conectarme a mi base de datos que se ejecuta en otro host.

Al acceder a la página del servicio de la aplicación en el navegador y pasar por la configuración de WordPress, puedo cargar fácilmente nuevos archivos que se colocan en el sistema de archivos en /var/www/html/wp-content/uploads/<year>/<month>/<filename> al que luego puedo acceder en mi navegador en https://my-app-service.azurewebsites.net/wp-content/uploads/<year>/<month>/<filename>.

Con Azure solo datos persistentes escritos en /home En cambio, traté de mover el /var/www/html/wp-content/uploads directorio a /home/uploads y luego cree un enlace simbólico a esto desde la ruta esperada así (la creación del enlace simbólico también podría agregarse al Dockerfile para automatizar esto durante la implementación):

$ cd /var/www/html/wp-content
$ mv uploads /home/uploads
$ ln -s /home/uploads uploads

Ahora, sin embargo, cuando accedo https://my-app-service.azurewebsites.net/wp-content/uploads/<year>/<month>/<filename> Acabo de recibir una respuesta vacía de 400.

Para ver si esto era algún tipo de limitación de Azure, decidí probar algo similar con la página de Python más simple. archivo acoplable:

FROM python:3.10.0
RUN mkdir -p /var/www/html
WORKDIR /var/www/html

########################################## Add SSH support for Azure ##########################################
# Install OpenSSH and set the password for root to "Docker!".
RUN apt update \
    && apt install -y openssh-server \
    && rm -rf /var/lib/apt/lists/*

RUN echo "root:Docker!" | chpasswd

# Copy the sshd_config file to the /etc/ssh/ directory
COPY docker/ssh/sshd_config /etc/ssh/

# Copy and configure the ssh_setup file
RUN mkdir -p /tmp
COPY docker/ssh/ssh_setup.sh /tmp
RUN chmod +x /tmp/ssh_setup.sh \
    && (sleep 1;/tmp/ssh_setup.sh 2>&1 > /dev/null)

# Open port 2222 for SSH access
EXPOSE 80 2222
###############################################################################################################

COPY docker/script.sh script.sh
RUN chmod +x script.sh
CMD []
ENTRYPOINT ["./script.sh"]

Y ventana acoplable/script.sh

#!/bin/bash
exec service ssh start &
exec python -m http.server 80

Hacer lo mismo aquí funciona, por lo que no parece ser una limitación con Azure. Sin embargo, lo que no entiendo es que la imagen de la ventana acoplable de WordPress con el enlace simbólico funciona como se esperaba ejecutándose en mi máquina local.

¿Qué estoy haciendo mal? ¿Por qué funciona el proyecto de Python pero no el de WordPress?

  • Por favor, ¿la aplicación o App Service reporta algún error? Probablemente, el error podría estar relacionado con algún tipo de problema de permisos, incluso una mala función del enlace simbólico (honestamente, no puedo decirle si realmente es compatible o no en este caso de uso). Mi mejor consejo es usar almacenamiento azul basado en Azure Files en lugar de almacenar su información de carga o evento todo su /var/www/html contenido.

    – jccampanero

    el dia de ayer

  • No he podido encontrar ningún registro que contenga errores o advertencias. ¿Tienes alguna idea de dónde podría encontrar esto? He considerado usar Azure Storage; sin embargo, preferiría no hacerlo, ya que es otro costo y ya tengo 250 gb de almacenamiento con mi plan App Servive que me gustaría usar para esto.

    – Oskar Personson

    el dia de ayer


  • Lo entiendo, Oskar, está perfectamente bien. Probablemente podría acceder a los registros usando SSH como lo configuró. Además, podrías usar CLI de Azure para acceder a la información de registro. No estoy seguro de eso, pero probablemente también podría usar Kudu para acceder a la información de registro del contenedor (por favor, intente esto primero). Consulte esta pregunta SO relacionada. Espero que ayude.

    – jccampanero

    el dia de ayer

  • ¿Has probado chown/chmod el /home/uploads carpeta para ser legible/escribible por su servidor web y usuario PHP Linux? ¿Puede verificar su configuración de Apache/Nginx para la opción “seguir enlace simbólico” y si root/rules permite que se sirva esta carpeta? ¿Tiene algo personalizado en htaccess que pueda impedir el acceso? Cuando carga desde WP, el archivo se crea y es correcto, pero no se puede acceder a él desde HTTP, ¿verdad? Pruebe un archivo txt simple con chmod y verifique las configuraciones de nginx/apache/htaccess/permissions.

    – Mtxz

    Hace 19 horas

  • @Mtxz Probé chown/chmod el directorio /home/uploads pero no parece tener ningún efecto. También intenté cambiar la configuración de Apache agregando la opción FollowSymlink pero esto tampoco hace nada. Es posible que haya varios archivos de configuración en los que necesito hacer esto, pero no estoy seguro de cuáles en ese caso. Todo se mantiene como está escrito en el Dockerfile, no se realiza ninguna otra configuración. Puede encontrar el código fuente de la imagen base (wordpress:6.0.3-php7.4) aquí github.com/docker-library/wordpress/tree/master/latest/php7.4/…

    – Oskar Personson

    hace 16 horas

Lo resolvió agregando un Alias ​​en lugar de un enlace simbólico y deshabilitar MMAP:

docker/extra.conf:

Alias /wp-content/uploads/ "/home/uploads/"
<Directory "/home/uploads/">
        Options Indexes MultiViews
        AllowOverride None
        Require all granted
</Directory>

<Directory "/home/uploads">
  EnableMMAP Off
</Directory>

docker/script.sh

#!/bin/bash
exec service ssh start &
exec /usr/local/bin/docker-entrypoint.sh apache2-foreground

Dockerfile

FROM wordpress:6.0.3-php7.4

########################################## Add SSH support for Azure ##########################################
# Install OpenSSH and set the password for root to "Docker!".
RUN apt update \
    && apt install -y openssh-server \
    && rm -rf /var/lib/apt/lists/*

RUN echo "root:Docker!" | chpasswd

# Copy the sshd_config file to the /etc/ssh/ directory
COPY docker/ssh/sshd_config /etc/ssh/

# Copy and configure the ssh_setup file
RUN mkdir -p /tmp
COPY docker/ssh/ssh_setup.sh /tmp
RUN chmod +x /tmp/ssh_setup.sh \
    && (sleep 1;/tmp/ssh_setup.sh 2>&1 > /dev/null)

# Open port 2222 for SSH access
EXPOSE 80 2222
###############################################################################################################

COPY docker/apache/extra.conf /etc/apache2/extra.conf
RUN cat /etc/apache2/extra.conf >> /etc/apache2/apache2.conf

COPY docker/script.sh /usr/local/bin/script.sh
RUN chmod +x /usr/local/bin/script.sh
CMD []
ENTRYPOINT ["/usr/local/bin/script.sh"]

  • Ah, es por el almacenamiento nfs, está bien

    – Slava Kuravski

    hace 11 horas


  • Estoy muy feliz de ver que pudiste resolver el problema Oskar.

    – jccampanero

    Hace 6 horas


Debe cambiar la configuración del servidor web apache para que pueda seguir enlaces simbólicos:

<VirtualHost *:80>
    DocumentRoot /var/www
    <Directory />
        Options FollowSymLinks
        AllowOverride None
    </Directory>

  • ¿En qué archivo debo hacer esto? Tenga en cuenta que estoy usando la imagen acoplable wordpress: 6.0.3-php7.4.

    – Oskar Personson

    hace 15 horas

  • La configuración principal está en /etc/apache2/apache2.confpero creo que necesitas modificar /etc/apache2/conf-available/docker-php.conf

    – Slava Kuravski

    hace 15 horas


  • yo actualice /etc/apache2/conf-available/docker-php.conf a lo siguiente pero no tuvo ningún efecto: SetHandler application/x-httpd-php DirectoryIndex disabled DirectoryIndex index.php index.html Opciones – Índices +FollowSymLinks AllowOverride All

    – Oskar Personson

    hace 14 horas

  • Tal vez los directorios no coincidan. Intente crear un enlace en /var/www para probar. También puede intentar cambiar la configuración a

    – Slava Kuravski

    hace 14 horas


  • eso tampoco funciono

    – Oskar Personson

    hace 14 horas

¿Ha sido útil esta solución?