Nginx 뒤에 Golang 웹 애플리케이션 배포


지난주에 우리는 foray into Golang으로 시작했고 그곳에서 간단한 웹 응용 프로그램을 만들어'Hello world'노선에 서비스를 제공했다.우리가 일반적인 프로그래밍에서 벗어난 것에 끌리는 사람들에게 다음 논리에 맞는 문제는 어떻게 다른 사람들이 이 지식을 방문해서 유용하게 할 수 있는지이다.
우리는 지난주에 Golang의 추세를 이용하여 이 목표를 실현할 것이다. 예를 들어 Ubuntu와 같은 Go로 작성된 웹 응용 프로그램을 Linux 호스트에 배치할 것이다.Go 설치, systemctl 서비스 만들기, Nginx 설정에 이르기까지 모든 내용을 포함할 것입니다.너는 부회장 하나만 필요해.

설치


아직 그렇지 않은 경우 VPS에 Nginx가 설치되어 있는지 확인합니다.
$ apt update
$ apt upgrade -y
$ apt install nginx
Nginx 설치

Linux에 Go 설치


소스 코드를 통해 Go를 설치합니다.Go downloads page에서 Linux 릴리스에 필요한 Go 버전을 선택합니다.우리는 그것을/tmp 폴더에 다운로드하여 원본 코드를 만들고 원본 코드를 속한 위치로 이동합니다.
$ cd /tmp
$ wget https://dl.google.com/go/go1.14.3.linux-amd64.tar.gz
$ tar -xvf go1.11.linux-amd64.tar.gz
$ sudo mv go /usr/local
소스 코드에서 Go를 생성합니다.
Go 언어를 방금 패키지를 풀었고 Linux가 일반적으로 프로그래밍 언어를 보존하는 곳으로 옮겼습니다.이 경로는 다음과 같이 Go가 가리키는 GOROOT입니다.
/usr/local/go
├── AUTHORS
├── CONTRIBUTING.md
├── CONTRIBUTORS
├── LICENSE
├── PATENTS
├── README.md
├── SECURITY.md
├── VERSION
├── /api
├── /bin
├── /doc
├── favicon.ico
├── /lib
├── /misc
├── /pkg
├── robots.txt
├── /src
└── /test
GOROOT의 내용입니다.

셸 스크립트에 GOPATH 및 GOROOT 추가


Go를 설치하고 패키지를 해제했지만 운영 체제에 우리가 방금 이 점을 인식할 수 있는 방법은 아직 없습니다.우리는 셸 스크립트를 수정해서 이 점을 실현할 수 있다. 이 스크립트는 통상적으로 불린다.아웃라인:
$ vim ~/.profile
편집윤곽
여기서 GOROOT 및 GOPATH 파일 경로를 추가합니다.만약 당신이 기억하고 있다면, GOROOT는 우리의 운영체제가 Go프로그래밍 언어를 찾는 곳이다. GOPATH는 우리가 모든 Go 프로젝트와 의존항을 저장하는 작업 디렉터리이다.내 GOPATH to/go를 설정하기로 선택했습니다. 이것은 우리가 아직 만들지 않은 디렉터리입니다.
export GOPATH=/go
export GOROOT=/usr/local/go
export PATH=$PATH:$GOPATH
export PATH=$PATH:$GOROOT/bin
~/.윤곽
변경 사항을 저장하고 셸 스크립트를 활성화하려면:
$ source ~/.profile
활성화 ~/.윤곽
이제 모든 컨텐츠가 설치되어 있는지 확인할 수 있습니다.
$ go version
>> go version go1.14.3 linux/amd64
설치 확인

Gopath 및 프로젝트 설정


다음과 같은 디렉토리를 만드는 것과 마찬가지로 GOPATH를 수동으로 작성해야 합니다.
$ mkdir ~/go
$ mkdir ~/go/bin
$ mkdir ~/go/pkg
$ mkdir ~/go/src
지금 우리는 우리의 바둑 종목을 보존할 곳이 하나 생겼다!편의를 위해 지난주에 만든'Hello world'프로젝트를 취소합니다.
$ cd /go
$ go get github.com/hackersandslackers/golang-helloworld
go 항목 가져오기
또한 Github repo를 my/src 경로로 복제하여 GOPATH 구조를 다음과 같이 만듭니다.
/go
├── /bin
│   └── golang-helloworld
├── /pkg
└── /src
    └── /github.com
        └── /hackersandslackers
            └── /golang-helloworld
                ├── README.md
                ├── go.mod
                ├── go.sum
                ├── golang-helloworld
                ├── main.go
                └── main_test.go
