Nginx SSL Ayarları

https://osmanburan.com/ubuntu-ile-asp-net-core-3-deployment/ makalesinde yayına aldığımız web uygulamasını SSL ile çalıştırmak istiyorsak nginx ayarlarının şu şekilde düzenlenmesi gereklidir.

sudo nano /etc/nginx/sites-available/default

server {
        listen 80 default_server;
        server_name _;
        return 444;
}
server {
   listen 80;
   server_name siteadi.com;
   return 301 https://$host$request_uri;
}
server {
        listen 443;
        server_name siteadi.com;
        ssl_certificate           /etc/nginx/siteadi.com.crt;
        ssl_certificate_key       /etc/nginx/siteadi.com.key;
        ssl on;
        ssl_session_cache  builtin:1000  shared:SSL:10m;
        ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
        ssl_prefer_server_ciphers on;
location / {
                proxy_pass         http://localhost:5010;
                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;
        }
}

http ile 80 nolu portan gelen istekler https 443 portuna otomatik yönlendirilir. https istekleri ise reverse proxy ile asp.net core ile yayınlanan siteye bağlanıp SSL ile cevap verir.

Ubuntu ile ASP.NET Core 3 Deployment

ASP.NET Core 3 ile geliştirilmiş web uygulamalarını Linux ortamında çalıştırabiliyoruz.

İlk olarak Ubuntu sunucumuzu dotnet core yüklemek gerekli.

wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb

sudo dpkg -i packages-microsoft-prod.deb
sudo apt-get update
sudo apt-get install -y apt-transport-https
sudo apt-get update
sudo apt-get install -y aspnetcore-runtime-3.1

Artık sunucuda dotnet core çalışır halde. Web sunucu olarak nginx kullanacağız.

sudo apt-get install nginx

Nginx reverse-proxy olarak web uygulamasını yayınlacak. Bu nedenle Nginx üzerinde aşağıdaki ayarları yapmak gerekiyor.

sudo nano /etc/nginx/sites-available/default

server {
        listen 80 default_server;
        server_name _;
        return 444;
}
server {
        listen 80;
        server_name siteadi.com;
        location / {
                proxy_pass         http://localhost: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 service nginx stop
sudo service nginx start

Artık 80 nolu porttan siteadi.com olarak gelen istekleri nginx 5000 nolu porta yönlendirmiş olacak.

Optimal nginx ayarları için aşağıdaki bilgiler kullanılabilir.

sudo nano /etc/nginx/nginx.conf
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
        worker_connections 8000;
        accept_mutex    off;
}
http {
        sendfile on;
        tcp_nopush on;
        tcp_nodelay off;
        keepalive_timeout 29;
        client_body_timeout     10;
        client_header_timeout   10;
        send_timeout            10;
        limit_req_zone          $binary_remote_addr zone=one:10m rate=5r/s;
        server_tokens           off;
        types_hash_max_size 2048;
        include /etc/nginx/mime.types;
        default_type application/octet-stream;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; 
        ssl_prefer_server_ciphers on;
        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;
        add_header X-Content-Type-Options "nosniff";
        add_header X-Frame-Options "SAMEORIGIN";
        gzip on;
        gzip_comp_level         9;
        gzip_http_version       1.0;
        gzip_disable            "MSIE [1-6]\."
        gzip_vary on;
        # gzip_proxied any;
        gzip_types text/plain 
                text/css 
                application/json 
                application/javascript
                text/xml 
                application/xml 
                application/xml+rss 
                text/javascript
                application/manifest+json 
                application/x-web-app-manifest+json
                text/cache-manifest 
                font/opentype 
                font/otf 
                font/truetype
                application/font-woff 
                application/vnd.ms-fontobject 
                image/svg+xml;
        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
}

Yayınlancak web uygulamasını /var/www klasörünü altında alt klasör açarak yayınlayabiliriz.

Uygulamanın sürekli çalışır halde kalmasını sağlamak için servis kurulumu gerekli.

sudo nano /etc/systemd/system/kestrel-app1.service


[Unit]
Description=dotnet core web app
[Service]
WorkingDirectory=/var/www/siteadi.com
ExecStart=/usr/bin/dotnet /var/www/siteadi.com/WebApp.dll
Restart=always
# Restart service after 10 seconds if the dotnet service crashes:
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=dotnet-example
User=www-data
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
[Install]
WantedBy=multi-user.target


sudo systemctl enable kestrel-app1.service
sudo systemctl start kestrel-app1.service

Ftp ile bağlanıp dosya yükleme de sorun yaşıyorsanız kendinize yetki vererek sorunu çözebilirsiniz.

sudo chown kullaniciadi:root /var/www/siteadi.com/ -Rf