자택 서버용 라즈파이로 Python으로 LINE bot(HTTPS화)를 만든다(heroku, ngrok 사용하지 않는다) Apache(+wsgi)+Flask(Django에서도 같다?)

소개



아무것도 초보자이므로 설정에 90 %의 시간을 사용했습니다 ...
설정은 구체적으로
  • Python으로 웹 게시
  • 그것을 SSL화

  • 두 가지입니다.
    이것은 브라우저에서 https://<domainname>/testFlask 에서 파이썬으로 쓴 "Hello Flask!"를 볼 수 있도록하는 것입니다.
    이것만 가능하면 LINE API의 Webhook URL에 붙어 있으면 LINE bot은 할 수 있습니다.
    후에는 heroku 되어 ngrok 사용한 다른 기사를 참고해 주시면 좋겠습니다.

    체계





    위 그림과 같이 PHP로 쓰려고하면 Apache만으로 좋지만 Python으로 쓰고 싶었기 때문에 wsgi라는 모듈을 사용했습니다.
    htps : // 이 m / ぁ mp ぅ s / ms / 9877849d3108 2c6d0df

    사용한 모듈, 서비스


  • Apache2
  • LINE API
  • wsgi
  • Flask (Python 모듈)
  • Let's encrypt (SSL 인증서 발급 무료 서비스)

  • 디렉토리 구성


    /etc/
     |---apache2/
     |       |---ports.conf
     |       |---sites-available/
     |                |---flask.conf(新規作成)
     |
     |---letsencrypt
     |       |-...
     |       ...
     |
     |
    /home/
     |---t13m082h/
             |---ExampleFlask
                    |---my_flask_app.py (my_flask_app.wsgiでこれをimportする)
                    |---my_flask_app.wsgi (flask.confでこれを読み込ませる)
    
    

    각 모듈, 서비스 설치는 다른 기사 참고로



    아파치
    # apt-get
    $ sudo apt-get install apache2
    

    wsgi + Flask
    $ sudo apt-get install libapache2-mod-wsgi-py3 python-dev
    $ pip install flask
    $ pip install mod_wsgi
    

    Let's encrypt
    htps : // 피구이로. 에서 v / 2019/03/13 / et al. HTML

    Flask로 작성한 페이지를 웹 공개



    오류 로그는 항상
    $ sudo cat /var/log/apache2/access.log
    $ sudo cat /var/log/apache2/error.log
    

    에서 확인. (설정은 후술)

    포트 설정



    HTTP 리퀘스트를 받아들이는 것은 Apache이지만, 특정의 Listen하고 있는 포트에 온 리퀘스트를 wsgi로 처리하고 있다.
    우선, Listen하고 있는 포트를 설정.
    포트의 설정 파일은 /etc/apache2/ports.conf 에 정리하고 있다.

    /etc/apache2/ports.conf
    # If you just change the port or add more ports here, you will likely also
    # have to change the VirtualHost statement in
    # /etc/apache2/sites-enabled/000-default.conf
    
    Listen 80
    Listen 8000
    
    <IfModule ssl_module>
        Listen 443
        Listen 4443
    </IfModule>
    
    <IfModule mod_gnutls.c>
        Listen 443
        Listen 4443
    </IfModule>
    
    # vim: syntax=apache ts=4 sw=4 sts=4 sr noet
    
    

    wsgi 용으로 새로 4443 번 포트를 사용 (라우터 설정의 포트 포워딩의 설정도 잊지 않고)
    이제 4443번 포트에 온 HTTP 요청을 접수할 수 있게 되었다.
    덧붙여서, 포트 번호를 변경하고 싶을 때는
  • /etc/apache2/ports.conf
  • /etc/apache2/sites-available/flask.conf
  • 라우터 포트 포워딩

  • 의 3개소의 변경이 필요.

    wsgi 설정



    설정 파일은 /etc/apache2/sites-available 디렉토리의 conf 파일.
    전부 설정 후의 파일 내용은 이하. (SSL 증명서의 설정도 들어 있으므로 일부 읽어 주세요)
    conf 파일을 작성하는 방법
    htps : // Pau Lzny. 코 m / 세르 r ょ r / d 쟈고 / 2018/02/26 / ぇ - st-ko mp ぇ 테 - 아파치 2- 곤후 ぃ g ぉ rws 기드 쟈고 d-drf/

    /etc/apache2/sites-available/flask.conf
    (t13m082h は username)
    <IfModule mod_ssl.c>
    <VirtualHost *:4443>
         # Add machine's IP address (use ifconfig command)
         #ServerName <domain name>
         # Give an alias to to start your website url with
         WSGIScriptAlias /testFlask /home/t13m082h/ExampleFlask/my_flask_app.wsgi
         <Directory /home/t13m082h/ExampleFlask>
                # set permissions as per apache2.conf file
                Options FollowSymLinks
                AllowOverride None
                Require all granted
         </Directory>
    
         ErrorLog ${APACHE_LOG_DIR}/error.log
         LogLevel warn
         CustomLog ${APACHE_LOG_DIR}/access.log combined
    
         SSLEngine on
         Include /etc/letsencrypt/options-ssl-apache.conf
         SSLCertificateFile /etc/letsencrypt/live/<domain name>/fullchain.pem
         SSLCertificateKeyFile /etc/letsencrypt/live/<domain name>/privkey.pem
    </VirtualHost>
    </IfModule>
    

    설정을 보는 한 여기
    WSGIScriptAlias /testFlask /home/t13m082h/ExampleFlask/my_flask_app.wsgi
    

    에서 Aapache에서 wsgi로 받아들입니다.
    https:///testFlask에서 액세스할 수 있습니다.

    .py 파일



    my_flask_app.wsgi
    # /home/bin/python
    
    import logging
    import sys
    
    logging.basicConfig(stream=sys.stderr)
    sys.path.insert(0, '/home/t13m082h/ExampleFlask/')
    
    from my_flask_app import app as application
    
    

    my_flask_app.py
    # coding: utf-8
    from flask import Flask
    
    app = Flask(__name__)
    
    @app.route("/")
    def hello():
        return "Hello, Flask!"
    
    if __name__=="__main__":
        app.run()
    

    그리고 이전의 에러 로그 설정은 여기입니다.
         ErrorLog ${APACHE_LOG_DIR}/error.log
         LogLevel warn
         CustomLog ${APACHE_LOG_DIR}/access.log combined
    

    HTTPS화



    SSL 서명서의 발행은 여기로 끝나고 있는 전제로 합니다.
    즉, /etc/letsencrypt/live/<domain name>/ 디렉토리에 증명서가 놓여져 있는 것.
    앞서 언급했지만 이미 Let's encrypt에서 443번 포트를 SSL화하고 있었으므로, 4443번 포트에서 대기하고 https://<domain name>/testFlask/home/t13m082h/ExampleFlask로 리디렉션하고 있다.
    이전의 flask.conf 파일의 이쪽에서 설정.
         SSLEngine on
         Include /etc/letsencrypt/options-ssl-apache.conf
         SSLCertificateFile /etc/letsencrypt/live/<domain name>/fullchain.pem
         SSLCertificateKeyFile /etc/letsencrypt/live/<domain name>/privkey.pem
    

    Document root 변경할 위치


  • /etc/apache2/sites-availableWSGIScriptAlias<Directory>
  • my_flask_app.wsgisys.path.insert()

  • 다른 모듈, 서비스 노트



    ngrok(엔지락) ⇔ Let'script + 독자 도메인 + wsgi(위스기)



    ngrok 사용하면 8 시간 만료됩니다.
    8시간마다 다시 시작하는 스크립트를 작성해도 좋지만, 매번 URL이 바뀌어 버리므로 LINE API 설정의 Webhook URL도 매번 고쳐야 하는 것이 까다롭다.

    heroku(헤로쿠) ⇔ 집 서버(Raspberry Pi) + wsgi(위스기)



    무료로는 월에 1000시간 밖에 서버 가동시킬 수 없기 때문에, 가동시키고 싶은 Web 어플리케이션 늘어났을 때에 과금해야 한다.

    nginx (엔진 엑스) ⇔ apache



    Apache를 원래 사용하고 있었던 것과, 자신용의 서버이므로 많은 액세스도 없기 때문에 Apache로 충분.

    장고 (장고) ⇔ Flask



    Flask 쪽이 가벼운 것 같기 때문에.

    참고 URL



    htps : // 코 m / 오콧 8 / ms / 0f67753706cdc11f1cd
    htps : // 이 m / ぁ ぅ s / ms / 9877849d3108 2c6d0df
    htps //w w. 코멘과 r. 이오 / 아 b 히샤케 / 미니 마 l 아파치 ぇ コンフーp후 50아 7ft
    htps : // 하고 싶다 l. 코 m / 쿠에 s 치온 s / 78671
    htps : ///b-e-b-ck. k /? p=4601

    좋은 웹페이지 즐겨찾기