16

我想从 AWS Amazon Linux AMI实例运行 .NET Core MVC 网站。

以下是我到目前为止采取的步骤:

  1. 在 Visual Studio 2015 中创建模板ASP.NET Core Web 应用程序 (.NET Core) - C# - MVC Web 应用程序项目。在 IIS Express 中编译和运行应用程序。未对任何配置(web.confg、project.json 等)进行任何更改。
  2. 将整个 Web 应用程序解决方案上传到 GitHub。
  3. 启动 Amazon Linux AMI (2016.03.2) 实例。为简单起见,安全组现在开放“所有流量”访问。
  4. 使用 PuTTY SSH 进入 Linux 实例。使用ec2-user登录。
  5. 更新实例sudo yum update -y
  6. 安装libunwind sudo yum install libunwind -y
  7. 安装gettext sudo yum install gettext -y
  8. 安装.NET Core curl -sSL https://raw.githubusercontent.com/dotnet/cli/rel/1.0.0-preview1/scripts/obtain/dotnet-install.sh | bash /dev/stdin --version 1.0.0-preview1-002702 --install-dir ~/dotnet
  9. 关联sudo ln -s ~/dotnet/dotnet /usr/local/bin
  10. 安装.NET 版本管理器 (DNVM) curl -sSL https://raw.githubusercontent.com/aspnet/Home/dev/dnvminstall.sh | DNX_BRANCH=dev sh && source ~/.dnx/dnvm/dnvm.sh
  11. 运行命令source /home/ec2-user/.dnx/dnvm/dnvm.sh
  12. 安装.NET 执行环境 (DNX) dnvm upgrade -r coreclr
  13. 安装Kestrel使用的libuv sudo yum install automake libtool wget -y wget http://dist.libuv.org/dist/v1.8.0/libuv-v1.8.0.tar.gz tar -zxf libuv-v1.8.0.tar.gz cd libuv-v1.8.0 sudo sh autogen.sh sudo ./configure sudo make sudo make check sudo make install sudo ln -s /usr/lib64/libdl.so.2 /usr/lib64/libdl sudo ln -s /usr/local/lib/libuv.so.1.0.0 /usr/lib64/libuv.so
  14. 安装Git sudo yum install git -y
  15. 在“/home/ec2-user”目录中为应用程序创建目录。移动到该目录。mkdir director-name cd directory-name
  16. 使用 Git 克隆 Web 应用程序git config user.name "myUserName" git config user.email "myEmail" git clone https://github.com/username/repositoryname.git
  17. 移动到“项目”目录cd solution-name/src/web-project-name
  18. 恢复包dotnet restore
  19. 构建应用程序dotnet build
  20. 运行应用程序dotnet run

此时我在终端中看到以下内容:

现在收听:http://localhost:5000

