WordPress in Azure App Service kann Dateien über symbolischen Link nicht lesen

Lesezeit: 7 Minuten

Benutzeravatar von Oskar Persson
Oskar Persson

Ich habe ein containerisiertes WordPress-Projekt als Azure App Service basierend auf dem eingerichtet offizielles WordPress-Docker-Image wobei ich keine Änderungen am Image selbst vorgenommen habe, außer einen SSH-Server basierend auf den Anweisungen von hinzuzufügen Azurblau. So sieht das Dockerfile aus:

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"]

Und docker/script.sh

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

Auf dem App Service habe ich die hinzugefügt WEBSITES_ENABLE_APP_SERVICE_STORAGE=true Anwendungseinstellung zu aktivieren Dauerspeicher sowie die einstellen WORDPRESS_DB_HOST, WORDPRESS_DB_NAME, WORDPRESS_DB_PASSWORD und WORDPRESS_DB_USER Einstellungen, um eine Verbindung zu meiner Datenbank herzustellen, die auf einem anderen Host ausgeführt wird.

Wenn ich im Browser auf die App-Service-Seite zugreife und das WordPress-Setup durchlaufe, kann ich problemlos neue Dateien hochladen, die im Dateisystem unter abgelegt werden /var/www/html/wp-content/uploads/<year>/<month>/<filename> auf die ich dann in meinem Browser zugreifen kann https://my-app-service.azurewebsites.net/wp-content/uploads/<year>/<month>/<filename>.

Mit Azure werden nur Daten gespeichert, die hineingeschrieben werden /home Ich habe stattdessen versucht, die zu verschieben /var/www/html/wp-content/uploads Verzeichnis zu /home/uploads und erstellen Sie dann einen symbolischen Link zu diesem aus dem erwarteten Pfad wie folgt (die symbolische Linkerstellung könnte dann auch zur Dockerfile hinzugefügt werden, um dies während der Bereitstellung zu automatisieren):

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

Jetzt aber, wenn ich zugreife https://my-app-service.azurewebsites.net/wp-content/uploads/<year>/<month>/<filename> Ich bekomme nur eine leere 400-Antwort.

Um zu sehen, ob dies eine Art Einschränkung von Azure war, entschied ich mich, stattdessen etwas Ähnliches mit der einfachsten Python-Seite zu versuchen. Dockerdatei:

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"]

Und docker/script.sh

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

Das Gleiche funktioniert hier, daher scheint es bei Azure keine Einschränkung zu geben. Was ich jedoch nicht verstehe, ist, dass das WordPress-Docker-Image mit dem symbolischen Link wie erwartet auf meinem lokalen Computer ausgeführt wird.

