Blame
724efd | Mayekkuzu | 2024-11-12 20:34:11 | 1 | # Nginx |
2 | ||||
78228c | Mayekkuzu | 2024-12-17 20:23:42 | 3 |  |
25eee9 | Mayekkuzu | 2024-11-12 20:36:45 | 4 | |
5 | **NGINX** - Один из самых популярных веб-серверов в этом вашем интернете. Может выступать не только веб-сервером, но и load-балансером, а так же прокси. Все то что ты сейчас читаешь тут работает именно через NGINX, потому как апач не то чтобы совсем безопасен в использовании, но как говорится - в кривых руках и NGINX не панацея. |
|||
6 | ||||
7 | Тема с конфигурацией NGINX очень обширна, большинство фич обычному обывателю врядли понадобятся, но чуток посмотрим что тут есть для нас. |
|||
724efd | Mayekkuzu | 2024-11-12 20:34:11 | 8 | |
9 | ## Простой минимальный конфиг для работы сервера |
|||
10 | ||||
11 | В случае если необходимо обеспечить работу виртуального хоста для работы необходимо прописать в /etc/nginx/sites-available/hosnaname.conf такие данные: |
|||
12 | ||||
13 | NGINX Proxy Pass (полезно в случае если крутится сервис Docker на 3000 порту |
|||
14 | ||||
15 | ``` |
|||
16 | server { |
|||
17 | listen 80; |
|||
18 | listen [::]:80; |
|||
19 | ||||
20 | server_name hostname.ru; |
|||
21 | ||||
22 | location / { |
|||
23 | proxy_pass http://localhost:3000/; |
|||
24 | } |
|||
25 | } |
|||
26 | ``` |
|||
27 | ||||
28 | Или ссылаемся на папку (Вариант без PHP. Только HMTL странички): |
|||
29 | ||||
30 | ``` |
|||
31 | server { |
|||
32 | listen 80; |
|||
33 | listen [::]:80; |
|||
34 | ||||
35 | server_name hostname.ru; |
|||
36 | ||||
37 | root /var/www/public_html; |
|||
38 | index.html index.htm; |
|||
39 | ||||
40 | location / { |
|||
41 | try_files $uri $uri/ =404; |
|||
42 | } |
|||
43 | } |
|||
44 | ``` |
|||
45 | ||||
46 | Далее делаем символическую ссылку в /etc/nginx/sites-enabled |
|||
47 | ||||
48 | ``` |
|||
49 | ln -s /etc/nginx/sites-available/hostname.ru.conf /etc/nginx/sites-enabled/hostname.ru.conf |
|||
50 | ``` |
|||
51 | ||||
52 | Проверить конфиг можно командой: |
|||
53 | ``` |
|||
54 | mayekkuzu@yet-another-hostname:~# nginx -t |
|||
55 | nginx: the configuration file /etc/nginx/nginx.conf syntax is ok |
|||
56 | nginx: configuration file /etc/nginx/nginx.conf test is successful |
|||
57 | ``` |
|||
58 | ||||
59 | ## SSL Certbot |
|||
60 | ||||
61 | Для обеспечения доступа к сайту по HTTPS необходимо запросить сертификат Let's Encrypt и прописать в конфиг. Это можно сделать автоматически с помощью certbot. В Debian, к примеру можно установить пакеты certbox и python3-certbot-nginx |
|||
62 | ||||
63 | ``` |
|||
64 | sudo apt install certbot python3-certbot-nginx |
|||
65 | ``` |
|||
66 | ||||
67 | После того как создана символическая ссылка на конфиг и проверка конфига прошла успешно, перезапускаем службу nginx и запрашиваем сертификат у ACME Let's Encrypt. |
|||
68 | ||||
69 | ``` |
|||
70 | sudo apt install certbot python3-certbot-nginx |
|||
71 | sudo certbot --nginx -d hostname.ru |
|||
72 | ``` |
|||
73 | ||||
74 | В автоматическом режиме будет установлен сертификат и прописан в конфиг фаил. В процессе запроса необходимо согласиться с правилами обслуживания и прописать свою электронную почту. Теперь посмотрим каким образом выглядит наш конфигурационный фаил: |
|||
75 | ||||
76 | ``` |
|||
77 | root@hostname:~# sudo cat /etc/nginx/sites-enabled/hostname.ru.conf |
|||
78 | server { |
|||
79 | ||||
80 | server_name hostname.ru; |
|||
81 | ||||
82 | location / { |
|||
83 | proxy_pass http://localhost:8080/; |
|||
84 | } |
|||
85 | ||||
86 | listen [::]:443 ssl; # managed by Certbot |
|||
87 | listen 443 ssl; # managed by Certbot |
|||
88 | ssl_certificate /etc/letsencrypt/live/hostname.ru/fullchain.pem; # managed by Certbot |
|||
89 | ssl_certificate_key /etc/letsencrypt/live/hostname.ru/privkey.pem; # managed by Certbot |
|||
90 | include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot |
|||
91 | ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot |
|||
92 | ||||
93 | } |
|||
94 | server { |
|||
95 | if ($host = hostname.ru) { |
|||
96 | return 301 https://$host$request_uri; |
|||
97 | } # managed by Certbot |
|||
98 | ||||
99 | ||||
100 | listen 80; |
|||
101 | listen [::]:80; |
|||
102 | ||||
103 | server_name hostname.ru; |
|||
104 | return 404; # managed by Certbot |
|||
105 | ||||
106 | ||||
107 | } |
|||
108 | ``` |
|||
109 | ||||
110 | Или же в случае с конфигом с root папкой на html-файлы: |
|||
111 | ||||
112 | ``` |
|||
113 | server { |
|||
114 | ||||
115 | root /var/www/hostname-folder-with-htmls; |
|||
116 | index index.html; |
|||
117 | ||||
118 | server_name hostname.ru; |
|||
119 | ||||
120 | location / { |
|||
121 | try_files $uri $uri/ =404; |
|||
122 | } |
|||
123 | ||||
124 | listen [::]:443; # managed by Certbot |
|||
125 | listen 443; # managed by Certbot |
|||
126 | ssl_certificate /etc/letsencrypt/live/hostname.ru/fullchain.pem; # managed by Certbot |
|||
127 | ssl_certificate_key /etc/letsencrypt/live/hostname.ru/privkey.pem; # managed by Certbot |
|||
128 | include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot |
|||
129 | ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot |
|||
130 | ||||
131 | } |
|||
132 | ||||
133 | server { |
|||
134 | if ($host = hostname.ru) { |
|||
135 | return 301 https://$host$request_uri; |
|||
136 | } # managed by Certbot |
|||
137 | ||||
138 | ||||
139 | listen 80; |
|||
140 | listen [::]:80; |
|||
141 | ||||
142 | server_name hostname.ru; |
|||
143 | return 404; # managed by Certbot |
|||
144 | ||||
145 | ||||
146 | } |
|||
147 | ``` |
|||
148 | ||||
149 | Скрипт автоматически создает редирект с HTTP на HTTPS, а так же указывает пути к к приватному ключу и всей цепочке сертификатов для корректной работы. Стоит отметить, что сертификат выдается на 90 дней. Для автоматического продления предусмотрен запуск скрипта через crontab, который прописывается после получения сертификата/сертификатов Let's Encrypt для всех хостов в системе. Посмотреть можно через crontab: |
|||
150 | ||||
151 | ``` |
|||
152 | root@hostname:~# crontab -l |
|||
153 | 8 18 * * * "/opt/acmesh/.acme.sh"/acme.sh --cron --home "/opt/acmesh/.acme.sh" > /dev/null |
|||
154 | ``` |
|||
155 | В случае, если сертификат не продлился или же подходит срок по каким-то причинам, вы получите письмо на почту от Let's Encrypt Expiry Bot, примерно такого содержания: |
|||
156 | ||||
157 | ``` |
|||
158 | Hello, |
|||
159 | ||||
160 | Your certificate (or certificates) for the names listed below will expire in XX days (on XXXX-XX-XX). Please make sure to renew your certificate before then, or visitors to your web site will encounter errors. |
|||
161 | ||||
162 | We recommend renewing certificates automatically when they have a third of their total lifetime left. For Let's Encrypt's current 90-day certificates, that means renewing 30 days before expiration. See https://letsencrypt.org/docs/integration-guide/ for details. |
|||
163 | ||||
164 | hostname.ru |
|||
165 | ||||
166 | For details about when we send these emails, please visit: https://letsencrypt.org/docs/expiration-emails/ In particular, note that this reminder email is still sent if you've obtained a slightly different certificate by adding or removing names. If you've replaced this certificate with a newer one that covers more or fewer names than the list above, you may be able to ignore this message. |
|||
167 | ``` |
|||
168 | ||||
169 | ## WebSocket |
|||
170 | ||||
171 | Некоторые веб-приложения требуют возможность работы с WebSocket (чаще всего это приложения docker через proxy-pass. Для этого блок location приведем к такому виду: |
|||
172 | ||||
173 | ``` |
|||
174 | ... |
|||
175 | location / { |
|||
176 | proxy_pass http://localhost:8080/; |
|||
177 | proxy_http_version 1.1; |
|||
178 | proxy_set_header Upgrade $http_upgrade; |
|||
179 | proxy_set_header Connection "Upgrade"; |
|||
180 | proxy_set_header Host $host; |
|||
181 | } |
|||
182 | ... |
|||
183 | ``` |
|||
184 | После чего перезапустим службу NGINX. |
|||
7f6d5c | Mayekkuzu | 2024-11-30 18:28:07 | 185 | |
186 | ## Host Headers и X-Real-IP |
|||
187 | ||||
188 | Иногда может быть ситуация, когда при обращении к странице в аппку которая крутится внутри контейнера, страница обращается по локальному IP или IP-контейнера, в следствии чего JS и прочие штуки не загружаются. Так же тут добавлена директива, которая позволяет видеть реальные IP-адреса клиентов. |
|||
189 | ``` |
|||
190 | ... |
|||
191 | location / { |
|||
192 | proxy_pass http://ip:port/; |
|||
193 | add_header X-Served-By $host; |
|||
194 | proxy_set_header Host $host; |
|||
195 | proxy_set_header X-Forwarded-Scheme $scheme; |
|||
196 | proxy_set_header X-Forwarded-Proto $scheme; |
|||
197 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; |
|||
198 | proxy_set_header X-Real-IP $remote_addr; |
|||
199 | proxy_set_header Upgrade $http_upgrade; |
|||
200 | proxy_set_header Connection $http_connection; |
|||
201 | proxy_http_version 1.1; |
|||
202 | } |
|||
203 | ... |
|||
204 | ``` |