更新时间:2023-02-07 09:14:35浏览次数:511+次
本文介绍使用Apache在Rocky/CentOS/AlmaLinux上托管ASP.NET应用程序的方法。内容包括安装.NET、创建ASP.NET、发布ASP.NET应用程序、安装和配置Apache代理、创建systemd服务及访问ASP.NET应用程序。
简介
ASP.NET是一个免费的web框架,您可以使用HTML、CSS和JavaScript构建令人惊叹的网站。它还可以用于创建Web API,并使用Web套接字等实时技术。它提供了3个用于创建web应用程序的框架,分别是web窗体、ASP.NET MVC和ASP.NET网页。
首选ASP.NET,因为它具有以下功能和优点:
活跃的社区和开源:活跃的开发者社区如Stack Overflow、Microsoft问答等问题提供快速答案。
构建安全应用程序:它支持具有内置功能的行业标准身份验证协议,以帮助保护您的应用程序免受跨站点脚本(XSS)和跨站点请求伪造(CSRF)的影响。
快速且可扩展:在独立的TechEmpower基准测试中,它的性能比任何流行的web框架都快。
Azure上的免费托管:Microsoft Azure上有10个ASP.NET网站的免费托管。您还可以将其部署到任何主要的云平台,或自己的Linux或Windows服务器。
托管ASP.NET应用程序的方法
1、在Rocky/CentOS/AlmaLinux上安装.NET
为了能够使用ASP.NET创建网站,我们需要在Rocky/CentOS/AlmaLinux上安装.NET。在本指南中,我将提供两种实现这一目标的方法。此处介绍的方法包括:使用YUM存储库、使用安装程序脚本。
选项1、使用YUM安装.NET
首先,将Microsoft包签名密钥添加到受信任密钥列表中,并将Microsoft包存储库添加到系统中:
sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
添加后,安装.NET SDK,该SDK允许您使用.NET开发应用程序:
sudo yum install dotnet-sdk-7.0
返回信息:
Install 10 Packages
Total download size: 182 M
Installed size: 504 M
Is this ok [y/N]: y
安装后,您不需要安装相应的运行时。ASP.NET核心运行时允许您运行使用.NET制作的未提供运行时的应用程序:
sudo yum install aspnetcore-runtime-7.0
ASP.NET核心运行时的另一种选择是.NET运行时,它不支持ASP.NET核心。可以使用以下命令安装:
sudo yum install dotnet-runtime-7.0
安装后,使用以下命令检查版本:
$ dotnet --version
7.0.101
选项2、使用安装程序脚本安装.NET
此安装程序脚本自动为您安装和配置系统。地址在https://dot.net/v1/dotnet-install.sh。您还可以使用以下命令来拉动Dotnet 7的脚本:
wget https://dot.net/v1/dotnet-install.sh
下载后,使脚本可执行:
sudo chmod +x ./dotnet-install.sh
该脚本将安装最新的长期支持(LTS)SDK版本,地址在https://dotnet.microsoft.com/platform/support/policy/dotnet-core。要安装.NET,请运行以下命令:
./dotnet-install.sh --version latest
您还可以使用以下命令安装最新的主版本,例如7.0:
./dotnet-install.sh --channel 7.0
完成后,导出DOTNET_ROOT和PATH:
export DOTNET_ROOT=$HOME/.dotnet
export PATH=$PATH:$HOME/.dotnet:$HOME/.dotnet/tools
现在验证安装:
$ dotnet --version
6.0.404
2、创建ASP.NET应用程序
一旦安装了.NET,我们就可以继续并创建一个示例web应用程序。对于本指南,我们将创建一个名为my-app的示例应用程序:
dotnet new web --output my-app
样本输出:
The template "ASP.NET Core Empty" was created successfully.
Processing post-creation actions...
Running 'dotnet restore' on /home/rocky9/my-app/my-app.csproj...
Determining projects to restore...
Restored /home/rocky9/my-app/my-app.csproj (in 85 ms).
Restore succeeded.
之后,您将创建一个应用程序目录my-app,其中包含所有必需的依赖项。这是一个从模板创建的简单Hello World web应用程序。
现在,您可以根据需要修改应用程序。例如,通过删除HTTPS URL,还可以为HTTP提供所需的端口,如下所示:
$ vim my-app/Properties/launchSettings.json
....
"profiles": {
"my_app": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"applicationUrl": "http://localhost:5000",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
.....
如果希望应用程序在不安全的端点上运行,请在开发环境中停用HTTPS重定向中间件,然后通过添加以下行来修改Program.cs文件:
if (!app.Environment.IsDevelopment())
{
app.UseHttpsRedirection();
}
要运行应用程序,我们将使用以下命令:
dotnet run --project my-app
样本输出:
Building...
info: Microsoft.Hosting.Lifetime[14]
Now listening on: http://localhost:5000
info: Microsoft.Hosting.Lifetime[0]
Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
Content root path: /home/rocky9/my-app/
现在,在另一个shell上,验证应用程序是否在提供的端口上运行:
$ curl http://localhost:5000
Hello World!
这表明web应用程序正在按预期工作。因此,我们可以使用CRTL+C停止进程并终止端口上的服务:
sudo killall -9 my-app
3、发布ASP.NET应用程序
一旦应用程序运行,我们就可以发布它。发布可以定义为将应用程序打包到所需的目录中。
发布应用程序的可用方法有:
单文件应用程序:它是自包含的,可以作为单个可执行文件部署,所有依赖文件都包含在单个二进制文件中。
依赖于框架的部署(FDD):应用程序使用共享的系统范围的.NET版本。
自包含部署(SCD):此方法使用Microsoft构建的.NET运行时。
对于本指南,我们将发布一个依赖于框架的应用程序。创建要将应用程序发布到的目录:
sudo mkdir -p /var/www/html/my-app
sudo chown -R $USER /var/www/html/my-app
使用以下命令发布应用程序:
dotnet publish my-app -f net7.0 -c Release -o /var/www/html/my-app
继续之前,请记住提供已安装的.NET版本(net7.0)。
另外,您还可以将应用程序作为自包含部署发布,以减少依赖关系。例如,仅对于RHEL,命令可以是:
dotnet publish my-app -f net7.0 -c Release -o /var/www/html/my-app -r rhel.8-architecture --self-contained false
4、安装和配置Apache代理
使用以下命令在Rocky/CentOS/AlmaLinux上安装Apache web服务器:
sudo yum -y install httpd mod_ssl
安装后,为应用程序创建虚拟主机文件:
sudo vim /etc/httpd/conf.d/helloapp.conf
添加以下行:
<VirtualHost *:*>
RequestHeader set "X-Forwarded-Proto" expr=%{REQUEST_SCHEME}
</VirtualHost>
<VirtualHost *:80>
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:5000/
ProxyPassReverse / http://127.0.0.1:5000/
ServerName www.test.computingforgeeks.com
ServerAlias *test.computingforgeeks.com
ErrorLog /var/log/httpd/helloapp-error.log
CustomLog /var/log/httpd/helloapp-access.log common
</VirtualHost>
确保相应地将主机名添加到/etc/hosts中。现在重新启动服务:
sudo systemctl restart httpd
sudo systemctl enable httpd
允许端口80通过防火墙:
#用于UFW
sudo ufw allow 80
##用于Firewalld
sudo firewall-cmd --add-port=80/tcp --permanent
sudo firewall-cmd --reload
5、为应用程序创建systemd服务
现在可以为ASAP.NET应用程序创建系统服务文件:
sudo vim /etc/systemd/system/helloapp.service
在文件中,根据需要添加以下行替换:
[Unit]
Description=Example .NET Web API App running on CentOS/Rocky/Alma
[Service]
WorkingDirectory=/var/www/html/my-app
ExecStart=/usr/bin/dotnet /var/www/html/my-app/my-app.dll
Restart=always
# Restart service after 10 seconds if the dotnet service crashes:
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=dotnet-example
User=computingforgeeks
Group=apache
Environment=ASPNETCORE_ENVIRONMENT=Production
[Install]
WantedBy=multi-user.target
确定.NET安装的确切路径,并在继续之前在ExecStart中替换它:
$ which dotnet
/usr/bin/dotnet
如果使用了安装程序脚本,还可能需要提供系统用户:
$ echo $USER
computingforgeeks
禁用SELinux或将其设置为许可模式:
sudo setenforce 0
保存文件,启动并启用服务:
sudo systemctl start helloapp.service
sudo systemctl enable helloapp.service
验证服务是否正在运行:
$ systemctl status helloapp.service
现在,您将在设置的端口上运行服务:
$ sudo ss -plunt|grep 5000
tcp LISTEN 0 512 127.0.0.1:5000 0.0.0.0:* users:(("dotnet",pid=76804,fd=114))
tcp LISTEN 0 512 [::1]:5000 [::]:* users:(("dotnet",pid=76804,fd=116))
通过SELinux允许此服务:
sudo semanage port -a -t http_port_t -p tcp 5000
6、访问ASP.NET应用程序
您现在可以使用URL访问应用程序,地址格式为http://domain_name,如果一切正常,您将看到您的应用程序,如下所示:
至此,已成功完成使用Apache在Rocky/CentOS/AlmaLinux上托管ASP.NET应用程序的操作。现在,您已经将apache设置为转发来自http://127.0.0.1:5000到http://localhost:80,我们还有一个systemd服务,可用于启动和监视ASP.NET应用程序。