Blame
724efd | Mayekkuzu | 2024-11-12 20:34:11 | 1 | # Nginx |
2 | ||||
78228c | Mayekkuzu | 2024-12-17 20:23:42 | 3 | ![](/Self-Hosted/Nginx/friendship_ended_with_apache.png) |
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 | ``` |