Nginx 와 결합 하여 asp net core 를 Linux (ubuntu) 에 배치 합 니 다. [마이크로소프트 공식 문서 번역 및 보충]

11541 단어
다음은 마이크로소프트 공식 설명 문서 의 원래 주 소 를 먼저 붙 입 니 다.https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/linux-nginx?view=aspnetcore-2.2
이 안내 서 는 우 분투 16.04 서버 에 asp. net core 환경 을 배치 하 는 방법 을 소개 한다.아래 지침 은 업 데 이 트 된 우 분투 버 전에 도 적 용 될 것 으로 보이 지만, 우 리 는 테스트 를 하지 않 았 다.
NOTE 는 Ubuntu 14.04 버 전에 대해 서 는 데 몬 supervisord 명령 을 사용 하여 Kestrel 프로 세 스 를 감청 하 는 것 을 권장 합 니 다. systemd 명령 은 Ubuntu 에서 사용 할 수 없습니다. 더 많은 Ubuntu 14.04 에 대한 설명 은 여 기 를 참조 하 십시오.
  • 기 존 asp net core 애플 리 케 이 션 을 리 버스 프 록 시 서버 에 배치 (Nginx)
  • 역방향 프 록 시 를 설정 하면 Kestrel 웹 서비스 에 전송 요청
  • 웹 프로그램 이 데 몬 에서 실행 되도록 확보
  • 웹 프로그램 을 다시 시작 할 수 있 도록 프로 세 스 관리 도 구 를 설정 합 니 다
  • 우 분투 16.04 서버 에 sudo 권한 을 가 진 표준 계 정 이 있 습 니 다.
  • 서버 에. NET Core Runtime 설치 튜 토리 얼 참조
  • 개 발 된 ASP. NET Core 응용 프로그램
  • ASP. NET Core 프로그램 전 체 를 발표 하고 복사 합 니 다.
    프로그램 이 로 컬 에서 실행 되 고 안전 한 연결 https 로 설정 되 지 않 으 면 다음 과 같은 방법 을 사용 하 십시오.
  • 보안 링크 설정, 자세 한 내용 은 HTTPS configuration
  • 참조
  • 파일 에서 Properties/launchSettings.json 속성 인자 applicationUrl 를 제거 https://localhost:5001개발 환경 에서 실행 dotnet publish 명령 을 실행 하여 응용 프로그램 을 publish 디 렉 터 리 에 포장 합 니 다.
    dotnet publish --configuration Release
    

    서버 에 배치 하지 않 고 프로그램 을 독립 적 으로 실행 시 키 려 면 이 곳 을 참조 하 십시오.
    포 장 된 프로그램, 예 를 들 어 publish / helloapp 는 helloapp 폴 더 를 SCP 나 SFTP 또는 다른 FTP 도 구 를 통 해 서버 에 복사 합 니 다. 일반 사이트 app 은 var / www 디 렉 터 리 에 두 고 ww 디 렉 터 리 가 존재 하지 않 으 면 자체 적 으로 만 드 십시오. 최종 디 렉 터 리 구 조 는 var / www / helloapp 입 니 다.
    응용 프로그램 테스트: 1. 명령 행 에서 응용 프로그램 을 실행 합 니 다. dotnet 2. 브 라 우 저 를 열 고 주소 표시 줄 에 입력 http://: 하여 브 라 우 저가 정상 적 인 내용 을 보 았 는 지 확인 하 십시오.
    이 사이트 에 문의 할 수 없 는 사이트 가 생기 면 프 록 시 서버 와 방화벽 을 확인 하 십시오.
  • 서버 의 보안 그룹 정책 을 보고 방화벽 이 대응 하 는
  • 에 접근 할 수 있 도록 확보한다.
  • 응용 프로그램 이 기본 설정 을 사 용 했 을 수도 있 습 니 다. 서버 에 기본 으로 배 치 된 설정 감청 은 http://localhost:5000 입 니 다. 이 곳 의 localhost 는 질문 을 할 수 없습니다. http://127.0.0.1:5000 또는 http://0.0.0.0:5000 응용 프로그램 개발 시 Program. cs 파일 에서 Start Up 을 시작 하기 전에 호출 UseUrls("http://*:5000") 또는 UseUrls("http://127.0.0.1:5000")
  • 할 수 있 습 니 다.
    메모: Nginx 리 버스 에이 전 트 를 사용 하 는 것 을 확인 하면 http://localhost:5000 접근 할 수 없 더 라 도 영향 을 주지 않 습 니 다. 추가 설정 nginx 에이 전 트 를 통 해 접근 할 수 있 습 니 다.
    public class Program
        {
            public static void Main(string[] args)
            {
                CreateWebHostBuilder(args).Build().Run();
            }
    
            public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
                WebHost.CreateDefaultBuilder(args)
                    .UseUrls("http://*:5000")
                    .UseStartup();
        }
    

    역방향 프 록 시 설정
    역방향 대 리 는 동적 웹 애플 리 케 이 션 에 자주 사용 되 는 설정 입 니 다.역방향 에이 전 트 는 HTTP 요청 을 종료 하고 ASP. NET Core 프로그램 에 전송 합 니 다.
    역방향 에이전트 사용
    Kestrel 은 ASP. NET 핵심 에서 온 동적 콘 텐 츠 에 서 비 스 를 제공 하기에 매우 적합 하 다.그러나 웹 서비스 기능 은 IIS, Apache, nginx 등 서버 처럼 풍부 하지 않다.역방향 프 록 시 서버 는 HTTP 서버 에서 서비스 정적 내용, 캐 시 요청, 압축 요청, HTTPS 종료 등 을 마 운 트 해제 할 수 있 습 니 다.역방향 프 록 시 서버 는 전용 컴퓨터 에 머 물 수도 있 고 HTTP 서버 와 함께 배치 할 수도 있다.
    이 매 뉴 얼 에 서 는 nginx 인 스 턴 스 만 사용 합 니 다.HTTP 서버 와 함께 같은 서버 에서 실 행 됩 니 다.필요 에 따라 다른 설정 을 선택 할 수 있 습 니 다.
    요청 은 역방향 대리 로 전달 되 기 때문에 microsoft.aspnetcore.httpoverrides 가방 에서 온 퍼 가기 헤드 중간 부품 을 사용 하 십시오.미들웨어 사용 x-forwarded-proto 헤드 업데이트 request.scheme 를 사용 하여 URI 와 다른 보안 정책 이 정상적으로 작 동 하도록 합 니 다.
    인증, 링크 생 성, 재 설정, 지리 적 위치 등 프로젝트 에 의존 하 는 모든 구성 요 소 는 퍼 가기 헤드 미들웨어 를 호출 한 후에 설정 해 야 합 니 다.일반적인 상황 에서 진단 과 오류 처리 중간 부품 을 제외 하고 전송 헤드 중간 부품 은 모두 다른 중간 부품 보다 먼저 운행 해 야 한다.이 정렬 은 퍼 가기 헤드 정보 에 의존 하 는 중간 부품 을 header values 로 처리 할 수 있 도록 합 니 다.
    Startup. cs 파일 의 Configure () 방법 에서 useForwardedHeaders 방법 을 호출 하고 useAuthentication 또는 유사 한 인증 방안 미들웨어 를 호출 하기 전에 설정 해 야 합 니 다.중간 부품 을 설정 하여 전송 x-forwarded-forx-forwarded-proto 헤드:
    //     ,    nginx   .netcore  ,         ,    netcore       IP  ,      
    app.UseForwardedHeaders(new ForwardedHeadersOptions
    {
        ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
    });
    
    #           
    app.UseAuthentication();
    

    미들웨어 에 Forward HeadersOptions 를 지정 하지 않 았 다 면, 기본적으로 전송 할 머리 는 none 입 니 다.
    기본 적 인 상황 에서 전송 주소 (127.0.0.0 / 8, [: 1] 에서 실행 되 는 에이전트 (표준 로 컬 호스트 주소 (127.0.0.1 포함) 는 신뢰 를 받 습 니 다.조직 내 다른 신뢰 프 록 시 나 인터넷 처리 인터넷 과 웹 서버 간 요청 이 있 으 면 ForwardedHeaders 옵션 이 있 는 KnownProxies 또는 KnownNetworks 목록 에 추가 하 십시오.다음 예제 에 서 는 IP 주 소 를 10.0.0.100 인 신뢰 받 는 프 록 시 서버 를 Startup. cs 파일 의 Configure Services () 방법 에 있 는 퍼 가기 헤드 미들웨어 Known Proxies 에 추가 합 니 다.
    services.Configure(options =>
    {
        options.KnownProxies.Add(IPAddress.Parse("10.0.0.100"));
    });
    

    더 많은 역방향 에이전트 와 부하 균형 설정 을 참조 하 십시오.
    Nginx 설치
    apt - get 을 사용 하여 nginx 를 설치 합 니 다.설치 프로그램 은 시스템 이 시 작 될 때 nginx 를 데 몬 으로 실행 하 는 systemd init 스 크 립 트 를 만 듭 니 다.nginx 의 Ubuntu 설치 설명 에 따 르 면 공식 debian / Ubuntu 패키지 입 니 다.
    Note 선택 할 수 있 는 nginx 모듈 이 필요 하 다 면 원본 코드 에서 nginx 를 구축 해 야 할 수도 있 습 니 다.
    PS:   CentOS  ,     sudo yum install nginx   nginx
    

    nginx 는 처음 설치 되 었 기 때문에 다음 명령 을 실행 하여 명시 적 으로 시작 하 십시오.
    sudo service nginx start
    
    ##         ,   
    systemctl enable nginx.service
    

    nginx 를 ASP. NET 핵심 프로그램 에 전송 을 요청 하 는 역방향 에이전트 로 설정 하려 면 / etc / nginx / sites - available / default 를 텍스트 편집기 에서 열 고 해당 하 는 server 노드 부분 을 다음 내용 으로 바 꾸 십시오.
    Nginx 설정
    server {
        listen        80;
        server_name   example.com *.example.com;
        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;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header   X-Forwarded-Proto $scheme;
        }
    }
    
    PS:   CentOS  ,     /etc/nginx/nginx.conf  
    

    server 없 으 면name 서버 이름 이 일치 할 때 nginx 는 기본 서버 를 사용 합 니 다.기본 서버 가 정의 되 지 않 으 면 설정 파일 의 첫 번 째 서버 는 기본 서버 입 니 다.가장 좋 은 실천 으로 특정한 기본 서버 를 추가 합 니 다. 이 서버 는 설정 파일 에서 상태 코드 404 를 되 돌려 줍 니 다.기본 서버 설정 예제:
    server {
        listen   80 default_server;
        # listen [::]:80 default_server deferred;
        return   404;
    }
    

    앞의 프로필 과 기본 서버 에 대해 nginx 는 호스트 헤드 example. com 또는 *. example. com 의 포트 80 의 공공 트 래 픽 을 받 습 니 다.이 호스트 와 일치 하지 않 는 요청 은 kestrel 로 전송 되 지 않 습 니 다.nginx 는 일치 하 는 요청 을 kestrel 로 전송 합 니 다. 사이트 주 소 는?http://localhost:5000。더 많은 정보 에 대해 서 는 nginx 가 요청 을 어떻게 처리 하 는 지 참조 하 시기 바 랍 니 다.Kestrel 의 IP / 포트 를 변경 하려 면 Kestrel: 터미널 설정 을 참조 하 십시오.
    nginx 설정 이 만들어 지면 설정 파일 의 문법 을 검증 하기 위해 실행 sudo nginx -t 합 니 다.설정 파일 테스트 에 성공 하면 실행 sudo nginx -s reload 을 통 해 nginx 를 강제로 변경 합 니 다.
    서버 에서 프로그램 을 직접 실행 하려 면 다음 작업 을 수행 하 십시오. 1. app 이 있 는 디 렉 터 리 로 이동 2. 명령 실행 dotnet .dll서버 에서 프로그램 이 실행 되 고 있 지만 인터넷 으로 응답 할 수 없다 면 서버 의 방화벽 을 확인 하고 포트 80 이 열 렸 는 지 확인 하 십시오.Azure Ubuntu VM 을 사용한다 면 입 소 포트 80 트 래 픽 을 사용 하 는 네트워크 보안 그룹 (NSG) 규칙 을 추가 하 십시오.출구 포트 80 규칙 을 사용 할 필요 가 없습니다. 입 소 규칙 을 사용 할 때 자동 으로 출구 트 래 픽 을 부여 하기 때 문 입 니 다.
    모니터링 응용 프로그램
    서버 설정 은 http: / /: 80 요청 으로 전송 합 니 다.http://127.0.0.1:5000위의 Kestrel ASP. NET 핵심 응용 프로그램 처리, http: /: 80.그러나 nginx 는 Kestrel 프로 세 스 를 관리 하 는 것 으로 설정 되 지 않 았 습 니 다.systemd 기본 웹 프로그램 을 시작 하고 감시 하기 위해 서비스 파일 을 만 드 는 데 사용 할 수 있 습 니 다.systemd init 시스템 으로 시작, 정지, 관리 프로 세 스 에 강력 한 기능 을 제공 합 니 다.
    서비스 파일 생 성
    서비스 정의 파일 만 들 기
    sudo nano /etc/systemd/system/kestrel-myapp.service
    

    다음은 테스트 파일 입 니 다.
    [Unit]
    Description=WebAPI On Linux                                                               #      
    
    [Service]
    WorkingDirectory=/var/www/myapp                                                     #    
    ExecStart=/usr/bin/dotnet /var/www/myapp/myapp.dll                         #           
    Restart=always                                                                                      #    
    # Restart service after 10 seconds if the dotnet service crashes:
    RestartSec=10                                                                                      #    
    KillSignal=SIGINT                                                                                 #Kill  
    SyslogIdentifier=dotnet-example                                                          #      
    User=root                                                                                              #  
    Environment=ASPNETCORE_ENVIRONMENT=Production
    Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
    
    [Install]
    WantedBy=multi-user.target
    

    Note Linux 에는 대소 문 자 를 구분 하 는 파일 시스템 이 있 습 니 다.ASPNETCOREENVIRONMENT = Production 은 apptsettings. Production. json 이 아 닌 검색 프로필 apptsettings. production. json 을 가 져 옵 니 다.
    파일 을 저장 하고 서 비 스 를 사용 합 니 다:
    sudo systemctl enable kestrel-myapp.service
    

    서 비 스 를 시작 하고 실행 중인 지 확인 합 니 다.
    sudo systemctl start kestrel-myapp.service
    sudo systemctl status kestrel-myapp.service
    

    역방향 프 록 시 를 설정 하고 systemd 를 통 해 kestrel 을 관리 한 후 웹 프로그램 이 완전히 설정 되 어 로 컬 컴퓨터 의 브 라 우 저 (http://localhost) 방문 하 다.방화벽 에 막 히 지 않 는 한 원 격 기기 로 도 접근 할 수 있다.응답 헤드 를 검사 할 때 서버 헤드 에 Kestrel 이 서 비 스 를 제공 하 는 ASP. NET 핵심 프로그램 이 표 시 됩 니 다.
    접근 로그
    kestrel 을 사용 하 는 웹 프로그램 은 systemd 로 관리 되 기 때문에 모든 이벤트 와 프로 세 스 가 집중 적 인 로그 에 기 록 됩 니 다.단, 이 로 그 는 systemd 가 관리 하 는 모든 서비스 와 절차 의 모든 항목 을 포함 합 니 다.kestrel - helloapp. service 특정 항목 을 보 려 면 다음 명령 을 사용 하 십시오.
    sudo journalctl -fu kestrel-myapp.service
    

    For further filtering, time options such as --since today , --until 1 hour ago or a combination of these can reduce the amount of entries returned.
    sudo journalctl -fu kestrel-myapp.service --since "2016-10-18" --until "2016-10-18 04:00"
    

    추가: CentOS 7 에서 슈퍼 바 이 저 데 몬 사용 하기
    yum 을 통 해 슈퍼 바 이 저 를 설치 합 니 다. python pip 를 사용 하여 설치 하면 python 2 버 전 을 확보 하 는 것 이 좋 습 니 다. python 3 은 현재 슈퍼 바 이 저 를 사용 할 수 있 지만 pip 를 통 해 설치 하면 이상 이 발생 할 수 있 습 니 다.
    yum install supervisor
    

    데 몬 정보 설정
       supervisord.d  ,     ini     supervisor          
    cd /etc/supervisord.d
    
    #      supervisor .ini    
    touch myappserver.ini
    

    vim myappserver.ini
    #             ,     
    [program:myappserver]                          #             ,supervisord           
    directory=/var/www/myapp                     #    ,          
    command=dotnet        .dll     #     
    environment=ASPNETCORE__ENVIRONMENT=Production
    user=root
    stopsignal=INT
    autostart=true
    autorestart=true
    startsecs=10                                             #                
    stderr_logfile=/var/log/myappserver.err.log    
    stdout_logfile=/var/log/myappserver.out.log
    

    슈퍼 visord 데 몬 을 시작 합 니 다. 시작 하면 슈퍼 visord. d 디 렉 터 리 에 있 는 ini 파일 을 실행 합 니 다.
    supervisord -c /etc/supervisord.conf
    

    부팅 데 몬 슈퍼 visord 설정
    systemctl enable supervisord.service
    

    supervisord 다시 시작
    supervisorctl reload  
    

    좋은 웹페이지 즐겨찾기