.Net Core部署在Linux服务器:Nginx反向代理+Supervisor进程守护

前言:.Net Core 程序(网站)可以部署在windows IIS ,也可以部署在Linux系统(更加推荐)


本文部署,基于.net core 2.1,服务器CentOS 7, 需要安装的服务有2个:Nginx,SuperVisor(进程守护)

命令预览:

Linux: 重启:reboot

Nginx: 强杀: killall -9 nginx
    测试配置是否正确: nginx -t
    启动: nginx

SuperVisor:停止:supervisorctl shutdown
          启动: supervisord

描述:(以下,我以开发一个在线记事本 BookkeepingWeb 为例 )

一。在本地做好项目

开发好Web,并配置好程序监听的端口(不配置,默认5000端口,如果服务器部署多个web的话,这里应该更改端口),VS里面,或者cmd进入到项目进行发布,发布项目下的\bin\Debug\netcoreapp2.1\publish 后,

在cmd 进入到该项目运行 :dotnet 程序名称.dll ,浏览器打cmd提示的访问地址,保证正常访问。

找到程序的路径:D:\study\consoleTest\Bruke.Bookkeeping\Bruke.Bookkeeping.Core.Web\bin\Debug\netcoreapp2.1\publish

程序的启动入口:Bruke.Bookkeeping.Core.Web.dll

运行起来:打开cmd 进入程序路径  执行: dotnet 程序入口名称

执行:dotnet Bruke.Bookkeeping.Core.Web.dll

浏览器查看是否可以访问:http://localhost:5000  ,如图正常。

当cmd关闭或 程序shut down(Ctrl+C) 时, 网站就是访问不了,说明,由cmd单线程监听端口,并执行和返回的。比如浏览器访问了本地5000端口,就会给这个单线程的cmd捕获到,并执行你的代码后返回到浏览器。

至此,本地程序是没问题的,那么就可以把publish拷贝到Linux服务器上了,下面是服务器如何设置监听端口,并转发请求的。

附(设置端口)的博文,可以先忽略该文:https://www.cnblogs.com/1175429393wljblog/p/8267772.html

二.服务器操作

1.接下来就是把publish 拷贝到Linux服务器上去即可,推荐使用 SecureCRSecureFXPortable,可以上传文件,命令运行。

链接: https://pan.baidu.com/s/15kDCQn3xSg4PyZO5R4gPLw 提取码: punw

在服务器 /root 添加文件夹 BookkeepingWeb,把publish的东西拷贝上来。

2.服务上安装.Net Core SDK (基于你的项目版本去安装,我的服务器,安装了.net core 3.0.1,和.net core 2.1,以下为core 2.1为例)

  微软官网:https://dotnet.microsoft.com/download/linux-package-manager/rhel/sdk-current

(这个是官网的推荐的sdk 默认3.0版本)

寻找对应2.1的版本:https://dotnet.microsoft.com/download/dotnet-core

https://dotnet.microsoft.com/download/dotnet-core/2.1

执行:sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm

执行:sudo yum install dotnet-sdk-2.1

安装.net core运行环境完毕。

3.服务上安装Nginx:

(可以参考:https://www.jianshu.com/p/e1b5ee442a70

命令:

  curl -o nginx.rpm http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
  rpm -ivh nginx.rpm
  yum install nginx

至此,安装完毕,外网访问服务器,访问80端口,如图说明,Ngnix部署成功,并完成了监听端口(80)。

打开服务器的目录 /etc/nginx

把配置文件拷贝下来到本地编辑后上传,或者直接在服务器上编辑(不推荐),在本地编辑时,注意使用编码是:utf-8 无bom的格式。

a.    nginx.conf

如果nginx.conf和图上没什么区别,就不用管,如果是不同,参考或复制下面的

worker_processes  1; 这个表示nginx运行处理的线程数,推荐使用cpu核数的2倍(https://www.cnblogs.com/aaron-agu/p/8003831.html

#user  nginx;
worker_processes  1;

#error_log  /var/log/nginx/error.log warn;
#pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  ‘$remote_addr - $remote_user [$time_local] "$request" ‘
                      ‘$status $body_bytes_sent "$http_referer" ‘
                      ‘"$http_user_agent" "$http_x_forwarded_for"‘;

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

b.    default.conf

多个Web,可以使用多个server{}来设置转发

listen 80;Nginx对外表示监听了80端口,有人访问,IP:80就会使用该配置。

server_name jz.test.com www.test.com;绑定域名(多个域名绑定到同一个web时 ,使用空格隔开即可)

proxy_pass  这个是设置该请求转发的到服务器本地的端口(比如我们的这个项目是5000端口,那么转发过去给它处理就好)

server {
     listen 80;
     location / {
        proxy_pass http://localhost:5000;
    }
}

至此,配置完成,把本地的这2个配置,替换到服务器上对于的位置即可。

接下来让Nginx重新加载配置即可(nginx不会自动加载配置的)

使用命令:nginx -t 查看nginx 配置是否配置的对。不正常的话,检查一下配置。

推荐使用:killall -9 nginx 杀死所以nginx 进程。

然后启动命令:nginx

至此,nginx在外网的访问下(80端口),会进行转发到端口5000。

Nginx配置完毕。

4.服务上运行咱们的应用程序:

方法和我们本地上很像啦。

无非就是CD到我们发布的那个目录,执行  dotnet 程序名称.dll

无报错就是启动完成了。这时候,可以用外网浏览器服务IP:80。即可访问到我们的网站了

(原理是,启动网站后,该网站会一直监听我们的端口5000,外网访问的80端口会给Nginx转发到5000,那么我们的网站就可以捕获到并处理返回)。

至此,web部署完毕。

不好意思,还有后续,什么?你忘了我们本地的CMD窗口了吗?只要关闭,或者shut down 就GG。

所以你web虽然部署好了,但是你这个是单线程窗口,只能在里面,退不出来,断开服务器命名窗口,也一样,对不起,GG。

哦,是的,web启动了,和我们的本地的那个cmd太像了,那么我们就需要把我们的网站搞成另一个进程程来执行它,并不退出(俗称进程守护)。

5.安装supervisor进程守护:

【安装Supervisor】

yum install python-setuptools
easy_install supervisor

【配置Supervisor】

mkdir /etc/supervisor
新增一个文件:(这一句不是命令) /etc/supervisor/supervisord.conf

【修改supervisord.conf文件,将文件尾部的配置】

;[include]
;files = relative/directory/*.ini

改成

[include]
files = conf.d/*.conf

注意:conf.d是没有自动创建的,自己手动创建一个,还有就是参考下面的图片,如果没有的,都要自己创建文件夹或文件,配置也贴下面了

supervisord.conf 的代码:

; Sample supervisor config file.
;
; For more information on the config file, please see:
; http://supervisord.org/configuration.html
;
; Notes:
;  - Shell expansion ("~" or "$HOME") is not supported.  Environment
;    variables can be expanded using this syntax: "%(ENV_HOME)s".
;  - Quotes around values are not supported, except in the case of
;    the environment= options as shown below.
;  - Comments must have a leading space: "a=b ;comment" not "a=b;comment".
;  - Command will be truncated if it looks like a config file comment, e.g.
;    "command=bash -c ‘foo ; bar‘" will truncate to "command=bash -c ‘foo ".
;
; Warning:
;  Paths throughout this example file use /tmp because it is available on most
;  systems.  You will likely need to change these to locations more appropriate
;  for your system.  Some systems periodically delete older files in /tmp.
;  Notably, if the socket file defined in the [unix_http_server] section below
;  is deleted, supervisorctl will be unable to connect to supervisord.

[unix_http_server]
file=/tmp/supervisor.sock   ; the path to the socket file
;chmod=0700                 ; socket file mode (default 0700)
;chown=nobody:nogroup       ; socket file uid:gid owner
;username=user              ; default is no username (open server)
;password=123               ; default is no password (open server)

; Security Warning:
;  The inet HTTP server is not enabled by default.  The inet HTTP server is
;  enabled by uncommenting the [inet_http_server] section below.  The inet
;  HTTP server is intended for use within a trusted environment only.  It
;  should only be bound to localhost or only accessible from within an
;  isolated, trusted network.  The inet HTTP server does not support any
;  form of encryption.  The inet HTTP server does not use authentication
;  by default (see the username= and password= options to add authentication).
;  Never expose the inet HTTP server to the public internet.

;[inet_http_server]         ; inet (TCP) server disabled by default
;port=127.0.0.1:9001        ; ip_address:port specifier, *:port for all iface
;username=user              ; default is no username (open server)
;password=123               ; default is no password (open server)

[supervisord]
logfile=/tmp/supervisord.log ; main log file; default $CWD/supervisord.log
logfile_maxbytes=50MB        ; max main logfile bytes b4 rotation; default 50MB
logfile_backups=10           ; # of main logfile backups; 0 means none, default 10
loglevel=info                ; log level; default info; others: debug,warn,trace
pidfile=/tmp/supervisord.pid ; supervisord pidfile; default supervisord.pid
nodaemon=false               ; start in foreground if true; default false
minfds=1024                  ; min. avail startup file descriptors; default 1024
minprocs=200                 ; min. avail process descriptors;default 200
;umask=022                   ; process file creation umask; default 022
;user=supervisord            ; setuid to this UNIX account at startup; recommended if root
;identifier=supervisor       ; supervisord identifier, default is ‘supervisor‘
;directory=/tmp              ; default is not to cd during start
;nocleanup=true              ; don‘t clean up tempfiles at start; default false
;childlogdir=/tmp            ; ‘AUTO‘ child log dir, default $TEMP
;environment=KEY="value"     ; key value pairs to add to environment
;strip_ansi=false            ; strip ansi escape codes in logs; def. false

; The rpcinterface:supervisor section must remain in the config file for
; RPC (supervisorctl/web interface) to work.  Additional interfaces may be
; added by defining them in separate [rpcinterface:x] sections.

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

; The supervisorctl section configures how supervisorctl will connect to
; supervisord.  configure it match the settings in either the unix_http_server
; or inet_http_server section.

[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL  for a unix socket
;serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket
;username=chris              ; should be same as in [*_http_server] if set
;password=123                ; should be same as in [*_http_server] if set
;prompt=mysupervisor         ; cmd line prompt (default "supervisor")
;history_file=~/.sc_history  ; use readline history if available

; The sample program section below shows all possible program subsection values.
; Create one or more ‘real‘ program: sections to be able to control them under
; supervisor.

;[program:theprogramname]
;command=/bin/cat              ; the program (relative uses PATH, can take args)
;process_name=%(program_name)s ; process_name expr (default %(program_name)s)
;numprocs=1                    ; number of processes copies to start (def 1)
;directory=/tmp                ; directory to cwd to before exec (def no cwd)
;umask=022                     ; umask for process (default None)
;priority=999                  ; the relative start priority (default 999)
;autostart=true                ; start at supervisord start (default: true)
;startsecs=1                   ; # of secs prog must stay up to be running (def. 1)
;startretries=3                ; max # of serial start failures when starting (default 3)
;autorestart=unexpected        ; when to restart if exited after running (def: unexpected)
;exitcodes=0                   ; ‘expected‘ exit codes used with autorestart (default 0)
;stopsignal=QUIT               ; signal used to kill process (default TERM)
;stopwaitsecs=10               ; max num secs to wait b4 SIGKILL (default 10)
;stopasgroup=false             ; send stop signal to the UNIX process group (default false)
;killasgroup=false             ; SIGKILL the UNIX process group (def false)
;user=chrism                   ; setuid to this UNIX account to run the program
;redirect_stderr=true          ; redirect proc stderr to stdout (default false)
;stdout_logfile=/a/path        ; stdout log path, NONE for none; default AUTO
;stdout_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB)
;stdout_logfile_backups=10     ; # of stdout logfile backups (0 means none, default 10)
;stdout_capture_maxbytes=1MB   ; number of bytes in ‘capturemode‘ (default 0)
;stdout_events_enabled=false   ; emit events on stdout writes (default false)
;stdout_syslog=false           ; send stdout to syslog with process name (default false)
;stderr_logfile=/a/path        ; stderr log path, NONE for none; default AUTO
;stderr_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB)
;stderr_logfile_backups=10     ; # of stderr logfile backups (0 means none, default 10)
;stderr_capture_maxbytes=1MB   ; number of bytes in ‘capturemode‘ (default 0)
;stderr_events_enabled=false   ; emit events on stderr writes (default false)
;stderr_syslog=false           ; send stderr to syslog with process name (default false)
;environment=A="1",B="2"       ; process environment additions (def no adds)
;serverurl=AUTO                ; override serverurl computation (childutils)

; The sample eventlistener section below shows all possible eventlistener
; subsection values.  Create one or more ‘real‘ eventlistener: sections to be
; able to handle event notifications sent by supervisord.

;[eventlistener:theeventlistenername]
;command=/bin/eventlistener    ; the program (relative uses PATH, can take args)
;process_name=%(program_name)s ; process_name expr (default %(program_name)s)
;numprocs=1                    ; number of processes copies to start (def 1)
;events=EVENT                  ; event notif. types to subscribe to (req‘d)
;buffer_size=10                ; event buffer queue size (default 10)
;directory=/tmp                ; directory to cwd to before exec (def no cwd)
;umask=022                     ; umask for process (default None)
;priority=-1                   ; the relative start priority (default -1)
;autostart=true                ; start at supervisord start (default: true)
;startsecs=1                   ; # of secs prog must stay up to be running (def. 1)
;startretries=3                ; max # of serial start failures when starting (default 3)
;autorestart=unexpected        ; autorestart if exited after running (def: unexpected)
;exitcodes=0                   ; ‘expected‘ exit codes used with autorestart (default 0)
;stopsignal=QUIT               ; signal used to kill process (default TERM)
;stopwaitsecs=10               ; max num secs to wait b4 SIGKILL (default 10)
;stopasgroup=false             ; send stop signal to the UNIX process group (default false)
;killasgroup=false             ; SIGKILL the UNIX process group (def false)
;user=chrism                   ; setuid to this UNIX account to run the program
;redirect_stderr=false         ; redirect_stderr=true is not allowed for eventlisteners
;stdout_logfile=/a/path        ; stdout log path, NONE for none; default AUTO
;stdout_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB)
;stdout_logfile_backups=10     ; # of stdout logfile backups (0 means none, default 10)
;stdout_events_enabled=false   ; emit events on stdout writes (default false)
;stdout_syslog=false           ; send stdout to syslog with process name (default false)
;stderr_logfile=/a/path        ; stderr log path, NONE for none; default AUTO
;stderr_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB)
;stderr_logfile_backups=10     ; # of stderr logfile backups (0 means none, default 10)
;stderr_events_enabled=false   ; emit events on stderr writes (default false)
;stderr_syslog=false           ; send stderr to syslog with process name (default false)
;environment=A="1",B="2"       ; process environment additions
;serverurl=AUTO                ; override serverurl computation (childutils)

; The sample group section below shows all possible group values.  Create one
; or more ‘real‘ group: sections to create "heterogeneous" process groups.

;[group:thegroupname]
;programs=progname1,progname2  ; each refers to ‘x‘ in [program:x] definitions
;priority=999                  ; the relative start priority (default 999)

; The [include] section can just contain the "files" setting.  This
; setting can list multiple files (separated by whitespace or
; newlines).  It can also contain wildcards.  The filenames are
; interpreted as relative to this file.  Included files *cannot*
; include files themselves.

[include]
files = conf.d/*.conf

supervisord.conf

这些便是要执行的配置。

如图,该好对应的配置,比如守护名称,命令,命令执行的目录,执行人权限啊。

相当于这配置,就是把我们的手动启动web的工作,交个这个文件,由守护进程去执行即可

DotNetCoreWeb.conf的代码:

[program:DotNetCoreWeb]
command=dotnet Bruke.VideoOnline.Web.dll ;
directory=/root/Bruke.VideoOnline.Web/ ;
autorestart=true ;
stderr_logfile=/var/log/DotNetCoreWeb.err.log ;
stdout_logfile=/var/log/DotNetCoreWeb.out.log ;
environment=ASPNETCORE_ENVIRONMENT=Production ;
user=root ;
stopsignal=INT

参考图中的备注:

最后启动  运行,查看是否生效

命令:supervisord

下面是执行配置,并守护到后台去。

supervisord -c /etc/supervisor/supervisord.conf

ps -ef | grep DotNetCoreWeb

至此。如果没报错,使用外网即可访问。

原文地址:https://www.cnblogs.com/Bruke/p/11621526.html

时间: 2024-10-12 19:55:38

.Net Core部署在Linux服务器:Nginx反向代理+Supervisor进程守护的相关文章

Linux中Nginx反向代理和负载均衡和LNMP架构上线网站

Nginx和Apache对比(重点): 1.轻量级,采用 C 进行编写,同样的 web 服务,会占用更少的内存及资源 2.nginx 处理静态文件好,静态处理性能比 apache 高三倍以上,apache 在处理动态请求有优势 3.nginx 作为负载均衡服务器,支持 7 层负载均衡 4.抗并发,nginx 以 epoll and kqueue 作为开发模型 nginx部署: 第一步:配置yum源(原基础上添加) [[email protected] ~]vim  /etc/yum.repos.

Linux系统——Nginx反向代理与负载均衡

集群集群是指一组(若干个)相互独立的计算机,利用高速通信网路组成的一个较大的计算机服务系统,每个集群节点(即集群中的每台计算机)都是运用各自服务的独立服务器.这些服务器之间可以彼此通信,协同向用户提供应用程序,系统资源和数据,并以单一系统的模式加以管理.当用户客户机请求集群系统时,集群给用户的感觉就是一个单一独立的服务器,而实际上用户请求的是一组集群服务器. 特点:(1)高性能用户通过Internet到公司的网关,网关通过防火墙,调载到前端的主负载均衡服务器上(有主有备,预防单点问题),主负载均

docker部署pgadmin4并通过nginx反向代理

1.通过docker直接拉取pgadmin4容器,并运行 docker pull dpage/pgadmin4 docker run -p 5050:80 -e "[email protected]" -e "PGADMIN_DEFAULT_PASSWORD=abc12345678" -d dpage/pgadmin4 2.nginx反向代理配置如下 使用80端口访问配置如下 listen 80; server_name _; location / { proxy_

【netcore基础】ubuntu 16.04 搭建.net core 2.1 linux 运行环境 nginx反向代理 supervisor配置自启动

m今天来整理下netcore在linux(ubuntu)上的运行环境搭建 对应版本 ubuntu 16.04 .net core 2.1 nginx version: nginx/1.10.3 (Ubuntu) supervisor 配置开机重启服务自启动 Supervisorhttp://supervisord.org/是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支持Windows系统.它可以很方便的监听.启动.停止.重启一个或多

Linux中Nginx反向代理下的tomcat集群

Nginx具有反向代理(注意和正向代理的区别)和负载均衡等特点. 这次Nginx安装在 192.168.1.108 这台linux 机器上.安装Nginx 先要装openssl库,gcc,PCRE,zlib库等. Tomcat 安装在192.168.1.168 和 192.168.1.178 这两台机器上.客户端通过访问192.168.1.108 反向代理访问到 192.168.1.168 和 192.168.1.178 里Tomcat 部署的工程内容. 1.Linux 下安装Nginx (机器

内网接口调用,ssh反向隧道与nginx反向代理

外网访问测试机. Windows机器使用SSH反向隧道.服务端使用反向代理 win下安装openssh-win并设置环境变量 打开cmd C:\Users\Administrator>ssh -p 22 -R 1999:localhost:8080 -b 0.0.0.0 [email protected] -R 1999远程机器的端口 -b 外网段监听,不加是 127.0.0.1监听 8080 本机端口 这样外网访问 8.8.8.8的1999端口就映射到了localhost的8080 服务器ng

ASP.NET Core 2.1发布/部署到Ubuntu并配置Nginx反向代理实现ip访问

一.准备 我用的是Ubuntu服务器器 [Ubuntu 18.04 x64] 和终端管理工具[Xshell] 二.安装 在服务器上安装.NET Core 三.部署程序 1.创建实例程序 可以直接使用.NET Core 的命令创建一个ASP.NET Core 示例网站应用程序,创建目录 /home/myuser/firstapp,执行命令: dotnet new mvc 接着,发布刚才创建的ASP.NET Core 网站发网站目录,所以,我们先创建一个网站发布目录:/var/www/firstap

Linux平台部署nginx反向代理实例

nginx有着优秀的代理性能,很多情况下,nginx常常被充当反向代理服务器负载后端应用web构建起一个高性能高可用的web集群(淘宝tengix ,京东的nginx集群都使用到了nginx反向代理功能),接下来给大家讲解Linux平台部署nginx反向代理实例. [本文档所介绍的内容适用于公司测试/生产等常见的nginx反向代理应用] 1. nginx环境部署前准备: 1.1相关软件以及系统 系统要求:Centos 6.0以上 (64位) 相关中间件:Nginx: 1.6.0 以上(包含1.6

NET Core站点部署到Linux服务器

.NET跨平台之旅:将QPS 100左右的ASP.NET Core站点部署到Linux服务器上 今天下午我们将生产环境中一个单台服务器 QPS(每秒请求数)在100左右的 ASP.NET Core 站点部署到了 Linux 服务器上,这是我们解决了在 .NET Core 上使用 EnyimMemcached(memcached客户端)的问题之后,.NET 跨平台之旅迈出的重要一步.这个 ASP.NET Core 站点,既用了缓存,也有数据库访问操作,是一个典型的 Web 站点,如果它能持续稳定运