Instalacja i konfiguracja nginxa ze wsparciem wielu domen

Poradniki
vps, www
anon10657637
anon10657637

Dobra, bez zbędnego gadania - zaczynamy. Poradnik testowałem na wersji Ubuntu 14.04 LTS, ale na innych wersjach GNU/Linux raczej zadziała, mogą niekiedy się różnić polecenia ;)

1. Instalacja nginxa

Więc tak, wpierw może zalogujmy się na roota:

sudo su

a potem zainstalujmy nginxa:

apt-get install nginx

Gotowe, nginx śmiga. Wejdź na adres swojego serwera VPS, zobaczysz na własne oczy.

2. Konfiguracja nginxa

No to co, przejdźmy może sobie do głównego katalogu nginxa:

cd /etc/nginx/

a następnie do katalogu gdzie będziemy konfigurować nasze domeny:

cd sites-enabled

Jeżeli w tym folderze znajdziesz znajdziesz jakieś pliki - możesz je usunąć, nic się nie dzieje - i tak będziemy je tworzyć na nowo.

2.1. Domyślna strona główna dla nieobsługiwanych domen

Dobra, utwórzmy sobie plik, dajmy na to o nazwie default (bez rozszerzenia, na co to komu). Następnie wprowadź do niego takową zawartość:

server {
    listen 80 default_server;

    location / {
        return 403;
    }
}

Jak pewnie widzisz po konfiguracji, która jest swoją drogą prosta, serwer przeznaczony dla wszystkich nieobsługiwanych domen nasłuchuje na porcie 80 (HTTP), i nie ważne gdzie by przeszedł, zawsze będzie pokazywał błąd 403. Jak już wprowadzisz zawartość, zapisz plik.

2.2. Dodanie obsługi danej domeny

Załóżmy, mamy domenę example.com i chcemy ją skonfigurować - proszę bardzo, daje uniwersalny wzorzec ;) Więc tak, skopiuj plik z domyślna konfiguracją nginxa (tutaj: default) i nazwij tak jak chcesz - ja dla klarowności nazwę example.com:

server {
    listen 80;

    location / {
        return 403;
    }
}

Dobra, zdefiniujmy sobie teraz, gdzie maja leżeć pliki naszej strony:

server {
    listen 80;

    root /var/www/example.com/html;

    location / {
        return 403;
    }
}

Tutaj ustawiłem dla ścieżki /var/www/example.com/html. Następnie, ustawmy na jakie domeny ma nasz serwer HTTP reagować:

server {
    listen 80;

    root /var/www/example.com/html;
    server_name example.com www.example.com;

    location / {
        return 403;
    }
}

Jak pewnie widzisz, w server_name podałem więcej niż jedną domenę - oczywiście, jest takowa możliwość ;) Teraz może ustawmy, żeby nie wywalało tego irytującego błędu 403:

server {
    listen 80;

    root /var/www/example.com/html;
    server_name example.com www.example.com;

    location / {
        try_files $uri $uri/ =404;
    }
}

W poleceniu try_files zdefiniowałem, że jeżeli nie wykryje danego pliku, to wywali błąd 404. Oczywiście, możesz ustawić tutaj taki błąd, jaki Ty chcesz. Więcej info znajduje się w tym miejscu 😛 No i na końcu, zdefiniujmy nasz plik index, który znajduje się w katalogu zdefiniowanym w root:

server {
    listen 80;

    root /var/www/example.com/html;
    index index.html index.htm;
    server_name example.com www.example.com;

    location / {
        try_files $uri $uri/ =404;
    }
}

Jak widzisz, plik nie musi się nazywać index, to nie Apache, nie ma po co się ograniczać :kappa:

2.3. Na produkcje!

Upewnijmy się czy konfiguracja nginxa jest w porządku:

nginx -t

a następnie zrestartujmy całość:

service nginx restart

i gotowe!

3. Bonusy

3.1. Prawdziwe adresy ip za usługą CloudFlare

Całość jest opisana tutaj, a poniżej przykład

server {
    listen 80;

    root /var/www/example.com/html;
    index index.html index.htm;
    server_name example.com www.example.com;

    set_real_ip_from 103.21.244.0/22;
    set_real_ip_from 103.22.200.0/22;
    set_real_ip_from 103.31.4.0/22;
    set_real_ip_from 104.16.0.0/12;
    set_real_ip_from 108.162.192.0/18;
    set_real_ip_from 131.0.72.0/22;
    set_real_ip_from 141.101.64.0/18;
    set_real_ip_from 162.158.0.0/15;
    set_real_ip_from 172.64.0.0/13;
    set_real_ip_from 173.245.48.0/20;
    set_real_ip_from 188.114.96.0/20;
    set_real_ip_from 190.93.240.0/20;
    set_real_ip_from 197.234.240.0/22;
    set_real_ip_from 198.41.128.0/17;
    set_real_ip_from 2400:cb00::/32;
    set_real_ip_from 2606:4700::/32;
    set_real_ip_from 2803:f800::/32;
    set_real_ip_from 2405:b500::/32;
    set_real_ip_from 2405:8100::/32;
    set_real_ip_from 2c0f:f248::/32;
    set_real_ip_from 2a06:98c0::/29;

    real_ip_header CF-Connecting-IP;

    location / {
        try_files $uri $uri/ =404;
    }
}

3.2. Własne strony błędów

Można stworzyć własne strony błędów, zamieniając te domyślne z nginxa:

server {
    listen 80;

    root /var/www/example.com/html;
    index index.html index.htm;
    server_name example.com www.example.com;

    error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;
     
    location / {
        try_files $uri $uri/ =404;
    }
}

3.3. SSL

3.3.1. Cloudflare

W ustawieniach domeny starczy dać konfiguracje SSL na Flexible, upewnij się także że dany rekord jest objęty ochroną CloudFlare - symbolizuje to ikonka chmurki.

3.3.2. Własny SSL

server {
    listen 80;
    listen 443;

    ssl on;
    ssl_certificate pem.pem;
    ssl_certificate_key key.key;

    root /var/www/example.com/html;
    index index.html index.htm;
    server_name example.com www.example.com;

    location / {
        try_files $uri $uri/ =404;
    }
}

Jak pewnie widzisz, włączyliśmy dodatkowo nasłuch na porcie 443 (HTTPS). Włączyliśmy funkcję ssl i za pośrednictwem dwóch kolejnych poleceń wskazaliśmy pliki pem i key, które się dostaje przy zakupie certyfikatu SSL.

3.4. Rewrite

Czyli jak używać funkcji znanej w Apache jako mod_rewrite (dzięki @bopke za zauważenie braku tego zagadnienia!). Tutaj znajduje się oficjalny link bloga ekipy odpowiedzialnej za nginxa, gdzie to zagadniene jest dobrze omówione, dzięki czemu nie ma sensu jego przenosić do tego tematu.

Jakieś pytania - coś rozszerzyć lub dopowiedzieć?

bopke
bopke Moderator forum.lvlup.pro

Może do bonusów dałoby radę dorzucić coś na temat odpowiednika mod_userdir z apache2? Z tego co wiem to bezpośredniego odpowiednika nie ma :P

Timo
Timo Moderator forum.lvlup.pro

Fajny, przejrzysty poradnik, ale z apache się nie przesiądę 😂

anon10657637
anon10657637

bopke:

Może do bonusów dałoby radę dorzucić coś na temat odpowiednika mod_userdir z apache2? Z tego co wiem to bezpośredniego odpowiednika nie ma

Gotowe.

Timo:

Fajny, przejrzysty poradnik, ale z apache się nie przesiądę

Kwestia czasu i ruchu jaki kontrolujesz.

LinGruby
LinGruby Pionier

anon10657637:

Więc tak, wpierw może zalogujmy się na roota:

sudo su

małe sprostowanie wystarczy samo su coby się do root 'a dostać ( zalogować )

anon10657637
anon10657637

Okej, warto wiedzieć ;) Mi to polecenie weszło w nawyk. Dzięki!

Anno
Anno

Szkoda że nie napisałeś jak dodać obsługę php bo niektóre osoby mogą mieć z tym problem

anon10657637
anon10657637

Zastanawiałem się nad tym, ale to już leży w kwestii doboru języka dla witryny - nginx może służyć jako proxy, ja tego używam w swoim repo: https://repo.kacperduras.pl

bopke
bopke Moderator forum.lvlup.pro

anon10657637:

Gotowe.

dodałeś mod_rewrite, a ja pytam o mod_userdir, czyli np example.com/~user/ otwiera nam przykładowo /home/user/public_html/, ale użytkownicy są obsługiwani dynamicznie, bez konieczności dopisywania ich do konfiguracji serwera,

anon10657637
anon10657637

Wiem, akurat na myśli miałem mod_rewrite i napisałem o nim 😛 wybacz za pomyłkę. Poczytałem chwile docsy i wykombinowałem takie coś:

server {
    listen 80;

    server_name example.com;

    autoindex on;
    index index.html index.htm;

    location ~ ^/~(?.+?)(?/.*)?$ {
        alias /home/$userdir_user/public_html$userdir_uri;
    }
}

Teraz nie przetestuje, ale powinno działać.

anon10657637
anon10657637

Co za człowiek, specjalnie to zrobiłem by nauczyli się w szukanie fraz w Google! No ale jak już napisałeś, to ok 😛

LosTigeros
LosTigeros

Ja zdecydowanie polecam dodanie repozytoriów od nginxa aby serwer był aktualny. http://nginx.org/en/linux_packages.html

MichQ
MichQ

Przydatny poradnik

kubus
kubus

A ktokolwiek wie jak zrobić htaccess w nginx? Są jakieś konwertery ale nie działają mi..

bopke
bopke Moderator forum.lvlup.pro

kubus:

A ktokolwiek wie jak zrobić htaccess w nginx? Są jakieś konwertery ale nie działają mi…

NGINX nie oferuje obsługi plików htaccess, po skonwertowaniu musisz wkleić wynik do konfiguracji nginxa bezpośrednio.

PatS
PatS

Jak dodać kolejny server?

DBanaszewski
DBanaszewski α-tester v3

Jeżeli chodzi Ci o dodanie drugiej strony (lub coś w podobnie), to dokładnie tak samo 😛

PatS
PatS

Trzeba też port dodawać?

DBanaszewski
DBanaszewski α-tester v3

Jeżeli chcesz utworzyć drugi, wirtualny serwer HTTP/HTTPS, to tak.

PatS
PatS

Ważny jest ten port? Bo z portem nie działa a bez portu działa

DBanaszewski
DBanaszewski α-tester v3

Jeżeli chcesz utworzyć podstronę/stronę na subdomenie, port jest niepotrzebny, co ty w ogóle robisz?11!?1 Jeżeli chcesz utworzyć stronę, do której będziesz się łączył przez inny port, no to on będzie potrzeb