Я новичок в nginx, я хочу сделать эту конфигурацию веб-сервера nginx, которая предназначена для панели птеродактиля, работающей на порту 8080 вместо 80.
Это мой текущий код
server_tokens off;
server {
listen 80;
server_name mywebsite.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name mywebsite.com;
root /var/www/pterodactyl/public;
index index.php;
access_log /var/log/nginx/pterodactyl.app-access.log;
error_log /var/log/nginx/pterodactyl.app-error.log error;
# allow larger file uploads and longer script runtimes
client_max_body_size 100m;
client_body_timeout 120s;
sendfile off;
ssl_certificate /etc/letsencrypt/live/mywebsite.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/mywebsite.com/privkey.pem;
ssl_session_cache shared:SSL:10m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384";
ssl_prefer_server_ciphers on;
# See https://hstspreload.org/ before uncommenting the line below.
# add_header Strict-Transport-Security "max-age=15768000; preload;";
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header X-Robots-Tag none;
add_header Content-Security-Policy "frame-ancestors 'self'";
add_header X-Frame-Options DENY;
add_header Referrer-Policy same-origin;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param PHP_VALUE "upload_max_filesize = 100M \n post_max_size=100M";
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTP_PROXY "";
fastcgi_intercept_errors off;
fastcgi_buffer_size 16k;
fastcgi_buffers 4 16k;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
include /etc/nginx/fastcgi_params;
}
location ~ /\.ht {
deny all;
}
}
я пытался сделать
server {
listen 8080;
server_name mywebsite.com;
return 301 https://$server_name$request_uri;
}
но выдает ERR_SSL_PROTOCOL_ERROR, когда я использую порт 8080, порт 80 все еще работает, хотя я изменил порт 80 на порт 8080 Он отлично работает, когда я использую эту конфигурацию HTTP (без SSL) вместо HTTPS (с SSL).
server {
listen 8080;
server_name mywebsite.com;
root /var/www/pterodactyl/public;
index index.html index.htm index.php;
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
access_log off;
error_log /var/log/nginx/pterodactyl.app-error.log error;
# allow larger file uploads and longer script runtimes
client_max_body_size 100m;
client_body_timeout 120s;
sendfile off;
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param PHP_VALUE "upload_max_filesize = 100M \n post_max_size=100M";
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTP_PROXY "";
fastcgi_intercept_errors off;
fastcgi_buffer_size 16k;
fastcgi_buffers 4 16k;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
}
location ~ /\.ht {
deny all;
}
}
Попробуйте изменить строку listen 443 ssl http2;
в конфигурации по умолчанию на listen 8080 ssl http2;
(и оставьте предыдущую строку как listen 80;
). После этого вы сможете подключиться к https://localhost:8080
(или к какому-то другому серверу). Nginx прослушивает два порта в конфигурации по умолчанию: порт 80, где он говорит по простому HTTP, и порт 443, где он говорит по HTTPS (SSL/TLS, обернутый вокруг HTTP). Если вы подключитесь к веб-сайту с помощью http://
, вы будете использовать простой HTTP, но https://
попытается использовать TLS. Надеюсь, это имеет смысл.
tldr: измените listen 443 ssl http2;
на listen 8080 ssl http2;
, а затем соедините что-то вроде https://localhost:8080
Итак, небольшая предыстория в помощь.
Nginx в вашей конфигурации по умолчанию прослушивает два порта: 80 и 443, и на каждом из них используется другой протокол. На порту 80 используется обычный HTTP. Через порт 443 он говорит по протоколу HTTPS, который представляет собой обычный HTTP, завернутый в шифрование с использованием протокола SSL/TLS (это чрезмерное упрощение, и я понимаю, что это не совсем технически точно, но для данного обсуждения этого вполне достаточно). Если вы попытаетесь подключить ванильный HTTP к порту HTTPS, сервер не поймет. Это все равно, что заказывать напиток на греческом корейскому бармену — это вызовет замешательство.
Поэтому, когда вы подключаетесь к веб-сайту, вам необходимо указать протокол, сервер и порт (и множество других вещей, которые не имеют отношения к этому обсуждению). Таким образом, подключение к http://servername:8080
будет
http
servername
8080
Но люди ненавидят печатать цифры, поэтому у нас есть соглашение. Если вы подключаетесь к серверу с помощью http
и не указываете номер порта, ваш браузер (или какой-либо другой ваш HTTP-клиент) по умолчанию использует порт 80. Если вы подключаетесь к серверу с помощью https
, ваш http-клиент подключается к порту 443. По сути, https://google.com
переводится как https://google.com:443
.
Но если мы используем нестандартные порты (т. е. не 80 или 443), тогда мы должны убедиться, что протокол соответствует тому, что обслуживает сервер. По общему соглашению мы склонны использовать 8080 для альтернативного порта HTTP и 8443 для альтернативного порта HTTPS — ничто не заставляет вас это делать, это просто помогает уменьшить путаницу среди людей, смотрящих на номер порта.
Итак, ваша конфигурация nginx прослушивает два порта. listen 80;
сообщает ему, что первый блок настраивает веб-сервер, доступный через порт 80 и говорящий по простому HTTP (мы знаем, что это обычный HTTP, потому что это значение по умолчанию для nginx, и в строке listen
нет дополнительных параметров.
listen 443 ssl http2;
сообщает nginx, что этот серверный блок управляет веб-сервером, доступным через порт 443 и использующим HTTPS (из-за параметра ssl
. На данный момент мы будем вежливо игнорировать http2
, поскольку здесь это нелогично).
Итак, если у вас есть блок с listen 8080
, ваш сервер будет доступен http://mywebsite.com:8080
. Однако этот блок в вашей конфигурации фактически не несет никакого контента. В нем есть строка return 301 https://$server_name$request_uri;
, в которой говорится, что всякий раз, когда он получает запрос к этому порту, он всегда отвечает сообщением HTTP 301, которое представляет собой перенаправление, сообщающее клиенту, что контент, который он ищет, на самом деле включен https
, поэтому клиент (ваш браузер ) получает это, а затем повторно подключается к тому же адресу, но с использованием https
, поэтому при подключении к http://mywebsite.com:8080/login
ваш браузер будет перенаправлен на https://mywebsite.com/login
.
Итак, если вы хотите получить доступ к своему контенту через порт 8080, вам необходимо либо:
http://mywebsite.com:8080
(я этого не советую), ИЛИhttps://mywebsite.com:8080
Последняя конфигурация будет выглядеть примерно так (я это не проверял). Это изменяет только перенаправление в первом блоке сервера, так что любой, кто подключается к http://mywebsite.com
, перенаправляется на https://mywebsite.com:8080
и порт прослушивания в блоке HTTPS.
server_tokens off;
server {
listen 80;
server_name mywebsite.com;
return 301 https://$server_name:8080$request_uri;
}
server {
listen 8080 ssl http2;
server_name mywebsite.com;
root /var/www/pterodactyl/public;
index index.php;
access_log /var/log/nginx/pterodactyl.app-access.log;
error_log /var/log/nginx/pterodactyl.app-error.log error;
# allow larger file uploads and longer script runtimes
client_max_body_size 100m;
client_body_timeout 120s;
sendfile off;
ssl_certificate /etc/letsencrypt/live/mywebsite.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/mywebsite.com/privkey.pem;
ssl_session_cache shared:SSL:10m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384";
ssl_prefer_server_ciphers on;
# See https://hstspreload.org/ before uncommenting the line below.
# add_header Strict-Transport-Security "max-age=15768000; preload;";
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header X-Robots-Tag none;
add_header Content-Security-Policy "frame-ancestors 'self'";
add_header X-Frame-Options DENY;
add_header Referrer-Policy same-origin;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param PHP_VALUE "upload_max_filesize = 100M \n post_max_size=100M";
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTP_PROXY "";
fastcgi_intercept_errors off;
fastcgi_buffer_size 16k;
fastcgi_buffers 4 16k;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
include /etc/nginx/fastcgi_params;
}
location ~ /\.ht {
deny all;
}
}
Для дальнейшего использования это, вероятно, следует отнести к ошибке сервера, потому что это скорее вопрос конфигурации сервера, чем вопрос разработки.