GOPATH의 내용입니다.

Nginx 구성 만들기


너는 이전에 몇 번 해 보았을 수도 있지만, 어쨌든.응용 프로그램이 실행할 포트에 Ngnix 역방향 프록시를 설정합니다. 예시에서 이 포트는 9100 포트입니다.물론 이 포트를 먼저 활성화해야 합니다.
$ sudo ufw allow 9100
포트 열기
Nginx/sites-available 폴더에 구성 파일을 만듭니다.
$ sudo vim /etc/nginx/sites-available/golang-helloworld.conf
Nginx 구성 만들기
우리는 역방향 에이전트의 표준 견본을 여기에 놓을 것이다.내가 공교롭게도 이 응용 프로그램에서 사용한 도메인 이름은 golanghelloworld.hackersandslackers.app이다.선택한 도메인으로 대체하려면 다음과 같이 하십시오.
server {
   listen 80;
   listen [::]:80;

   server_name    golanghelloworld.hackersandslackers.app;

   location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $http_host;
        proxy_pass http://127.0.0.1:9100;
    }

    location ~ /.well-known {
        allow all;
    }

}
golang helloworld.형태
활성화된 사이트에서 사용할 수 있는 사이트에서 우리 파일에서sym 링크를 만들어서 이 설정을 활성화합니다.
$ sudo ln -s /etc/nginx/sites-available/golang-helloworld.conf /etc/nginx/sites-enabled/golang-helloworld.conf
Symlink Nginx 구성
마지막으로 이러한 변경 사항은 Nginx가 재부팅될 때 적용됩니다.다음 항목이 출력되지 않으면 지우기 상태임을 나타냅니다.
$ sudo service nginx restart
Nginx 재부팅

Certbot SSL


SSL을 추가하는 것은 이 강좌의 범위를 초과할 수 있지만, 어쨌든.Certbot은 SSL을 추가하는 것을 충분히 간단하게 합니다. 우리는 1분도 안 되는 시간 안에 그것을 완성할 수 있습니다.
Certbot을 실제로 설치하기 전에 적절한 저장소를 추가해야 합니다.
$ sudo apt-get update
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository universe
$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt-get update
Certbot PPA 저장소 추가
이제 Certbot을 실제로 설치할 수 있습니다.
$ sudo apt-get install certbot python3-certbot-nginx
Certbot 설치
Certbot CLI는 --nginx 플래그를 사용할 수 있으며 이 플래그는 기기에서 설정한 구성을 검색합니다.
$ certbot --nginx
Nginx 구성을 기반으로 인증서를 만듭니다.
그러면 기기의 각 Nginx 구성이 나열되고 SSL을 사용하여 어떤 응용 프로그램을 설정할지 알려 줍니다.나의 Ubuntu 기계는 공교롭게도 많은 웹 사이트를 가지고 있다.원하는 경우 다음 중 하나를 확인하십시오.
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator nginx, Installer nginx

