Instalacja i konfiguracja nginxa ze wsparciem wielu domen

anon10657637 | 2020-12-30 16:23:05 UTC | #1

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 :stuckouttongue:
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ć

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 | 2018-02-22 15:03:06 UTC | #2

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 | 2018-02-22 15:10:42 UTC | #3

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


anon10657637 | 2018-02-22 15:16:09 UTC | #4

[quote=”bopke, post:2, topic:5596, full:true”]
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
[/quote]

Gotowe.

[quote=”Timo, post:3, topic:5596, full:true”]
Fajny, przejrzysty poradnik, ale z apache się nie przesiądę
[/quote]

Kwestia czasu i ruchu jaki kontrolujesz.


LinGruby | 2018-02-22 15:26:37 UTC | #5

[quote=”anon10657637, post:1, topic:5596”]
Więc tak, wpierw może zalogujmy się na roota:

sudo su

[/quote]

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


anon10657637 | 2018-02-22 15:27:28 UTC | #6

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


Anno | 2018-02-22 17:48:39 UTC | #7

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


anon10657637 | 2018-02-22 18:16:54 UTC | #8

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 | 2018-02-22 18:38:39 UTC | #9

[quote=”anon10657637, post:4, topic:5596”]
Gotowe.
[/quote]

dodałeś modrewrite, a ja pytam o moduserdir, 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 | 2018-03-06 12:12:35 UTC | #10

Wiem, akurat na myśli miałem mod_rewrite i napisałem o nim :stuckouttongue: 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 ~ ^/~(?<userdir_user>.+?)(?<userdir_uri>/.*)?$ {
        alias /home/$userdir_user/public_html$userdir_uri;
    }
}

Teraz nie przetestuje, ale powinno działać.


kubus | 2018-02-22 20:38:41 UTC | #11

Tutaj masz poradnik jak zrobić to, działa.
https://www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-in-ubuntu-16-04


anon10657637 | 2018-02-22 20:40:56 UTC | #12

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


LosTigeros | 2018-02-24 11:27:48 UTC | #13

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


MichQ | 2018-02-25 01:32:08 UTC | #14

Przydatny poradnik


kubus | 2018-03-26 06:37:21 UTC | #15

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


bopke | 2018-03-26 07:54:16 UTC | #16

[quote=”kubus, post:15, topic:5596, full:true”]
A ktokolwiek wie jak zrobić htaccess w nginx? Są jakieś konwertery ale nie działają mi…
[/quote]

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


PatS | 2019-07-04 19:18:08 UTC | #18

Jak dodać kolejny server?


DBanaszewski | 2019-07-04 19:47:57 UTC | #19

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


PatS | 2019-07-05 08:30:02 UTC | #20

Trzeba też port dodawać?


DBanaszewski | 2019-07-05 08:35:07 UTC | #21

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


PatS | 2019-07-05 08:40:51 UTC | #22

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


DBanaszewski | 2019-07-05 08:42:36 UTC | #23

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