June 5, 2026
How to deploy dotnet api on aws ec2 with nginx + systemd
ဤလမ်းညွှန်သည် .NET API တစ်ခုကို Amazon Linux 2023 (EC2) ပေါ်တွင် Nginx Reverse Proxy နှင့် systemd တို့ကိုအသုံးပြုပြီး စနစ်တကျ Deploy ပြုလုပ်နည်း ဖြစ်ပါသည်။
- #dotnet
- #deployment
- #ec2
- #nginx
- #linux
Burmese
ဤလမ်းညွှန်သည် .NET API တစ်ခုကို Amazon Linux 2023 (EC2) ပေါ်တွင် Nginx Reverse Proxy နှင့် systemd တို့ကိုအသုံးပြုပြီး စနစ်တကျ Deploy ပြုလုပ်နည်း ဖြစ်ပါသည်။
ဤသည်မှာ အဆင့် ၁ မစတင်မီ သင်၏ Local စက် (နဂိုကွန်ပျူတာ) ပေါ်တွင် API အား စနစ်တကျ တည်ဆောက်၊ စမ်းသပ်ပြီးမှ Production အတွက် ပြင်ဆင်ရန် လိုအပ်သော Prerequisite Step (အကြိုပြင်ဆင်ရန် အဆင့်) ဖြစ်ပါသည်။
ကြိုတင်ပြင်ဆင်ခြင်း အဆင့် — Local Build, Test, and Production Readiness
EC2 ပေါ်သို့ မတင်မီ သင်၏ Local Windows စက်ပေါ်တွင် အောက်ပါအချက်များကို အရင်ဆုံး လုပ်ဆောင်ရန် လိုအပ်သည်။
၁။ Build Locally (Local တွင် စမ်းသပ် တည်ဆောက်ခြင်း)
သင်၏ Code များတွင် Syntax Error များနှင့် Compilation Error များ မရှိကြောင်း သေချာစေရန် local တွင် Build အရင်ဆွဲပါ။
- Visual Studio သုံးလျှင်:
Ctrl + Shift + Bကို နှိပ်ပါ။ - CLI (Git Bash/Terminal) သုံးလျှင်: Project Folder ထဲတွင် အောက်ပါအတိုင်း ရိုက်ပါ။
dotnet build
၂။ Test Locally (Local တွင် Run ၍ စမ်းသပ်ခြင်း)
အပြင်သို့ မတင်မီ မိမိစက်ထဲတွင် API ကို ပတ်ကြည့်ပြီး Swagger သို့မဟုတ် Postman ဖြင့် Endpoint များကို စမ်းသပ်ပါ။
- Visual Studio သုံးလျှင်:
F5သို့မဟုတ်Ctrl + F5ကို နှိပ်၍ Run ပါ။ - CLI သုံးလျှင်:
dotnet run
- Browser တွင်
http://localhost:<PORT>/swaggerသို့မဟုတ်http://localhost:<PORT>/weatherforecastကို ဝင်ရောက်ပြီး API အလုပ်လုပ်ပုံ မှန်မမှန် စစ်ဆေးပါ။
၃။ Prepare for Production (Production အတွက် ပြင်ဆင်ခြင်း)
ယခု API ကို ပတ်ဝန်းကျင်အစစ် (Production environment) တွင် အသုံးပြုတော့မည် ဖြစ်သောကြောင့် အောက်ပါ အခြေခံအချက်များကို သတ်မှတ်ပေးရန် လိုအပ်သည်-
- Connection Strings & Secrets: Database Connection String များ သို့မဟုတ် API Key များကို Code ထဲတွင် Hardcode ရေးခဲ့ခြင်းမျိုး ရှိပါက ပြန်ဖျက်ပါ။ ၎င်းတို့ကို
appsettings.Production.jsonထဲတွင် ပြောင်းလဲထည့်သွင်းပါ သို့မဟုတ် EC2 ပေါ်တွင် Environment Variable အဖြစ် သုံးရန် ပြင်ဆင်ပါ။ - Production Config File: Project ထဲတွင်
appsettings.Production.jsonရှိမရှိ စစ်ဆေးပါ။ အကယ်၍ မရှိသေးပါက ဖိုင်အသစ်ဆောက်ပြီး Production တွင် သုံးမည့် configuration များကို သီးသန့်ခွဲရေးပါ။
{
"Logging": {
"LogLevel": {
"Default": "Warning",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}
- CORS Policy: အကယ်၍ သင်၏ API ကို Frontend (ဥပမာ Next.js, React) တစ်ခုခုမှ လှမ်းခေါ်မည်ဆိုပါက
Program.csထဲတွင် Production Domain Name ကိုသာ ခွင့်ပြုရန် (CORS Settings တွင်) စနစ်တကျ ပြင်ဆင်ထားပါ။
ဤအဆင့်များ အားလုံး Local တွင် အောင်မြင်စွာ အလုပ်လုပ်ပြီးမှသာ အဆင့် ၁ သို့ ဆက်လက် လုပ်ဆောင်သင့်ပါသည်။
အဆင့် ၁ — EC2 Instance တည်ဆောက်ခြင်းနှင့် .pem File ပြင်ဆင်ခြင်း
၁။ AWS Console → EC2 → Launch Instance သို့ သွားပါ။
၂။ အောက်ပါအတိုင်း Configure လုပ်ပါ-
-
Name:
dotnet-api -
AMI: Amazon Linux 2023 (64-bit x86)
-
Instance type:
t3.small(သို့မဟုတ် ထို့ထက်ကြီးသည်ကို ရွေးပါ) -
Key pair: Create new → နာမည်ပေးပါ (ဥပမာ
dotnet-api-key) →.pemfile ကို Download လုပ်ပါ -
Security Group: Inbound rules တွင် SSH (22), HTTP (80), HTTPS (443) တို့ကို ခွင့်ပြုပေးပါ (Allow လုပ်ပါ)
၃။ Launch Instance ကို နှိပ်ပါ။
၄။ ဒေါင်းလုဒ်လုပ်ထားသော
.pemဖိုင်ကို သင်၏ Project Folder ထဲသို့ ရွှေ့ပါ (.csprojဖိုင်ရှိသည့် နေရာနှင့် တစ်ဆင့်တည်း ဖြစ်ရပါမည်)-
MyApi/
├── MyApi.csproj
├── dotnet-api-key.pem ← ဤနေရာတွင် ထားပါ
├── Controllers/
└── ...
၅။ .pem ဖိုင်အတွက် သင့်တော်သော Permission သတ်မှတ်ရန် သင်၏ local စက်ရှိ Git Bash တွင် အောက်ပါ Command ကို ရိုက်ပါ-
chmod 400 dotnet-api-key.pem
အဆင့် ၂ — Amazon Linux အတွက် App ကို Publish လုပ်ခြင်း
သင်၏ local စက်ရှိ Project Folder ထဲတွင် Git Bash ကိုဖွင့်ပြီး အောက်ပါ Command ကို Run ပါ-
dotnet publish -c Release -r linux-x64 --self-contained false -o ./publish
ရှင်းလင်းချက်:
-c Release— Performance ပိုကောင်းအောင် Build လုပ်ပေးသည်။-r linux-x64— Amazon Linux (x86_64) အတွက် ရည်ရွယ်သည်။--self-contained false— Server ပေါ်တွင် တင်မည့် .NET Runtime ကို သုံးမည်ဖြစ်၍ ဖိုင် Size သေးစေသည်။-o ./publish— Publish လုပ်ထားသော ဖိုင်များကို./publishFolder ထဲသို့ ထည့်ပေးသည်။
ယခုအခါ သင့် Project Folder ထဲတွင် publish/ ဆိုသည့် Folder တစ်ခု ရောက်ရှိလာမည် ဖြစ်သည်။
အကယ်၍
dotnet publishcommand ကို အသုံးပြုရာတွင် အဆင်မပြေပါက သင်၏ Local Windows စက်ရှိ Visual Studio မှတစ်ဆင့် အောက်ပါအတိုင်း လက်ဖြင့် Folder Profile ဆောက်၍ Publish လုပ်နိုင်ပါသည်။
Manual Publish with Virtual Studio
ဤသည်မှာ local စက်ပေါ်တွင် .NET CLI Command အစား Visual Studio ကိုအသုံးပြုပြီး လက်ဖြင့် (Manually) Publish လုပ်လိုပါက အစားထိုးလုပ်ဆောင်ရမည့် အဆင့် ၂ ဖြစ်ပါသည်။
Visual Studio ဖြင့် လက်ဖြင့် Publish ပြုလုပ်နည်း
- Visual Studio တွင် သင်၏ Project ကို ဖွင့်ပါ။
- Solution Explorer ရှိ သင်၏ Project Name ပေါ်တွင် Right-Click နှိပ်ပြီး Publish… ကို ရွေးချယ်ပါ။
- Target နေရာတွင် Folder ကို ရွေးပြီး Next နှိပ်ပါ။
- Specific Target တွင်လည်း Folder ကို ထပ်မံရွေးချယ်ပြီး Next နှိပ်ပါ။
- Location (ဖိုင်များ ထွက်လာမည့်လမ်းကြောင်း) တွင် မူလအတိုင်း
bin\Release\net8.0\publish\ထားရှိနိုင်သလို သင်နှစ်သက်ရာ Folder လမ်းကြောင်းကို ရွေးချယ်ပေးပြီး Finish ကို နှိပ်ပါ။ - Profile တည်ဆောက်ပြီးပါက မပြေးမီ Configuration Settings ကို ပြင်ဆင်ရန် “Show all settings” (သို့မဟုတ် သော့ခလောက် ပုံစံ Setting အိုင်ကွန်) ကို နှိပ်ပါ-
- Deployment Mode:
Framework-dependent(Server ပေါ်က runtime ကို သုံးရန်) - Target Runtime:
linux-x64(Amazon Linux အတွက် ဤအချက်သည် အရေးကြီးဆုံးဖြစ်သည်)
- Settings များကို Save လုပ်ပါ။
- စာမျက်နှာအပေါ်နားရှိ Publish ခလုတ် အပြာရောင်ကို နှိပ်ပြီး Build ဆွဲပါ။
Publish လုပ်ငန်းစဉ် ပြီးဆုံးသွားပါက အပေါ်တွင် သတ်မှတ်ခဲ့သည့် Folder လမ်းကြောင်း (ဥပမာ bin\Release\net8.0\publish\) ထဲသို့ ဖိုင်များ ရောက်ရှိသွားမည် ဖြစ်သည်။
မှတ်ချက် (အဆင့် ၃ အတွက် ပြင်ဆင်ရန်): > Visual Studio ဖြင့် Publish လုပ်လိုက်သောကြောင့် အဆင့် ၃တွင် အသုံးပြုမည့်
scpcommand ထဲက local folder လမ်းကြောင်းကို အနည်းငယ် ပြောင်းလဲပေးရပါမည်။Git Bash ကို Project Folder ၏ အခြေခံ (Root) လမ်းကြောင်းအတိုင်း ဖွင့်ထားဆဲဖြစ်ပါက
scpcommand ကို အောက်ပါအတိုင်း ပြောင်းလဲရိုက်ကူးပါ-
scp -i dotnet-api-key.pem -r ./bin/Release/net8.0/publish/* ec2-user@<PUBLIC_DNS>:/home/ec2-user/dotnet-api/
အဆင့် ၃ — Publish Folder ကို EC2 ပေါ်သို့ ကူးယူခြင်း (Copy)
သင်၏ local Git Bash ထဲတွင် ဆက်လက်ပြီး၊ <PUBLIC_DNS> နေရာတွင် သင်၏ EC2 Public DNS (AWS Console → EC2 → Instance details တွင် တွေ့နိုင်သည်၊ ဥပမာ ec2-xx-xx-xx-xx.compute-1.amazonaws.com) ဖြင့် အစားထိုး၍ အောက်ပါအတိုင်း ရိုက်ပါ-
scp -i dotnet-api-key.pem -r ./publish ec2-user@<PUBLIC_DNS>:/home/ec2-user/dotnet-api
ဥပမာ နမူနာပြောင်းလဲပုံ-
scp -i dotnet-api-key.pem -r ./publish ec2-user@ec2-13-215-12-34.compute-1.amazonaws.com:/home/ec2-user/dotnet-api
မှတ်ချက်: ဤ Command သည် EC2 Server ပေါ်တွင်
/home/ec2-user/dotnet-api/ဆိုသည့် Folder ကို တည်ဆောက်ပြီး Publish လုပ်ထားသော ဖိုင်အားလုံးကို လှမ်းထည့်ပေးမည် ဖြစ်သည်။
အဆင့် ၄ — EC2 ထဲသို့ SSH ဖြင့် ဝင်ခြင်း၊ .NET နှင့် Nginx ထည့်သွင်းခြင်း
SSH ဖြင့် EC2 သို့ ချိတ်ဆက်ခြင်း
ssh -i dotnet-api-key.pem ec2-user@<PUBLIC_DNS>
.NET SDK ထည့်သွင်းခြင်း
sudo dnf update -y
sudo dnf install -y dotnet-sdk-8.0
ဗားရှင်း အောင်မြင်စွာ တင်ပြီးကြောင်း စစ်ဆေးရန်-
dotnet --version
# 8.0.x ဟု ထွက်လာရမည်။
Nginx ထည့်သွင်းခြင်း
sudo dnf install -y nginx
Nginx ကို Enable လုပ်ပြီး Start လုပ်ခြင်း
sudo systemctl enable nginx
sudo systemctl start nginx
အဆင့် ၅ — Nginx ကို Public DNS နှင့် Localhost တို့တွင် စမ်းသပ်ခြင်း
Browser မှတစ်ဆင့် Nginx အလုပ်လုပ်ပုံကို စစ်ဆေးခြင်း
သင်၏ Browser ကိုဖွင့်ပြီး အောက်ပါ Address သို့ သွားပါ-
http://<PUBLIC_DNS>
Nginx ၏ မူလ Welcome to nginx! စာမျက်နှာကို မြင်တွေ့ရမည် ဖြစ်သည်။ မြင်ရပါက Nginx စနစ်တကျ အလုပ်လုပ်နေပြီ ဖြစ်သည်။
EC2 ထဲမှနေ၍ Localhost ကို တုံ့ပြန်မှုရှိမရှိ စစ်ဆေးခြင်း
curl http://localhost
မျှော်လင့်ထားသည့် Output (Nginx Welcome Page ၏ HTML Code များ မြင်ရမည်)-
<!DOCTYPE html>
<html>
...
<title>Welcome to nginx!</title>
...
အဆင့် ၆ — .dll ကို Run ပြီး Public DNS မှတစ်ဆင့် စမ်းသပ်ခြင်း
App ကို ယာယီ ကိုယ်တိုင် Run ကြည့်ခြင်း (Foreground တွင် စမ်းသပ်ရန်)
cd /home/ec2-user/dotnet-api
dotnet MyApi.dll --urls "http://0.0.0.0:5000"
MyApi.dll နေရာတွင် သင်၏ တကယ့် .csproj နာမည်အတိုင်း ထွက်လာသည့် .dll ဖိုင်နာမည်ကို အစားထိုးပါ။
မျှော်လင့်ထားသည့် Output-
info: Microsoft.Hosting.Lifetime[14]
Now listening on: http://0.0.0.0:5000
info: Microsoft.Hosting.Lifetime[0]
Application started.
Browser တွင် စမ်းသပ်ခြင်း
http://<PUBLIC_DNS>:5000/swagger
# သို့မဟုတ်
http://<PUBLIC_DNS>:5000/weatherforecast
သတိပြုရန်: ဤနေရာတွင် တိုက်ရိုက်စမ်းသပ်နိုင်ရန် ပေါ့တ် 5000 ကို EC2 Security Group တွင် ခေတ္တဖွင့်ပေးထားရပါမည်။ နောက်ပိုင်း Nginx proxy ခံပြီးပါက ၎င်းပေါ့တ်ကို ပြန်ပိတ်နိုင်သည်။ သို့မဟုတ်ပါက နောက်ထပ် SSH Session တစ်ခုထပ်ဖွင့်ပြီး Server ထဲကနေပဲ အောက်ပါအတိုင်း စမ်းသပ်နိုင်သည်-
curl http://localhost:5000/weatherforecast
စမ်းသပ်ပြီးပါက App ကို ရပ်တန့်ရန် Ctrl+C ကို နှိပ်ပါ။
အဆင့် ၇ — .NET API အတွက် Nginx Config ရေးဆွဲခြင်း
သင်၏ API အတွက် Nginx Configuration ဖိုင်အသစ်တစ်ခု ဆောက်ပါ-
sudo nano /etc/nginx/conf.d/dotnet-api.conf
အောက်ပါ Code များကို ကူးယူ၍ ထည့်ပါ (Paste လုပ်ပါ)-
server {
listen 80;
server_name _;
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_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_cache_bypass $http_upgrade;
}
}
ဖိုင်သိမ်းပြီး ထွက်ရန်: Ctrl+O → Enter → Ctrl+X
Config မှန်မမှန် စစ်ဆေးပြီး Nginx ကို Reload လုပ်ပါ-
sudo nginx -t
# nginx: configuration file /etc/nginx/nginx.conf test is successful ဟု ပြရမည်။
sudo systemctl reload nginx
အဆင့် ၈ — Default ဖြစ်နေသော Nginx server Block ကို ဖျက်ထုတ်ခြင်း
Nginx ၏ မူလ config တွင်ပါဝင်သော server { listen 80; } block သည် သင်ယခုဆောက်လိုက်သော config နှင့် ပေါ့တ်ချင်း ငြိစွန်းနေတတ်ပါသည်။ ထို့ကြောင့် ၎င်းကို ဖွင့်ပါ-
sudo nano /etc/nginx/nginx.conf
အောက်ပါအတိုင်း တွေ့ရမည့် Section တစ်ခုလုံးကို ရှာပြီး ဖျက်ပစ်ပါ (server { မှ အပိတ် } အထိ အားလုံးကို ဖျက်ပါ)-
# ဤ Block တစ်ခုလုံးကို ဖျက်ပါ ↓
server {
listen 80;
listen [::]:80;
server_name _;
root /usr/share/nginx/html;
include /etc/nginx/default.d/*.conf;
error_page 404 /404.html;
location = /404.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
# ဤ Block တစ်ခုလုံးကို ဖျက်ပါ ↑
ဖိုင်သိမ်းပြီး ထွက်ရန်: Ctrl+O → Enter → Ctrl+X
ထပ်မံ စစ်ဆေးပြီး Reload လုပ်ပါ-
sudo nginx -t
sudo systemctl reload nginx
ယခုဆိုလျှင် http://<PUBLIC_DNS> သို့ ဝင်ရောက်ပါက သင်၏ .NET API ဆီသို့ တိုက်ရိုက် ဦးတည်ပေးမည် ဖြစ်သည် (အဆင့် ၉ တွင် Service ကို Run ပြီးပါက စမ်းသပ်နိုင်သည်)။
အဆင့် ၉ — systemd Service တည်ဆောက်ခြင်း
API အား နောက်ကွယ်တွင် Background process အဖြစ် အမြဲတမ်းပွင့်နေစေရန်နှင့် Server ကျသွားလျှင်လည်း အလိုအလျောက် ပြန်ပွင့်လာစေရန် (Auto-restart) systemd unit ဖိုင်တစ်ခု ဆောက်ပါမည်-
sudo nano /etc/systemd/system/dotnet-api.service
အောက်ပါစာသားများကို ထည့်ပါ — MyApi.dll နေရာတွင် သင်၏ တကယ့် .dll နာမည်ကို အစားထိုးရန် မမေ့ပါနှင့်-
[Unit]
Description=ASP.NET Core API
After=network.target
[Service]
WorkingDirectory=/home/ec2-user/dotnet-api
ExecStart=/usr/bin/dotnet /home/ec2-user/dotnet-api/MyApi.dll --urls "http://0.0.0.0:5000"
Restart=always
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=dotnet-api
User=ec2-user
Environment=ASPNETCORE_ENVIRONMENT=Production
[Install]
WantedBy=multi-user.target
ဖိုင်သိမ်းပြီး ထွက်ရန်: Ctrl+O → Enter → Ctrl+X
Service ကို Enable လုပ်ပြီး Start လုပ်ခြင်း
sudo systemctl daemon-reload
sudo systemctl enable dotnet-api
sudo systemctl start dotnet-api
စနစ်တကျ ပွင့်နေကြောင်း စစ်ဆေးခြင်း
sudo systemctl status dotnet-api
မျှော်လင့်ထားသည့် Output-
● dotnet-api.service - ASP.NET Core API
Loaded: loaded (/etc/systemd/system/dotnet-api.service; enabled)
Active: active (running) since ...
End-to-End အားလုံး အလုပ်လုပ်ပုံကို စမ်းသပ်ခြင်း
# EC2 Server ထဲမှနေ၍ စမ်းသပ်ရန်
curl http://localhost/weatherforecast
# ပြင်ပ Browser မှနေ၍ စမ်းသပ်ရန်
http://<PUBLIC_DNS>/weatherforecast
နောင်တွင် အသုံးလိုမည့် အသုံးဝင်သော Command များ
# Live တက်လာမည့် Log များကို ကြည့်ရန်
sudo journalctl -u dotnet-api -f
# Code ပြင်ပြီး အသစ်ထပ်တင်တိုင်း Service ကို Restart ချရန်
sudo systemctl restart dotnet-api
# Service ကို ခေတ္တ ပိတ်ထားရန်
sudo systemctl stop dotnet-api
Redeployment (နောက်တစ်ကြိမ် Code အသစ် ပြန်တင်လိုလျှင် လုပ်ဆောင်ရန်)
သင်၏ local စက်ရှိ Project folder ထဲမှ Git Bash ကို အသုံးပြုပြီး အောက်ပါ အဆင့် ၃ ဆင့်ဖြင့် အလွယ်တကူ Deploy ပြန်လုပ်နိုင်သည်-
# ၁။ ဗားရှင်းအသစ်ကို ပြန်ပြီး Publish လုပ်သည်
dotnet publish -c Release -r linux-x64 --self-contained false -o ./publish
# ၂။ ဖိုင်အသစ်များကို EC2 Server ပေါ်သို့ လှမ်းပို့သည်
scp -i dotnet-api-key.pem -r ./publish/* ec2-user@<PUBLIC_DNS>:/home/ec2-user/dotnet-api/
# ၃။ API Service ကို Restart ချပေးသည်
ssh -i dotnet-api-key.pem ec2-user@<PUBLIC_DNS> "sudo systemctl restart dotnet-api"