Which names would you like to activate HTTPS for?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
1: broiestbro.com
2: www.broiestbro.com
3: consider.pizza
4: stockholm.ghostthemes.io
5: hackersandslackers.app
6: hackersandslackers.tools
7: django.hackersandslackers.app
8: flaskblueprints.hackersandslackers.app
9: flasklogin.hackersandslackers.app
10: flasksession.hackersandslackers.app
11: flasksqlalchemy.hackersandslackers.app
12: flaskwtf.hackersandslackers.app
13: plotlydashflask.hackersandslackers.app
14: www.hackersandslackers.tools
15: hustlers.club
16: www.hustlers.club
17: toddbirchard.app
18: golanghelloworld.hackersandslackers.app
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel): 
Certbot CLI
내가 찾는 설정은 #18이다.이 옵션을 선택하면 HTTP 트래픽을 HTTPS로 리디렉션해야 하는지 알려 줍니다. 이것은 당신이 절대로 해야 할 일입니다. (이렇게 하지 않을 이유가 있습니까? 아래 댓글에서 알려주고 like 단추를 누르는 것을 기억하십시오.)
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
Select the appropriate number [1-2] then [enter] (press 'c' to cancel):
Certbot CLI
옵션 2를 선택합니다.
Certbot이 우리 원래의 golang helloworld를 어떻게 수정하는지 보세요.Nginx 구성을 구성하려면:
server {

   server_name    golanghelloworld.hackersandslackers.app;

   location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $http_host;
        proxy_pass http://127.0.0.1:9100;
    }

    location ~ /.well-known {
        allow all;
    }

    listen [::]:443 ssl;
    listen 443 ssl;
    ssl_certificate /etc/letsencrypt/live/golanghelloworld.hackersandslackers.app/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/golanghelloworld.hackersandslackers.app/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

}

server {

    if ($host = golanghelloworld.hackersandslackers.app) {
        return 301 https://$host$request_uri;
    }

   listen 80;
   listen [::]:80;

   server_name    golanghelloworld.hackersandslackers.app;
    return 404;

}
golang helloworld.형태
이것이 바로 우리가 바라는 것이다.

Systemctl 서비스 만들기


만약 이전에 Systemctl 서비스를 사용한 적이 없다면,'서비스'는 우리가 서버에서 연속적으로 실행하기를 원하는 것입니다. (예를 들어 Nginx 자체가 서비스입니다.)Google은 서버가 재부팅되더라도 Google 응용 프로그램을 실행할 수 있도록 서비스를 만들 것입니다.
$ vim /etc/systemd/system/golanghelloworld.service
서비스 추가
Linux 서비스의 구문은 다음과 같습니다.ini 파일 형식입니다.여기에는 여러 가지 내용이 있습니다. 우리는 잠시 후에 분석을 진행할 것입니다.
[Unit]
Description=golanghelloworld.hackersandslackers.app
ConditionPathExists=/go/src/github.com/hackersandslackers/golang-helloworld
After=network.target

[Service]
Type=simple
User=root
Group=root

WorkingDirectory=/go/src/github.com/hackersandslackers/golang-helloworld
ExecStart=/go/src/github.com/hackersandslackers/golang-helloworld/golang-helloworld

Restart=on-failure
RestartSec=10

ExecStartPre=/bin/mkdir -p /var/log/golang-helloworld
ExecStartPre=/bin/chown syslog:adm /var/log/golang-helloworld
ExecStartPre=/bin/chmod 775 /go/src/github.com/hackersandslackers/golang-helloworld/golang-helloworld

