喜迎国庆
点击上方蓝字关注“汪宇杰博客”
导语
前几天发了两篇《
能跑就行:Kestrel Hosting
如果你的要求只是临时内网访问,可以只用 Kestrel 来承载 Web 服务器,只需要给 dotnet 命令一个 --urls 参数即可设置允许访问的主机名和端口号。我不希望限制主机名,所以这里我用了 *。
dotnet Empower.dll --urls "http://*:8080"
现在,你的内网机器就能访问树莓派上的网站了:
但是这种方式有一定的缺点。比如你的代码写爆了,只要一个exception,dotnet 进程就会结束,你必须手工重启才能继续使用网站。而且 Kestrel 的功能远没有正常的Web服务器强大。因此,在更真实的环境里,我们还是要通过正常的Web服务器(如Nginx)做反向代理,并能自动重启dotnet进程。
使用 Nginx + systemd
首先,安装并启动ngix
sudo apt-get install nginx
sudo /etc/init.d/nginx start
打开配置文件
sudo nano /etc/nginx/sites-available/default
替换为以下内容
server {
listen 80 default_server;
server_name _;
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;
}
}
其中 server_name 设置为 _; 的意思也是不限制主机名访问。proxy_pass 对应的是 Kestrel 的默认终端地址。
应用设置
sudo nginx -t
sudo nginx -s reload
现在,启动你的 ASP.NET Core 网站,应该能在内网用80端口访问了。
dotnet Empower.dll
现在,我们还有最后一步,就是让 dotnet 进程一爆就自动重启,这可以借助 systemd 服务实现。
sudo nano /etc/systemd/system/kestrel-empowerapp.service
内容如下
[Unit]
Description=ASP.NET Core 3.0 App - Empower
[Service]
WorkingDirectory=/home/pi/dotnet-playground/empower/portable-fdd
ExecStart=/home/pi/dotnet-arm32/dotnet /home/pi/dotnet-playground/empower/portable-fdd/Empower.dll
Restart=always
# Restart service after 10 seconds if the dotnet service crashes:
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=dotnet-empower
User=pi
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
[Install]
WantedBy=multi-user.target
注意,systemd 要求我们使用绝对路径。
注册,并启动服务:
sudo systemctl enable kestrel-empowerapp.service
sudo systemctl start kestrel-empowerapp.service
sudo systemctl status kestrel-empowerapp.service
现在,试试重启你的树莓派,网站会自动启动,局域网80端口也能访问,代码爆了也能自动重启服务!
关于更详细的配置,可以点击【阅读原文】参考微软官方文档。