• ubuntu下发布asp.net core并用nginx代理之旅


    asp.net core 1.0.1发布已有些日子了,怀着好奇的心情体验了把ubuntu下的asp.net core

    系统运行环境:ubuntu 16.0.4 for developer

    首先搭建.net core的运行环境,可参见微软网站介绍:

    sudo sh -c 'echo "deb [arch=amd64] https://apt-mo.trafficmanager.net/repos/dotnet-release/ xenial main" > /etc/apt/sources.list.d/dotnetdev.list'
    sudo apt-key adv --keyserver apt-mo.trafficmanager.net --recv-keys 417A0893
    sudo apt-get update
    sudo apt-get install dotnet-dev-1.0.0-preview2-003131

    然后新建目录用于本地存储文件夹,我的放在/var/www/helloworld下,

    cd /var/www
    sudo mkdir helloworld

    创建新项目,并选择web模板,然后还原项目:

    dotnet new -t web
    dotnet resotre

    然后执行dotnet run 就可以运行该项目了,默认情况下asp.net core监听的是5000的端口

    dotnet run
    dotnet publish

    然后我们执行发布命令 dotnet publish

     默认情况下是发布的文件夹为当前项目目录下/bin/Debug/netcoreapp1.0,我的完整发布目录为/var/www/helloworld/bin/Release/netcoreapp1.0,

    进入该目录,然后执行dotnet run helloworld.dll就可以运行发布版本的asp.net core示例项目了,但是光这样怎么行呢,我们可不想每次重启系统时都敲上一大堆代码去启动监听,这时supervisor就派上用场了,supervisor是基于python的进程管理工具,貌似windows下没法用,

    首先去安装supervisor

    sudo apt-get install supervisor

     等待安装完成,期间如有y/n的等待输入,记得按y

    然后去/etc/supervisor/conf.d文件夹下去新增一个

    图形界面可用
    sudo  gedit /etc/supervisor/conf.d/hellomvc.conf(需要安装gedit)
    服务端用vim 
    sudo  vim /etc/supervisor/conf.d/hellomvc.conf
    当没有该文件时会创建该文件
    内容如下
    [program:hellomvc]
    command=/usr/bin/dotnet /var/www/helloworld/bin/Debug/netcoreapp1.0/publish/helloworld.dll 
    directory=/var/www/helloworld/bin/Debug/netcoreapp1.0/publish
    autostart=true
    autorestart=true
    stderr_logfile=/var/log/hellomvc.err.log
    stdout_logfile=/var/log/hellomvc.out.log
    environment=HOME=/var/www/,ASPNETCORE_ENVIRONMENT=Production
    user=www-data
    stopsignal=INT
    stopasgroup=true
    killasgroup=true
    然后保存并退出 gedit点击右上角的save保存,vim按esc 然后出入:wq保存并退出
    然后想改变自定义监听端口时需要修改项目program.cs,传递args参数
    public class Program
        {
            public static void Main(string[] args)
            {
                var host = new WebHostBuilder()
                    .UseKestrel()
                    .UseContentRoot(Directory.GetCurrentDirectory())
                    .UseIISIntegration()
                    .UseStartup<Startup>()
                    .Build();
    
                host.Run();
            }
        }
    修改为
     public class Program
        {
            public static void Main(string[] args)
            {
                var host = new WebHostBuilder()
                    .UseKestrel()
                    .UseUrls(args[0])
                    .UseContentRoot(Directory.GetCurrentDirectory())
                    .UseIISIntegration()
                    .UseStartup<Startup>()
                    .Build();
    
                host.Run();
            }
        }
    然后在启动时传入参数 dotnet run helloworld "http://*.5000"
    helloworld.conf也需修改为
    [program:hellomvc]
    command=/usr/bin/dotnet /var/www/helloworld/bin/Debug/netcoreapp1.0/publish/helloworld.dll  "http://*5000"
    directory=/var/www/helloworld/bin/Debug/netcoreapp1.0/publish
    autostart=true
    autorestart=true
    stderr_logfile=/var/log/hellomvc.err.log
    stdout_logfile=/var/log/hellomvc.out.log
    environment=HOME=/var/www/,ASPNETCORE_ENVIRONMENT=Production
    user=www-data
    stopsignal=INT
    stopasgroup=true
    killasgroup=true

    或者您也可以在项目中加上配置文件如host.json,内容如下

    {
    "server.urls": "http://*:5000"
    }

        public class Program
        {
            public static void Main(string[] args)
            {
                var config = new ConfigurationBuilder()
                    .SetBasePath(Directory.GetCurrentDirectory())
                    .AddJsonFile("host.json", optional: true)
                    .Build();
                var host = new WebHostBuilder()
                    .UseConfiguration(config)
                    .UseKestrel()
                    .UseContentRoot(Directory.GetCurrentDirectory())
                    .UseIISIntegration()
                    .UseStartup<Startup>()
                    .Build();
                host.Run();
            }
        }
    }
    helloworld.conf为就可以直接监听你host.json所传的端口了
    [program:hellomvc] command
    =/usr/bin/dotnet /var/www/helloworld/bin/Debug/netcoreapp1.0/publish/helloworld.dll directory=/var/www/helloworld/bin/Debug/netcoreapp1.0/publish autostart=true autorestart=true stderr_logfile=/var/log/hellomvc.err.log stdout_logfile=/var/log/hellomvc.out.log environment=HOME=/var/www/,ASPNETCORE_ENVIRONMENT=Production user=www-data stopsignal=INT stopasgroup=true killasgroup=true

    然后program.cs修改为

    然后开启supervisor服务

    sudo service supervisor stop
    sudo service supervisor start

    如果是想开机启动自动启动服务时需要创建自启动脚本

    sudo vim /etc/init.d/supervisord

    内容如下:

    #! /bin/sh
    ### BEGIN INIT INFO
    # Provides:          supervisord
    # Required-Start:    $remote_fs
    # Required-Stop:     $remote_fs
    # Default-Start:     2 3 4 5
    # Default-Stop:      0 1 6
    # Short-Description: Example initscript
    # Description:       This file should be used to construct scripts to be
    #                    placed in /etc/init.d.
    ### END INIT INFO
     
    # Author: Dan MacKinlay <danielm@phm.gov.au>
    # Based on instructions by Bertrand Mathieu
    # http://zebert.blogspot.com/2009/05/installing-django-solr-varnish-and.html
     
    # Do NOT "set -e"
     
    # PATH should only include /usr/* if it runs after the mountnfs.sh script
    PATH=/sbin:/usr/sbin:/bin:/usr/bin
    DESC="Description of the service"
    NAME=supervisord
    DAEMON=/usr/local/bin/supervisord
    DAEMON_ARGS=""
    PIDFILE=/tmp/$NAME.pid
    SCRIPTNAME=/etc/init.d/$NAME
     
    # Exit if the package is not installed
    [ -x "$DAEMON" ] || exit 0
     
    # Read configuration variable file if it is present
    [ -r /etc/default/$NAME ] && . /etc/default/$NAME
     
    # Load the VERBOSE setting and other rcS variables
    . /lib/init/vars.sh
     
    # Define LSB log_* functions.
    # Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
    . /lib/lsb/init-functions
     
    #
    # Function that starts the daemon/service
    #
    do_start()
    {
        # Return
        #   0 if daemon has been started
        #   1 if daemon was already running
        #   2 if daemon could not be started
        start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null 
            || return 1
        start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- 
            $DAEMON_ARGS 
            || return 2
        # Add code here, if necessary, that waits for the process to be ready
        # to handle requests from services started subsequently which depend
        # on this one.  As a last resort, sleep for some time.
    }
     
    #
    # Function that stops the daemon/service
    #
    do_stop()
    {
        # Return
        #   0 if daemon has been stopped
        #   1 if daemon was already stopped
        #   2 if daemon could not be stopped
        #   other if a failure occurred
        start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
        RETVAL="$?"
        [ "$RETVAL" = 2 ] && return 2
        # Wait for children to finish too if this is a daemon that forks
        # and if the daemon is only ever run from this initscript.
        # If the above conditions are not satisfied then add some other code
        # that waits for the process to drop all resources that could be
        # needed by services started subsequently.  A last resort is to
        # sleep for some time.
        start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
        [ "$?" = 2 ] && return 2
        # Many daemons don't delete their pidfiles when they exit.
        rm -f $PIDFILE
        return "$RETVAL"
    }
     
    #
    # Function that sends a SIGHUP to the daemon/service
    #
    do_reload() {
        #
        # If the daemon can reload its configuration without
        # restarting (for example, when it is sent a SIGHUP),
        # then implement that here.
        #
        start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
        return 0
    }
     
    case "$1" in
      start)
        [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
        do_start
        case "$?" in
            0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
            2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
        ;;
      stop)
        [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
        do_stop
        case "$?" in
            0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
            2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
        ;;
      #reload|force-reload)
        #
        # If do_reload() is not implemented then leave this commented out
        # and leave 'force-reload' as an alias for 'restart'.
        #
        #log_daemon_msg "Reloading $DESC" "$NAME"
        #do_reload
        #log_end_msg $?
        #;;
      restart|force-reload)
        #
        # If the "reload" option is implemented then remove the
        # 'force-reload' alias
        #
        log_daemon_msg "Restarting $DESC" "$NAME"
        do_stop
        case "$?" in
          0|1)
            do_start
            case "$?" in
                0) log_end_msg 0 ;;
                1) log_end_msg 1 ;; # Old process is still running
                *) log_end_msg 1 ;; # Failed to start
            esac
            ;;
          *)
              # Failed to stop
            log_end_msg 1
            ;;
        esac
        ;;
      *)
        #echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
        echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2
        exit 3
        ;;
    esac

    然后修改权限,并更新系统

    sudo chmod +x /etc/init.d/supervisord
    sudo update-rc.d supervisord defaults
    sudo service supervisord start

    这样就实现了开机自启动

    kestrel 作为一个asp.net良好的动态内容服务部件,然而不是类似iis apache,weblogic全功能服务器,所以一个反向代理服务器也就必要了,而nginx作为代理服务器也是很多web应用的选择,

    首先安装nginx:

    sudo apt-get install nginx

     然后

    配置nginx的代理转发,修改/etc/nginx/sites-available/default,修改内容如下

    server {
        listen 80;
        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;
        }
    }

    保存退出,然后重新加载nginx 

    sudo nginx -t

    sudo nginx -s reload

    nginx代理就实现了不信,去你的浏览器打开localhost,是不是就是我们的helloworld项目了,nice !

    如果想要本机外的访问,记得开启80 以及5000端口

    sudo ufw enable
    
    sudo ufw allow 80
    sudo ufw allow 5000
    如果遇到文件访问被拒绝记得修改项目的权限
    sudo chmod 777 xxx(xxx表示文件夹路径)
    参考asp.net官方文档
  • 相关阅读:
    (转)3D模板阴影原理
    (转)c++模版:包含模型、显式实例化、分离模型
    (转)C++内存管理
    (转)Ogre 安装 配置 问题
    (转)详细解说hash_map
    (转)STL中map用法详解
    VB Format函数
    转 python内置正则表达式(re)模块官方文档简要中文版
    《编程的奥秘》读后感
    python基础(5)正则表达式
  • 原文地址:https://www.cnblogs.com/shatanku/p/5913083.html
Copyright © 2020-2023  润新知