[Install]
WantedBy=multi-user.target
golanghelloworld.서비스
다음은 위에서 설정한 주의할 만한 값입니다.
  • UserGroup: 아마도 세계에서 가장 좋은 생각은 아닐 것이다. 그러나 이것은 우리의 서비스가 Ubuntu 루트 사용자로 우리의 응용 프로그램을 실행하는 것을 알려준다.다른 Linux 사용자로 변경하십시오.
  • WorkingDirectory: 응용 프로그램에 서비스를 제공하는 작업 디렉터리입니다.
  • ExecStart: Go 프로젝트의 바이너리 파일 컴파일.
  • Restart & RestartSec: 이 값들은 의외의 상황에서 붕괴된 후에도 응용 프로그램을 계속 시작하고 사용할 수 있도록 하는 데 매우 유용합니다.이 두 값은 우리의 서비스가 10초에 한 번씩 실행되는지 확인하는 것을 알려 줍니다.프로그램이 마침 닫히면, 저희 서비스는 프로그램을 다시 시작합니다. 따라서 다시 시작하는 onfailure 값입니다.
  • ExecStartPre: 모든 줄에는 응용 프로그램을 시작하기 전에 실행할 명령이 포함되어 있습니다.우리는 세 개의 명령을 설정했다. 첫 두 개의 명령은 응용 프로그램이/var/log/golang Helloworld라는 디렉터리에 정확하게 로그인할 수 있도록 했다.세 번째 명령은 Go 바이너리 파일에 대한 권한을 설정합니다.
  • 서비스 파일을 저장합니다.다음은 시스템 서비스에 대한 변경 사항을 등록하고 새로운 서비스를 시작하며 시스템이 시작될 때 서비스를 실행할 수 있도록 합니다.
    $ systemctl daemon-reload
    $ service golanghelloworld start
    $ service golanghelloworld enable
    
    서비스 시작
    상황이 어떤지 봅시다.
    $ service golanghelloworld status
    
    서비스 상태 확인
    운이 좋으면 다음과 같은 성공적인 출력을 볼 수 있습니다.
    golanghelloworld.service - golanghelloworld.hackersandslackers.app
       Loaded: loaded (/etc/systemd/system/golanghelloworld.service; disabled; vendor preset: enabled)
       Active: active (running) since Fri 2020-05-29 01:57:02 UTC; 4s ago
      Process: 21454 ExecStartPre=/bin/chmod 775 /go/src/github.com/hackersandslackers/golang-helloworld/golang-helloworld (code=exited, status=0/SUCCESS)
      Process: 21449 ExecStartPre=/bin/chmod 775 /var/log/golang-helloworld (code=exited, status=0/SUCCESS)
      Process: 21445 ExecStartPre=/bin/chown syslog:adm /var/log/golang-helloworld (code=exited, status=0/SUCCESS)
      Process: 21444 ExecStartPre=/bin/mkdir -p /var/log/golang-helloworld (code=exited, status=0/SUCCESS)
     Main PID: 21455 (golang-hellowor)
        Tasks: 6 (limit: 4915)
       CGroup: /system.slice/golanghelloworld.service
               └─21455 /go/src/github.com/hackersandslackers/golang-helloworld/golang-helloworld
    
    서비스 상태

    디버그 Systemctl 서비스


    Linux 서비스를 만드는 불행한 사실은 많은 활동 부분이 작용하고 있다는 것이다.나는 내가 첫 번째 시도에서 어떤 잘못도 없이 새로운 서비스를 받은 적이 없다고 생각한다.이러한 오류에는 권한 오류, 파일 경로 오류 또는 포트 충돌이 포함됩니다.좋은 소식은 모든 문제가 쉽게 해결된다는 것이다.
    디버그 서비스의 첫 번째 방어선은 journalctl으로 모든 서비스의 로그 출력을 검사합니다.
    $ journalctl -u golanghelloworld.service
    
    서비스 로그 확인
    디버깅 문제의 불가결한 도구는 프로세스가 정상적으로 작동하는지 확인하는 grep입니다.이름이나 포트별로 활성 프로세스를 검색할 수 있습니다.journalctl 출력 포트 9100에서 사용 중인 오류의 경우 다음 절차를 통해 확인할 수 있습니다.
    $ ps aux | grep 9100
    
    포트 번호별 프로세스 검색
    우리는 kill -9 [PID]으로 되돌아오는 모든 프로세스를 죽일 수 있다.
    또는 프로세스 이름에 따라 회색으로 표시하여 응용 프로그램이 실행 중인지 확인할 수 있습니다.
    $ ps aux | grep golang-helloworld
    
    이름별 검색 프로세스
    필요한 경우 pkill -9 golang-helloworld을 사용하여 프로세스를 종료할 수 있습니다.
    변경할 필요가 있으면서비스 파일, 변경 사항을 얻기 위해 systemctl daemon-reload을 실행하고 service golanghelloworld restart을 실행하여 다시 시도하는 것을 기억하십시오.

    그곳을 떠나다


    나는 네가 문제를 해결하고 Go 프로그램을 시작하고 실행하는 데 성공할 것이라고 믿는다.나 자신도 약간의 시간을 썼지만, 나의 그 빌어먹을 좋은 세상은 이미 세워졌고, 그 모든 영광 속에서 here에 살고 있다.
    만약 당신이 해결할 수 없을 것 같은 문제에 부딪혔다면 언제든지 연락하세요.같이 해결할게요.

    좋은 웹페이지 즐겨찾기