Skip to content

Instantly share code, notes, and snippets.

@Platonenkov
Last active March 9, 2024 07:35
Show Gist options
  • Save Platonenkov/c373dbe5ed41d3e8f5dbcab456809d4b to your computer and use it in GitHub Desktop.
Save Platonenkov/c373dbe5ed41d3e8f5dbcab456809d4b to your computer and use it in GitHub Desktop.
configur nginx
sudo apt update

Устанавливаем nginx

sudo apt-get install nginx

Проверям статус

sudo systemctl status nginx

теперь если зайти по Ip на сервер мы увидим заставку nginx image

Открываем порты

sudo ufw allow 22/tcp && sudo ufw allow 80/tcp && sudo ufw allow 443/tcp

первый это ssh, второй http, третий https

Создаем директорию Для файлов приложения

sudo unlink /etc/nginx/sites-enabled/default
cd /var/www && sudo mkdir myapp && cd myapp

где myapp - ваше название

копируем в директорию файлы сервера разрешаем выполнение файла

chmod +x AppFileName

где AppFileName имя вашего запускаемого файла (dll)

запускаем апи командой

./AppFileName

Видим что приложение поднялось image

Не забываем в program.cs пробрасывать заголовки

app.UseForwardedHeaders(new ForwardedHeadersOptions
{
    ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
});

Настраиваем конфиг nginx

sudo nano /etc/nginx/sites-available/default
server {
    listen        80;
    root /var/www/testapp; # убеждаемся что наш сайт лежит тут
    location / {
        proxy_pass         http://127.0.0.1:5000;
        proxy_http_version 1.1;
        proxy_set_header   Upgrade $http_upgrade;
        proxy_set_header   Connection keep-alive;
        proxy_set_header   Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto $scheme;
    }
}

Включаем сайт

ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/

проверяем статус nginx

sudo nginx -t

если ошибок нет то все ок, перезагружаем его

sudo nginx -s reload
sudo systemctl restart nginx

тестируем что работает

curl -v http://ipaddress/weatherforecast

ЧАСТЬ 2 Настройка сертификатов SSL

Ставим бота

sudo snap install --classic certbot

проверяем что все ок

sudo ln -s /snap/bin/certbot /usr/bin/certbot

Готовимся к выпуску сертификатов Создаем директорию

mkdir /var/www/letsencrypt

Настраиваем разрешения

chown www-data:www-data /var/www/letsencrypt

Настраиваем nginx добавив секцию

location ^~ /.well-known/acme-challenge/ {
   default_type "text/plain";
   root /var/www/letsencrypt;
}
location = /.well-known/acme-challenge/ {
   return 404;
}

и добавив ссылку на домен

server_name your.domain.ru  ;
sudo nano /etc/nginx/sites-available/default

В итоге файл будет выглядеть так:

server {
    listen        80;
    root /var/www/testapp; # make sure to match this with your folder name
    server_name your.domain.ru  ;

    location ^~ /.well-known/acme-challenge/ {
        default_type "text/plain";
        root /var/www/letsencrypt;
    }
    location = /.well-known/acme-challenge/ {
        return 404;
    }

    location / {
        proxy_pass         http://127.0.0.1:5000;
        proxy_http_version 1.1;
        proxy_set_header   Upgrade $http_upgrade;
        proxy_set_header   Connection keep-alive;
        proxy_set_header   Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto $scheme;
    }
}

перезагружаем nginx

sudo nginx -s reload
sudo systemctl restart nginx

Регистрируемся certbot register -m admin@example.com Получаем сертификат Сначала тестируем что все ок и дсн видит адрес и сертификат может быть выпущен:

certbot certonly --dry-run --webroot -w /var/www/letsencrypt -d example.com -d www.example.com

если с адресами все ок – выполняем без –dry-run

certbot certonly --webroot -w /var/www/letsencrypt -d example.com -d www.example.com

Перейдем в /etc/letsencrypt/live где для каждого полученного сертификата будет создана папка с именем первого указанного в запросе домена, т.е. для нашего примера - example.com. Внутри будут находиться четыре файла:

  • cert.pem - собственно сертификат
  • chain.pem - цепочка доверия, включает корневой и промежуточный сертификаты Let's Encrypt
  • fullchain.pem - полная цепочка, включающая кроме содержимого chain.pem сам сертификат
  • privkey.pem - закрытый ключ сертификата, данный файл является секретным.

Именно эти файлы следует использовать в конфигурационных файлах служб при настройке SSL

Добавляем ссылки на сертификаты в nginx а так же сам домен сервера

server {
    listen        80;
    server_name new.xrpldaddy.ru  ;
    root /var/www/testapp; # make sure to match this with your folder name

    # SSL certificate paths
    ssl_certificate /etc/letsencrypt/live/new.xrpldaddy.ru/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/new.xrpldaddy.ru/privkey.pem;

    location ^~ /.well-known/acme-challenge/ {
        default_type "text/plain";
        root /var/www/letsencrypt;
    }
    location = /.well-known/acme-challenge/ {
        return 404;
    }

    location / {
        proxy_pass         http://127.0.0.1:5000;
        proxy_http_version 1.1;
        proxy_set_header   Upgrade $http_upgrade;
        proxy_set_header   Connection keep-alive;
        proxy_set_header   Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto $scheme;
    }
}

Включаем автообновление сертификатов

sudo certbot renew --dry-run

Перезапускаем nginx

sudo systemctl restart nginx

создаем сервис для автозапуска приложения при сбоях и перезагрузках

sudo nano /etc/systemd/system/myapp.service

вставляем содержимое

[Unit]
Description=My Example API
After=network.target

[Service]
WorkingDirectory=/var/www/myapp
ExecStart=/var/www/myapp/AppFileName
Restart=always
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=myapp
User=www-data

[Install]
WantedBy=multi-user.target

Если нужны настройки переменных – задайте их под параметром User

Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=ASPNETCORE_URLS=http://localhost:5000

Включаем сервис

sudo systemctl enable myapp

Запускаем сервис

sudo systemctl start myapp.service

Проверяем статус

sudo systemctl status myapp.service

image

если что пошло не так – читаем логи с ошибками сервиса (проверяем параметры и пути, перезагружаем сервис)

sudo systemctl daemon-reload

читаем логи командой

journalctl -u myapp.service
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment