Z użyciem serwera NGINX skonfigurowałem reverse proxy dla usługi działającej na adresie 127.0.0.1:8080 (kontener Docker z aplikacją). Dzięki temu lokalny serwis jest dostępny z zewnątrz pod domeną app.avlab.pl. Inny administrator skonfigurował zasób SFTP dla klienta kierujący na katalog /home/www/NAZWA_KLIENTA/media. Przesłane pliki powinny być dostępne (wylistowane) pod adresem https://app.avlab.pl/media, ale zamiast tego widoczna jest strona logowania aplikacji lub następuje przekierowanie do strony https://app.avlab.pl/user. Programista nie chciałby dodawać obsługi listowania jako funkcjonalności. Jak rozwiązać ten problem?
Apr 14, 7:22am

Problem polega na tym, że NGINX nie jest skonfigurowany do obsługi statycznych plików z katalogu /home/www/NAZWA_KLIENTA/media pod ścieżką /media. Obecnie wszystkie żądania (w tym te do /media) są przekazywane do aplikacji działającej na 127.0.0.1:8080, która nie obsługuje listowania plików i przekierowuje do strony logowania.


Rozwiązanie: Konfiguracja NGINX do obsługi statycznych plików

Trzeba dodać nową lokalizację (location) w konfiguracji NGINX, która będzie obsługiwała żądania do /media bezpośrednio z systemu plików, zamiast przekazywania ich do aplikacji.

1. Edycja pliku konfiguracyjnego NGINX

Otwórz plik konfiguracyjny NGINX (np. /etc/nginx/sites-available/app.avlab.pl lub /etc/nginx/conf.d/app.conf) i dodaj następującą sekcję wewnątrz bloku server dla domeny app.avlab.pl:

nginx
server {
    listen 80;
    listen [::]:80;
    server_name app.avlab.pl;

    # ... (istniejąca konfiguracja SSL, jeśli jest używana)

    # Obsługa statycznych plików dla /media
    location /media/ {
        alias /home/www/NAZWA_KLIENTA/media/;
        autoindex on;  # Włącz listowanie katalogów (opcjonalnie)
        try_files $uri =404;
    }

    # Przekierowanie pozostałych żądań do aplikacji Docker
    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Wyjaśnienie:

  • location /media/: Definiuje, że wszystkie żądania zaczynające się od /media/ będą obsługiwane przez NGINX, a nie przekazywane do aplikacji.
  • alias /home/www/NAZWA_KLIENTA/media/: Mapuje ścieżkę /media na fizyczny katalog na serwerze.
  • autoindex on;: Włącza listowanie plików w katalogu (jeśli chcesz, aby użytkownicy widzieli listę plików). Możesz to pominąć, jeśli nie jest potrzebne.
  • try_files $uri =404;: Sprawdza, czy plik istnieje. Jeśli nie, zwraca błąd 404.

2. Sprawdzenie poprawności konfiguracji

Przed restartem NGINX sprawdź, czy konfiguracja jest poprawna:

bash
sudo nginx -t

Jeśli nie ma błędów, zrestartuj NGINX:

bash
sudo systemctl restart nginx

3. Uprawnienia do katalogu

Upewnij się, że:

  • Katalog /home/www/NAZWA_KLIENTA/media istnieje.
  • Użytkownik, pod którym działa NGINX (zwykle www-data lub nginx), ma uprawnienia do odczytu tego katalogu:
    bash
    sudo chown -R www-data:www-data /home/www/NAZWA_KLIENTA/media
    sudo chmod -R 755 /home/www/NAZWA_KLIENTA/media

4. Testowanie

  • Przesłany plik (np. test.jpg) powinien być dostępny pod:
    https://app.avlab.pl/media/test.jpg
  • Jeśli autoindex jest włączony, lista plików powinna być widoczna pod:
    https://app.avlab.pl/media/

Alternatywa: Symlink (jeśli aplikacja obsługuje statyczne pliki)

Jeśli aplikacja w kontenerze Docker może obsługiwać statyczne pliki, możesz zamiast tego:

  1. Utworzyć symlink z katalogu aplikacji do /home/www/NAZWA_KLIENTA/media:
    bash
    ln -s /home/www/NAZWA_KLIENTA/media /path/do/katalogu/aplikacji/static/media
  2. Skonfigurować aplikację, aby obsługiwała /media jako statyczne pliki.

Podsumowanie

  • Najprostsze rozwiązanie: Dodaj location /media/ w NGINX i ustaw alias na katalog SFTP.
  • Sprawdź uprawnienia i zrestartuj NGINX.
  • Testuj dostępność plików pod https://app.avlab.pl/media/.

Czy masz dostęp do pliku konfiguracyjnego NGINX, aby wprowadzić te zmiany?

Apr 14, 7:22am

This is a shared conversation and may include unverified content that doesn't reflect Mistral AI's views. Login to resume chatting.