我尝试使用末尾标记的端口 5000 (http://aws-ip-or-dns:5000) 访问 AWS DNS/IP,但没有得到任何响应。

我知道DockerMono是我可以使用的工具,但我宁愿让这种方法发挥作用。

我用来安装 .NET Core、DNVM 和 DNX 的脚本是来自这些链接的 CentOS 和 Ubuntu 方向的某种组合:

  1. https://docs.asp.net/en/latest/getting-started.html
  2. https://www.microsoft.com/net/core#centos
  3. https://docs.asp.net/en/1.0.0-rc1/getting-started/installing-on-linux.html

免责声明 我对 Linux 没有那么丰富的经验。公平地说,我不理解我正在运行的一些命令。但是,我是来学习的!

问: 我需要做什么才能获得运行 AWS Amazon Linux 环境的模板 .NET Core Web 应用程序?

(我的猜测是我在设置 HTTP 服务器时缺少一些东西)

我需要更多的声誉来发布两个以上的链接,所以如果有人想编辑,我会很感激的。

4

4 回答 4

5

来自@user326608 的答案几乎就在那里,但我将在 .NET Core 1.0.0 发布后添加我现在使用的步骤。

  1. 在 Visual Studio 2015 中创建模板ASP.NET Core Web 应用程序 (.NET Core) - C# - MVC Web 应用程序项目。在 IIS Express 中编译和运行应用程序。未对任何配置(web.confg、project.json 等)进行任何更改。
  2. 将整个 Web 应用程序解决方案上传到 GitHub。 不要在 Git 上传中包含project.lock.json 。
  3. 启动 Amazon Linux AMI (2016.09.0) 实例。允许使用 SSH、HTTP 和 HTTPS 流量的安全组。
  4. 使用 PuTTY SSH 进入 Linux 实例。使用ec2-user登录。
  5. 更新实例sudo yum update -y
  6. 安装libunwind sudo yum install libunwind -y
  7. 下载.NET 核心 curl -sSL -o dotnet.tar.gz https://go.microsoft.com/fwlink/?LinkID=809131
  8. 安装.NET Core sudo mkdir -p /opt/dotnet && sudo tar zxf dotnet.tar.gz -C /opt/dotnet
  9. 关联sudo ln -s /opt/dotnet/dotnet /usr/local/bin
  10. 配置IP 表 sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 5000
  11. 安装Git sudo yum install git -y
  12. 配置git config --global user.name "myUserName"
  13. 配置git config --global user.email "myGitEmail@something.com"
  14. 制作目录mkdir /var/coreapp
  15. 移动到目录cd /var/coreapp
  16. 从 Git 获取项目git clone https://github.com/myUsername/myRepository.git
  17. 更改所有者sudo chown -R ec2-user /var/coreapp
  18. 移至目录cd /var/coreapp/solution-name/src/web-project-name
  19. 在后台恢复dotnet restore、构建dotnet build和运行nohup dotnet run > /dev/null 2>&1 &

这个解决方案现在对我来说效果很好。我有一篇相关的帖子试图创建一个用户数据引导脚本来尝试让这更容易。

于 2016-12-21T18:13:45.997 回答
1

对于需要为 Microsoft.NETCore.App 1.0.1 2016 年 9 月更新更新上述内容的任何人,https ://www.microsoft.com/net/core#centos说明对我有用:

curl -sSL -o dotnet.tar.gz https://go.microsoft.com/fwlink/?LinkID=827529
sudo mkdir -p /opt/dotnet && sudo tar zxf dotnet.tar.gz -C /opt/dotnet
sudo rm /usr/local/bin/dotnet
sudo ln -s /opt/dotnet/dotnet /usr/local/bin

随后运行dotnet --info给出:

.NET Command Line Tools (1.0.0-preview2-003131)

Product Information:
 Version:            1.0.0-preview2-003131
 Commit SHA-1 hash:  635cf40e58

Runtime Environment:
 OS Name:     amzn
 OS Version:  2016.09
 OS Platform: Linux
 RID:         amzn.2016.09-x64

之后我删除了我的project.lock.json并运行了一个dotnet restore.

由于不知道我的 RID,我无法dotnet run直接工作,但在我的工作中使用Dockerfilewithmicrosoft/dotnet:onbuild和这部分project.json

"runtimes": {
    "debian.8-x64" : {}
},
于 2016-10-06T13:26:32.563 回答
0

如果您使用 Opswork(或 Chef),则可以使用以下 Chef 配方https://supermarket.chef.io/cookbooks/dotnetcore在 AWS Linux 上安装 dotnet core,假设您已使用 dotnet publish 上传了压缩文件文件到 S3 存储桶。
层 json 具有具有应用程序短名称的 JSON,例如

{
  myapp {}
}

# The recipe to install
# 1) Figure which App needs to be installed using JSON in Opsworks layer
# 2) Get the Zip file from S3 and Unzip into /usr/bin/myapp/publish
# 3) Create bash file to start
# 4) Start the app 

    apps = search(:aws_opsworks_app)
    apps.sort_by { |v| v["shortname"] }.each do |app|
        appname = app["shortname"]
        app_source = app["app_source"]
        bucket, remote_path = OpsWorks::SCM::S3.parse_uri("#{app_source['url']}")
        filename = remote_path.split("/")[-1]
        extn = File.extname  filename
        if (!node["#{appname}"].nil? && extn == '.zip')
            apppath = "/usr/bin/#{appname}"
            dotnetapp = app["environment"]["dotnetapp"]
            aspnetcore_environment = app["environment"]["aspnetcore_environment"]
            Chef::Log.info("App dotnet Name:#{app[:environment][:dotnetapp]}")
            Chef::Log.info("Enviroment:#{aspnetcore_environment}")


            app_checkout = ::File.join(Chef::Config["file_cache_path"], app["shortname"])

            package = "#{app_checkout}/#{filename}"

# Use https://github.com/awslabs/opsworks-windows-demo-cookbooks or any s3_file recipe to download the zip file
# if you copy the opsworks-windows-cookbooks you will to modify the recipe a little to work on aws linux
            opsworks_scm_checkout app["shortname"] do
                destination      app_checkout
                repository       app_source["url"]
                user             app_source["user"]
                password         app_source["password"]
                type             app_source["type"]
                ssh_key          app_source["ssh_key"]
                revision         app_source["revision"]
            end


            directory "#{apppath}" do
            end

            execute 'unzip package' do
                command "unzip -o #{app_checkout}/#{filename} -d #{apppath}"

            end

            # create a sysvint sh file to manage dotnet service 
            initd_directory = "/etc/init.d"

            intd_file = File.join(initd_directory, app["shortname"])

            template intd_file do
                mode "744"
                source 'file.sh.erb'
                variables(
                    :service_name => app["shortname"],
                    :dotnetapp => "#{dotnetapp}",
                    :apppath => "#{apppath}/publish"
                )
            end
            execute "start service #{dotnetapp}" do
                command ".#{initd_directory}/#{appname} start"
                environment ({"ASPNETCORE_ENVIRONMENT" => "#{aspnetcore_environment}"})
            end
            Chef::Log.info("End Install #{appname}")
        end
    end

# The ERB Template:

#!/bin/bash
#
# description: <%= @service_name %>
#

# Get function from functions library
. /etc/init.d/functions
#
# Start the service <%= @service_name %>
#
start() {
        initlog -c "echo -n Starting dotnet <%= @service_name %> server: "
        cd <%= @apppath %>
        nohup dotnet <%= @dotnetapp %> /dev/null 2>&1 &
        ### Create the lock file ###
        touch /var/lock/subsys/<%= @service_name %>
        success $"<%= @service_name %> server startup"
        echo
}

# Restart the service <%= @service_name %>
stop() {
        initlog -c "echo -n Stopping dotnet <%= @service_name %> server: "
        killproc dotnet
        ### Now, delete the lock file ###
        rm -f /var/lock/subsys/<%= @service_name %>
        echo
}

### main logic ###
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  status)
        status dotnet
        ;;
  restart|reload|condrestart)
        stop
        start
        ;;
  *)
        echo $"Usage: $0 {start|stop|restart|reload|status}"
        exit 1
esac

exit 0 
于 2017-05-09T03:48:52.270 回答
0

如果您在 VPC 模式下运行 AWS 实例,并且没有安全组说它的入站规则有“所有流量”并且源是“任何地方”,或者如果它说“自定义 TCP 规则”,端口是 5000 和源是“任何地方”,那么它将不允许您连接到该端口。在 VPC 模式下,所有传入端口默认关闭,您应该使用一些预定义的或您自己的安全组明确允许它们。

于 2016-08-30T19:20:04.183 回答