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
```