Was mache ich falsch? Warum funktioniert das Python-Projekt, aber nicht das WordPress-Projekt?

  • Bitte, meldet die Anwendung oder der App Service irgendwelche Fehler? Wahrscheinlich könnte der Fehler mit einer Art Berechtigungsproblem zusammenhängen, sogar mit einer schlechten Funktion des Symlinks (ehrlich gesagt kann ich Ihnen nicht sagen, ob es in diesem Anwendungsfall tatsächlich unterstützt wird oder nicht). Mein bester Rat ist die Verwendung Azure-Speicher basiert stattdessen auf Azure Files, um Ihre Upload-Informationen zu speichern oder Ihre gesamten Daten zu speichern /var/www/html Inhalt.

    – jccampanero

    25. Oktober um 21:30 Uhr

  • Ich konnte keine Protokolle mit Fehlern oder Warnungen finden. Hast du eine Idee, wo ich das finden könnte? Ich habe überlegt, Azure Storage zu verwenden, würde es aber vorziehen, da dies weitere Kosten sind und ich mit meinem App Servive-Plan bereits 250 GB Speicherplatz erhalte, den ich dafür verwenden möchte.

    – Oskar Persson

    25. Oktober um 21:40 Uhr


  • Ich verstehe Oskar, es ist vollkommen in Ordnung. Wahrscheinlich könnten Sie mit SSH auf die Protokolle zugreifen, wie Sie es konfiguriert haben. Darüber hinaus könnten Sie verwenden Azure-CLI um auf die Protokollinformationen zuzugreifen. Ich bin mir da nicht sicher, aber wahrscheinlich könnten Sie Kudu auch für den Zugriff auf die Containerprotokollinformationen verwenden (bitte versuchen Sie dies zuerst). Siehe diese verwandte SO-Frage. Ich hoffe, es hilft.

    – jccampanero

    25. Oktober um 21:49 Uhr

  • Hast du mal chown/chmod probiert /home/uploads Ordner, der von Ihrem Webserver und PHP-Linux-Benutzer gelesen/beschrieben werden kann? Können Sie Ihre Apache/Nginx-Konfiguration auf die Option „Symlink folgen“ überprüfen und ggf root/rules darf dieser Ordner bedient werden? Haben Sie in htaccess etwas benutzerdefiniertes, das den Zugriff verhindern könnte? Wenn Sie von WP hochladen, wird die Datei erstellt und ist korrekt, aber nicht über HTTP zugänglich, oder? Versuchen Sie es mit einer einfachen txt-Datei mit chmod und überprüften nginx/apache/htaccess/permissions-Konfigurationen.

    – Mtxz

    26. Oktober um 2:49 Uhr

  • @Mtxz Ich habe chown/chmod im Verzeichnis /home/uploads ausprobiert, aber es scheint überhaupt keine Wirkung zu haben. Ich habe auch versucht, die Apache-Konfiguration zu ändern, indem ich die FollowSymlink-Option hinzugefügt habe, aber auch das bringt nichts. Es ist möglich, dass es mehrere Konfigurationsdateien gibt, in denen ich dies tun muss, aber ich bin mir nicht sicher, welche in diesem Fall. Alles bleibt so wie es im Dockerfile steht, es wird keine andere Konfiguration vorgenommen. Den Quellcode des Basisimages (wordpress:6.0.3-php7.4) finden Sie hier github.com/docker-library/wordpress/tree/master/latest/php7.4/…

    – Oskar Persson

    26. Oktober um 6:14 Uhr

Gelöst, indem ein Alias ​​anstelle eines symbolischen Links hinzugefügt wurde und MMAP deaktivieren:

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 liegt am NFS-Speicher, in Ordnung

    – Slava Kuravsky

    26. Oktober um 10:32 Uhr


  • Es freut mich sehr zu sehen, dass du das Problem Oskar lösen konntest.

    – jccampanero

    26. Oktober um 16:15 Uhr


Sie müssen die Konfiguration des Apache-Webservers so ändern, dass er symbolischen Links folgen kann:

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

  • In welcher Datei soll ich das machen? Beachten Sie, dass ich das Docker-Image wordpress:6.0.3-php7.4 verwende.

    – Oskar Persson

    26. Oktober um 7:09 Uhr

  • Die Hauptkonfiguration ist drin /etc/apache2/apache2.confaber ich denke, Sie müssen ändern /etc/apache2/conf-available/docker-php.conf

    – Slava Kuravsky

    26. Oktober um 7:22 Uhr


  • Ich habe aktualisiert /etc/apache2/conf-available/docker-php.conf zu folgendem, aber es hatte keine Auswirkung: SetHandler application/x-httpd-php DirectoryIndex disabled DirectoryIndex index.php index.html Options – Indizes +FollowSymLinks AllowOverride All

    – Oskar Persson

    26. Oktober um 7:44 Uhr

  • Vielleicht stimmen die Verzeichnisse nicht überein. Versuchen Sie, zum Testen einen Link in /var/www zu erstellen. Sie können auch versuchen, die Konfiguration in zu ändern

    – Slava Kuravsky

    26. Oktober um 8:14 Uhr


  • Das hat auch nicht funktioniert

    – Oskar Persson

    26. Oktober um 8:19 Uhr

1435020cookie-checkWordPress in Azure App Service kann Dateien über symbolischen Link nicht lesen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy