개인 자료란 (JE)

  서버 커뮤니티

한국 마인크래프트 포럼

마인크래프트 자료 및 커뮤니티 플랫폼

전체 회원수 127,679명 ( +90명 )

※ 장기간 미활동 회원 제외

Profile 라고솔로가말했습니다 한마포 개발자란 담당자

SaidBySolo 8b58f951b6404b78ae3ba92d55d431f7

Profile

커뮤니티new 개발자란new 개발자 강좌new 일반 프로그래밍

후우... sanic이랑 nginx한테 다구리 맞은 썰푼다...

2020.09.06 조회 수 318 추천 수 0

107333f03b0abfb36d33073ab3522b3b.png아 형 말로하자 말로 내가 미안해

네 gcp에 sanic을 리버스프록시로 돌려서 nginx로 배포한 썰을 풀어볼꺼에요


일단 하나씩 집고 넘어가자고요


GCP = Google Cloud Platform

AWS, Azure같은곳입니다.

오늘 배포할곳은 f1-micro입니다.

미국리전 한정으로 평생동안 무료로쓸수있죠.


Sanic은 Flask-like한 마이크로 웹프레임워크입니다.

간단히 보면 flask를 비동기시킨거라 보시면됩니다.


nginx는 웹 서버 프로그램입니다.

사실 sanic으로도 열수있는데 정적인 파일관리하기는 이거만큼 편하게 없더라고요


일단 인스턴스부터만듭시다.

8b7d065b4aa0b87f0b76b5a9a0eee564.png

네 우분투로 쓰세요

순수 데비안 쓰면 파이썬 3.5밖에 지원안되더라고요

gcp나쁜놈 사실 사용자 문제


자 ssh 들가봅시다.

d6ed5124635b8f1fc33a9b7423fd7bde.pnggcp갓

GCP는 ssh를 웹에서 사용가능합니다

정말 편리하죠.


지금 제게 필요한것은 이렇게됩니다.


git: 소스코드 클론

nginx: 오늘의 메인디쉬

python 3.8 그리고 의존성: 파이썬 3.8로 소스코드를 짯으며, 대충 의존성은 aiohttp, sanic등등이 되겠네요

pip3: 의존성 설치를위해 꼭필요합니다.

certbot: https를 지원하기 위해 인증서를 받을겁니다.


일단 sudo apt update 를하여 패키지 목록을 업데이트 해줍시다

e96d375e71e5870da4be336c4f7bdaec.png

뭐가 주저리주저리뜨면 된겁니다 네


필요한것을받아봅시다.

sudo apt install python3-certbot-nginx nginx python3-pip 

우분투 20.04.1는 파이썬 3.8과 git이 이미 있더라고요 그래서 저는 저렇게만 썻어요

3d3385d3e289fb14e318fe547105d950.png물 한잔 떠오자고요

이제 한 1~2분이 지나면 설치가 됐을겁니다.

제일 먼저 해야할것은 일단 제 레포를 클론해서 서버를 여는일입니다.

git clone 레포주소.git 

66be99eb1771d92e033eba620aa87659.png그 와중에 비번틀려서 2번이나 다시시도함

클론이됐으면 서버를 열어보자고요

https://sanic.readthedocs.io/en/latest/sanic/nginx.html
대충 여기보면

from sanic import Sanic
from sanic.response import text

app = Sanic("proxied_example")
app.config.FORWARDED_SECRET = "YOUR SECRET"

@app.get("/")
def index(request):
    # This should display external (public) addresses:
    return text(
        f"{request.remote_addr} connected to {request.url_for('index')}\n"
        f"Forwarded: {request.forwarded}\n"
    )

if __name__ == '__main__':
    app.run(host='127.0.0.1', port=8000, workers=8, access_log=False)

이런식으로 되있는데 secret부분이 아무튼 중요하고 바꾸라네요 네 그래서 셋업 해두셔야합니다.

대충 호스트는  127.0.0.1 포트는 8000으로 두고 뭐 나머지도 따라쓰고 열어보면...

9fa8c03f793aceaa04fd57ea1289e94c.pngtlqkf 의존성 설치안했네

의존성이 설치가 안되어있는 모습을 볼수있습니다.

설치하자고요

sudo pip3 install -r requirements.txt 치고 다시 실행해보면...

0f198f0e995a620c9e078793f369a265.png열렸네

열렸네요 이제 저기서 CTRL+Z 를누르고 bg를 칩시다

백그라운드 작업으로 돌리자고요


이제 저희가할것은 대망의 nginx 세팅입니다.

기본적 세팅은 https://sanic.readthedocs.io/en/latest/sanic/nginx.html

해당 링크를 따라갈껀데 저거 그대로 따라가시면 뭥미??????  하고 던질수도있습니다.

그냥 저거 멀리하고 이걸 보시는걸 추천드립니다.

ㄹㅇ루


현재 까지 적용사항은 이렇습니다.

  1. 필요한 패키지 그리고 의존성 전부 설치완료.
  2. 도메인 연결 완료(저 같은 경우은 클플에 연결했어요 프록시 끄고 진행해주세요!)
  3. 서버열기 완료


nginx세팅 해봅시다.

sudo nano /etc/nginx/site-enabled/도메인주소

제 도메인은 doujinshiman.ga므로 

sudo nano /etc/nginx/site-enabled/doujinshiman.ga

가 되겠네요 쨋든 열면


fcf918fb9858e09357e00d87ac3ac1b3.png


이런 황량한 모습을 보실수있습니다.

여기다가 이제

server {
    listen 80;
    listen [::]:80;
    server_name domain_here;
    
    location / {
        proxy_pass http://127.0.0.1:8000/;
    }
}

domain_here에 여러분들 도메인 붙여넣으시면됩니다.

참고로 www.example.com 형식과 example.com 형식으로 저는 두개 넣었습니다.

ae3b2796f5a4b26ca23d17b20352a010.png

이런식으로요 이제 CTRL+X 누르시고 y하시고 엔터누르시면 저장된겁니다.


이제 인증서 받아봅시다.

sudo certbot --nginx -d example.com -d www.example.com 

만약 www. 안쓰시면 지우셔도 될겁니다 아마도...?
578217ea78d6e479e2a7ce85633cae55.png

일케뜰텐데 이제 메일주소 하고 적어주시면될겁니다.

311691f45e786d909aa1012bac255aa5.png

2번 써주세요 셋업때 다할거에요

fe33311b12a6e09bc7fbbe67182848ba.png나도 https쓸수 있단 이말이야!

와 인증서가 받아졌어요!

이제 남은건 세팅을 덮어 씌워야해요

upstream example.com {
  keepalive 100;
  server 127.0.0.1:8000;
  #server unix:/tmp/sanic.sock;
}

server {
  server_name example.com;
  listen 443 ssl http2 default_server;
  listen [::]:443 ssl http2 default_server;
  # Serve static files if found, otherwise proxy to Sanic
  location / {
    root /var/www;
    try_files $uri @sanic;
  }
  location @sanic {
    proxy_pass http://$server_name;
    # Allow fast streaming HTTP/1.1 pipes (keep-alive, unbuffered)
    proxy_http_version 1.1;
    proxy_request_buffering off;
    proxy_buffering off;
    # Proxy forwarding (password configured in app.config.FORWARDED_SECRET)
    proxy_set_header forwarded "$proxy_forwarded;secret=\"YOUR SECRET\"";
    # Allow websockets
    proxy_set_header connection "upgrade";
    proxy_set_header upgrade $http_upgrade;
  }
}

여기서  YOUR SECRET라고 된 부분을 아까 중요하다고 셋업 해둬야한다고 한곳에서 설정하신 그 비번을 바꾸시면되고

example.com  같은걸 전부 본인이 쓰실 도메인으로 바꿔줍시다.


다시  아까 처럼 sudo nano /etc/nginx/site-enabled/도메인주소 

여기서 중요합니다. 

524f9c332835182ddb7173bc4fb3443b.png


여기서 ssl_certificate와 key 그리고 include와 ssl_dhparam을 복사해줍니다.

복사하신후

upstream doujinshiman.ga {
  keepalive 100;
  server 127.0.0.1:8000;
  #server unix:/tmp/sanic.sock;
}

server {
  server_name doujinshiman.ga;
  listen 443 ssl http2 default_server;
  listen [::]:443 ssl http2 default_server;
  ssl_certificate /etc/letsencrypt/live/doujinshiman.ga/fullchain.pem; # managed by Certbot
  ssl_certificate_key /etc/letsencrypt/live/doujinshiman.ga/privkey.pem; # managed by Certbot
  include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
  ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
  # Serve static files if found, otherwise proxy to Sanic
  location / {
    root /var/www;
    try_files $uri @sanic;
  }
  location @sanic {
    proxy_pass http://$server_name;
    # Allow fast streaming HTTP/1.1 pipes (keep-alive, unbuffered)
    proxy_http_version 1.1;
    proxy_request_buffering off;
    proxy_buffering off;
    # Proxy forwarding (password configured in app.config.FORWARDED_SECRET)
    proxy_set_header forwarded "$proxy_forwarded;secret=\"THIS IS SECRET\"";
    # Allow websockets
    proxy_set_header connection "upgrade";
    proxy_set_header upgrade $http_upgrade;
  }
}

이런식으로 붙여넣어주고 이것도 붙여 넣습니다.

# Redirect all HTTP to HTTPS with no-WWW
server {
  listen 80 default_server;
  listen [::]:80 default_server;
  server_name ~^(?:www\.)?(.*)$;
  return 301 https://$1$request_uri;
}

# Redirect WWW to no-WWW
server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  server_name ~^www\.(.*)$;
  return 301 $scheme://$1$request_uri;
}

모두 끝냈다면 저장후 나옵시다.


하나만 붙여넣으면 끝납니다.

sudo nano /etc/nginx/conf.d/forwarded.conf 

# RFC 7239 Forwarded header for Nginx proxy_pass

# Add within your server or location block:
#    proxy_set_header forwarded "$proxy_forwarded;secret=\"YOUR SECRET\"";

# Configure your upstream web server to identify this proxy by that password
# because otherwise anyone on the Internet could spoof these headers and fake
# their real IP address and other information to your service.


# Provide the full proxy chain in $proxy_forwarded
map $proxy_add_forwarded $proxy_forwarded {
  default "$proxy_add_forwarded;by=\"_$hostname\";proto=$scheme;host=\"$http_host\";path=\"$request_uri\"";
}

# The following mappings are based on
# https://www.nginx.com/resources/wiki/start/topics/examples/forwarded/

map $remote_addr $proxy_forwarded_elem {
  # IPv4 addresses can be sent as-is
  ~^[0-9.]+$          "for=$remote_addr";

  # IPv6 addresses need to be bracketed and quoted
  ~^[0-9A-Fa-f:.]+$   "for=\"[$remote_addr]\"";

  # Unix domain socket names cannot be represented in RFC 7239 syntax
  default             "for=unknown";
}

map $http_forwarded $proxy_add_forwarded {
  # If the incoming Forwarded header is syntactically valid, append to it
  "~^(,[ \\t]*)*([!#$%&'*+.^_`|~0-9A-Za-z-]+=([!#$%&'*+.^_`|~0-9A-Za-z-]+|\"([\\t \\x21\\x23-\\x5B\\x5D-\\x7E\\x80-\\xFF]|\\\\[\\t \\x21-\\x7E\\x80-\\xFF])*\"))?(;([!#$%&'*+.^_`|~0-9A-Za-z-]+=([!#$%&'*+.^_`|~0-9A-Za-z-]+|\"([\\t \\x21\\x23-\\x5B\\x5D-\\x7E\\x80-\\xFF]|\\\\[\\t \\x21-\\x7E\\x80-\\xFF])*\"))?)*([ \\t]*,([ \\t]*([!#$%&'*+.^_`|~0-9A-Za-z-]+=([!#$%&'*+.^_`|~0-9A-Za-z-]+|\"([\\t \\x21\\x23-\\x5B\\x5D-\\x7E\\x80-\\xFF]|\\\\[\\t \\x21-\\x7E\\x80-\\xFF])*\"))?(;([!#$%&'*+.^_`|~0-9A-Za-z-]+=([!#$%&'*+.^_`|~0-9A-Za-z-]+|\"([\\t \\x21\\x23-\\x5B\\x5D-\\x7E\\x80-\\xFF]|\\\\[\\t \\x21-\\x7E\\x80-\\xFF])*\"))?)*)?)*$" "$http_forwarded, $proxy_forwarded_elem";

  # Otherwise, replace it
  default "$proxy_forwarded_elem";
}

사실 저도 저게뭔지 몰라요 그냥 넣으라니까 넣는거지


이제 default를 지워줍시다

sudo rm /etc/nginx/sites-enabled/default  

지워주신후

sudo nginx -s reload 

ngnix 리로드


이제 ngnix를 켜봅시다

sudo service nginx start 

네 이렇게 모든게 끝났어요

이제 도메인 들가보면...

10e776e1535d7ec108d75fdb3c769680.png완벽한거맞아요 저 메인 라우트에 암것도 안넣었어요

완벽하네요. sanic이 404를 띄워주고있습니다.

왜 404냐고요?

제가 지금 연서버는 api서버라 / 라우트에 지금은  뭘 넣을생각이없거든요.


그래도 불편하신 분들을 위해 보여드릴게요

26bd73dac70adeb2d98292b0c636214b.png무슨 api인지는비밀

모든게 의도적으로 작동하고있어요


이제 disown을 치고 나와주시면 됩니다.

그래야 ssh 나가도 안꺼지고 서버가 돌아갑니다.



여기까지 따라오시거나 혹은 읽어주셔서 감사합니다.


제가 기억해둘려고 적어두는곳이긴한데


이거보고 따라하실려는분에게 좀더 설명을 잘해드렸어야하는데 죄송하네요


아무튼 nginx (심한욕)



Warning
댓글이 없습니다.

새로운 댓글을 등록해 주세요!

컨텐츠
https://www.koreaminecraft.net/files/thumbnails/952/941/002/262x150.crop.jpg?20211128203943

답안지

한마탐 수능 / 등급컷 + 해설 8

베개냥이

2021-11-25

2

https://www.koreaminecraft.net/files/thumbnails/670/940/002/262x150.crop.jpg?20211124215847

답안지

한마탐 5주차 / 정오표 + 해설 1

베개냥이

2021-11-24

2

https://www.koreaminecraft.net/files/thumbnails/133/938/002/262x150.crop.jpg?20211123001841
마인크래프트로 만든 움직이는 루디브리엄 3

LittleCharlotte

2021-11-22

8