Strona Astro na własnym VPS: nginx i wdrożenie bez przestoju
Build Astro, katalogi wydań z atomową podmianą dowiązania, nginx z kompresją i nagłówkami cache, cofnięcie wdrożenia jedną komendą. Ubuntu 24.04 i Debian.
Redakcja serwisu Dealownia · ceny i fakty ze stron dostawców, jak sprawdzamy
Statyczna strona Astro na własnym VPS, wdrażana jednym skryptem: każde wdrożenie trafia do osobnego katalogu, a strona przełącza się na nową wersję w jednej operacji, bez okna, w którym część plików jest stara, a część nowa. Cofnięcie do poprzedniej wersji to jedna komenda. nginx wyśle pliki skompresowane, a przeglądarki będą trzymać w pamięci podręcznej to, co się nie zmienia.
Czego potrzebujesz
- VPS z Ubuntu 24.04 LTS albo Debianem 12 lub 13, z nginx i certyfikatem Let’s Encrypt – przygotowany jak w poradniku od zera. Strona statyczna nie potrzebuje dużego serwera: wystarczy najmniejszy plan z 1 vCPU i 1 GB RAM.
- Projekt Astro bez renderowania na serwerze (domyślny tryb statyczny). Astro wymaga Node.js w wersji LTS – dokładną minimalną wersję podaje dokumentacja instalacji Astro.
- Na swoim komputerze:
bash,sshirsync(na Windowsie najprościej w WSL).rsyncmusi być też na serwerze:sudo apt install -y rsync. - Konto
deployna serwerze, na które logujesz się kluczem SSH.
Plany z parametrami porównasz w rankingu VPS.
Krok 1. Build lokalnie
W astro.config.mjs ustaw adres strony – Astro używa go do adresów kanonicznych i mapy strony:
Domyślnie build.format to 'directory' (każda strona to katalog z index.html), a wynik trafia do dist/. Zbuduj i sprawdź, czy jest strona główna i strona błędu:
404.html powstanie, jeśli masz plik src/pages/404.astro. Bez niego nginx pokaże swoją domyślną stronę błędu.
Budować możesz na swoim komputerze (jak w tym poradniku) albo na serwerze po każdym pushu do repozytorium. Drugi sposób wymaga Node.js na VPS-ie i trochę pamięci na czas budowania, ale nie zależy od tego, z którego komputera wdrażasz. Jeśli budujesz na serwerze, publikuj wydanie dopiero po udanym buildzie i testach – nieudany build zostawi wtedy w sieci poprzednią wersję. Zasada katalogów wydań z kolejnych kroków działa tak samo w obu wariantach.
Krok 2. Katalogi wydań na serwerze
Każde wdrożenie dostaje katalog z datą, a nginx czyta zawsze dowiązanie current:
Przygotuj strukturę:
Dlaczego nie rsync prosto do katalogu strony? Kopiowanie trwa kilka sekund i w tym czasie odwiedzający może dostać nowy HTML ze starymi plikami CSS albo odwrotnie. Astro nadaje plikom w /_astro/ nazwy z hashem, więc stary HTML wskazujący na usunięty plik oznacza stronę bez stylów.
Krok 3. Konfiguracja nginx
W bloku server dla HTTPS (ten, który certbot uzupełnił o certyfikat) ustaw:
Co tu się dzieje:
no-cachedla HTML nie wyłącza pamięci podręcznej. Przeglądarka trzyma plik, ale przed użyciem pyta serwer, czy się zmienił (nginx odpowiada304, jeśli nie). Dzięki temu po wdrożeniu nikt nie zobaczy starej wersji./_astro/na rok zimmutable– nazwa pliku zmienia się razem z treścią, więc stary plik nigdy nie dostanie nowej zawartości. Modyfikator^~jest potrzebny: bez niego nginx wybrałby dla obrazków i fontów z/_astro/blok z wyrażeniem regularnym (7 dni), bo wyrażenia regularne mają pierwszeństwo przed zwykłym prefiksem.- Obrazki i fonty na 7 dni – rozsądny kompromis dla plików z
public/, które nie mają hasha w nazwie. Rozsądny zestaw: HTMLno-cache,/_astro/rok, plikijson,xmlitxt(sitemapy,robots.txt) godzinę, reszta statyki 7 dni. gzip_types–text/htmlnginx kompresuje zawsze, resztę trzeba wymienić.gzip_vary ondodaje nagłówekVary: Accept-Encodingdla pośredników.
Uwaga na pułapkę z dokumentacji nginx: add_header z bloku nadrzędnego jest dziedziczony tylko wtedy, gdy w bieżącym bloku nie ma żadnego add_header. Jeśli ustawiasz nagłówki bezpieczeństwa (HSTS, X-Content-Type-Options) na poziomie server, w każdym location z własnym add_header musisz je powtórzyć – najwygodniej przez include wspólnego pliku.
Sprawdź i przeładuj:
Krok 4. Skrypt wdrożenia
Zapisz w projekcie jako deploy.sh:
Trzy szczegóły, które robią różnicę:
ln -sfn+mv -Tf. Samoln -sfnusuwa stare dowiązanie i tworzy nowe – przez ułamek sekundycurrentnie istnieje. Zmiana nazwy (mv -T, czylirename) podmienia dowiązanie w jednej operacji systemu plików.--link-destsprawia, że pliki, które się nie zmieniły, są twardymi dowiązaniami do poprzedniego wydania – nie zajmują drugi raz miejsca i nie lecą przez sieć.gzip -k -9zostawia oryginał i tworzy obok.gz. Modułgzip_staticwyśle gotowy plik zamiast kompresować przy każdym żądaniu. Według dokumentacji nginx ten moduł nie jest wbudowany domyślnie; sprawdź, czy Twój pakiet go ma:nginx -V 2>&1 | grep -o with-http_gzip_static_module. Jeśli nie ma, usuńgzip_static on– zostanie zwykła kompresja w locie.
Krok 5. Cofnięcie wdrożenia
Lista wydań i powrót do poprzedniego:
nginx nie wymaga przeładowania – przy każdym żądaniu rozwiązuje ścieżkę na nowo. Wyjątek: jeśli włączyłeś open_file_cache, stara ścieżka może być używana do czasu wygaśnięcia wpisów.
Jeśli wdrożenia idą automatycznie z repozytorium, po ręcznym cofnięciu wycofaj też zmianę w repozytorium. Jeśli serwer buduje stronę po każdym pushu, bez tego następne wdrożenie przywróci błąd.
Krok 6. Sprawdzenie nagłówków
Oczekujesz 200, cache-control: no-cache dla strony, content-encoding: gzip przy drugim zapytaniu i max-age=31536000, immutable dla pliku z /_astro/.
Najczęstsze problemy
- Podstrony bez ukośnika na końcu zwracają 404. Brakuje
$uri/index.htmlwtry_filesalbo strona mabuild.format: 'file'. Przy formacie katalogowym zostawtry_filesjak w kroku 3. - Po wdrożeniu strona jest bez stylów. HTML z przeglądarki albo CDN wskazuje na plik z
/_astro/, którego już nie ma. Sprawdź, czy HTML mano-cache, a nie długimax-age– długi cache wolno dawać tylko plikom z hashem w nazwie. - Nagłówek HSTS zniknął z części odpowiedzi. To dziedziczenie
add_headeropisane w kroku 3. Powtórz nagłówki w każdymlocationz własnymadd_header. Permission deniedprzyrsyncalbo 403 z nginx. Katalog wydania należy do innego użytkownika albo nginx (www-data) nie może go czytać.ls -ld /var/www/example.pl/releases/*– katalogi powinny mieć prawa755, pliki644.- Dysk się zapełnia. Sprzątanie w skrypcie zostawia trzy najnowsze wydania. Jeśli wróciłeś ręcznie do starszego wydania, sprawdź przed sprzątaniem, czy
currentnie wskazuje na katalog spoza tej trójki.
Co dalej
Strona statyczna jest odtwarzalna z repozytorium, ale konfiguracja nginx i certyfikaty już nie – ustaw kopie zapasowe poza serwerem i monitoring z alertami. Jeśli przenosisz stronę ze zwykłego hostingu, zobacz migrację na VPS bez przestoju. Serwer pod kilka stron znajdziesz w dziale promocje: VPS.