Как запустить сайт .NET Core MVC на экземпляре AWS Linux

Я хотел бы запустить веб-сайт .NET Core MVC с экземпляра AWS Amazon Linux AMI.

Вот шаги, которые я сделал до сих пор:

  • Создайте шаблон Проект ASP.NET Core Web Application (.NET Core) - С# - MVC Web Application в Visual Studio 2015. Скомпилируйте и запустите приложение в IIS Express. Никаких изменений в любой конфигурации (web.confg, project.json и т.д.).
  • Загрузите решение для всего веб-приложения в GitHub.
  • Запустите экземпляр Amazon Linux AMI (2016.03.2). Для обеспечения безопасности группа безопасности теперь доступна для всего доступа "весь трафик".
  • Используйте PuTTY для SSH в экземпляре Linux. Войдите в систему с помощью ec2-user.
  • Обновить экземпляр sudo yum update -y
  • Установить libunwind sudo yum install libunwind -y
  • Установить gettext sudo yum install gettext -y
  • Установить .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
  • Ссылка sudo ln -s ~/dotnet/dotnet /usr/local/bin
  • Установить Менеджер версий .NET(DNVM) curl -sSL https://raw.githubusercontent.com/aspnet/Home/dev/dnvminstall.sh | DNX_BRANCH=dev sh && source ~/.dnx/dnvm/dnvm.sh
  • Команда запуска source /home/ec2-user/.dnx/dnvm/dnvm.sh
  • Установить .NET Execution Environment (DNX) dnvm upgrade -r coreclr
  • Установите libuv, который будет использоваться Kestrel 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
  • Установите Git sudo yum install git -y
  • Создайте каталог в каталоге "/home/ec2-user" для приложения. Переместитесь в этот каталог. mkdir director-name cd directory-name
  • Клонирование веб-приложения с Git git config user.name "myUserName" git config user.email "myEmail" git clone https://github.com/username/repositoryname.git
  • Перейдите в каталог 'project' cd solution-name/src/web-project-name.
  • Восстановить пакеты dotnet restore
  • Сборка приложения dotnet build
  • Запустить приложение dotnet run

В этот момент я вижу в терминале следующее:

Теперь прослушивание: http://localhost: 5000

Я пытаюсь поразить AWS DNS/IP портом 5000, помеченным в конце (http://aws-ip-or-dns: 5000), но не получаю ответа.

Я знаю, что Docker и Моно - это инструменты, которые я могу использовать, но я бы предпочел использовать этот подход.

Сценарии, которые я использовал для установки .NET Core, DNVM и DNX, представляют собой комбинацию направлений CentOS и Ubuntu из этих ссылок:

Отказ Я не настолько разбираюсь в Linux. Справедливости ради стоит сказать, что я не понимаю некоторых команд, которые я запускаю. Но я здесь, чтобы учиться!

Вопрос: Что мне нужно сделать, чтобы получить шаблонное веб-приложение .NET Core, работающее в среде AWS Amazon Linux?

(Мое предположение: у меня что-то не хватает при настройке HTTP-сервера)

Мне нужно больше репутации, чтобы разместить более двух ссылок, поэтому, если кто-то захочет ИЗМЕНИТЬ, я был бы признателен.

Ответы

Ответ 1

Ответ от @user326608 почти получает его, но я собираюсь добавить шаги, которые я использую сейчас после выпуска .NET Core 1.0.0.

  • Создайте шаблон Проект ASP.NET Core Web Application (.NET Core) - С# - MVC Web Application в Visual Studio 2015. Скомпилируйте и запустите приложение в IIS Express. Никаких изменений в любой конфигурации (web.confg, project.json и т.д.).
  • Загрузите решение для всего веб-приложения в GitHub. Не включать project.lock.json в загрузку Git.
  • Запустите экземпляр Amazon Linux AMI (2016.09.0). Доступна группа безопасности с использованием трафика SSH, HTTP и HTTPS.
  • Используйте PuTTY для SSH в экземпляре Linux. Войдите в систему с помощью ec2-user.
  • Обновить экземпляр sudo yum update -y
  • Установить libunwind sudo yum install libunwind -y
  • Загрузите .NET Core curl -sSL -o dotnet.tar.gz https://go.microsoft.com/fwlink/?LinkID=809131
  • Установить .NET Core sudo mkdir -p /opt/dotnet && sudo tar zxf dotnet.tar.gz -C /opt/dotnet
  • Ссылка sudo ln -s /opt/dotnet/dotnet /usr/local/bin
  • Настроить IP-таблицы sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 5000
  • Установить Git sudo yum install git -y
  • Настроить git config --global user.name "myUserName"
  • Настроить git config --global user.email "[email protected]"
  • Сделать каталог mkdir /var/coreapp
  • Переместить в каталог cd /var/coreapp
  • Получить проект из Git git clone https://github.com/myUsername/myRepository.git
  • Изменить владельца sudo chown -R ec2-user /var/coreapp
  • Переместить в directcotry cd /var/coreapp/solution-name/src/web-project-name
  • Восстановить dotnet restore, построить dotnet build и запустить в фоновом режиме nohup dotnet run > /dev/null 2>&1 &

Это решение работает для меня сейчас. У меня есть связанный пост, пытающийся создать Пользовательские данные bootstrap script, чтобы попытаться сделать это еще проще.

Ответ 2

Для тех, кто нуждается в обновлении выше для обновления Microsoft.NETCore.App 1.0.1 сентябрь 2016 года, инструкции 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.

Я не мог заставить dotnet run работать напрямую, поскольку мой RID не был известен, но с помощью Dockerfile с microsoft/dotnet:onbuild и этот раздел в моем project.json работал:

"runtimes": {
    "debian.8-x64" : {}
},

Ответ 3

Если вы используете экземпляр AWS в режиме VPC, и у вас нет группы безопасности, в которой говорится, что в ее входящем правиле есть "Все трафик", а "Источник" - "Где угодно" или если он говорит, что "Пользовательское правило TCP", порт - 5000, а Source - "Anywhere", тогда он не позволит вам подключиться к этому порту. В режиме VPC все входящие порты по умолчанию закрываются, и вы должны разрешать их явно с помощью определенных предопределенных или собственных групп безопасности.

Ответ 4

Если вы используете Opswork (или Chef), вы можете использовать следующий рецепт шеф-повара https://supermarket.chef.io/cookbooks/dotnetcore, чтобы установить ядро ​​dotnet на AWS Linux, Предположим, вы загрузили zip файл с помощью файла публикации dotnet в ведро 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