Anaconda + Diangoを連携

# Anaconda + Diangoを連携

この記事では、Anaconda + Diangoを連携させLINEのBOTを作成します。かなりめんどくさいのでできるならやらないほうがいいです笑

環境を作成するところから書いていきます、それ以前の基本的なUbuntuの設定については済ませておいてください。

# 環境作成

## Apacheの環境作成

Apacheの環境を作成します。必要なものをインストール

    sudo apt-get install apache2 apache2-bin apache2-dev

## Anaconda のインストール

つぎにAnacondaをインストールします。

    wget https://repo.anaconda.com/archive/Anaconda3-2020.02-Linux-x86_64.sh
    
    sudo bash Anaconda3-2020.02-Linux-x86_64.sh

案内に従ってインストールしてください。（condaも認識するように）

次にAnacondaの設定をしていきます。Djangoをインストール。

    sudo conda install django

Djangoのバージョンは以下：

    python -m django --version
    3.0.3

## Django プロジェクト作成

次にDjanogのプロジェクトを作成していきます。チュートリアルページが参考になりました：[https://docs.djangoproject.com/ja/2.2/intro/tutorial01/](https://docs.djangoproject.com/ja/2.2/intro/tutorial01/)

今回は適当に以下で実行。

    django-admin startproject linebot

これで現在いるディレクトリ下にlinebotというフォルダが作られます。

    python manage.py runserver 0.0.0.0:8000

これでサーバーを起動することができますので、見てみるといいでしょう。

<img width="1043" alt="_2020-04-03_18.17.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475516/5612fee4-ede2-7acb-2a73-e5c2ae7d5a85.png">

ここから先はDjangoのアプリケーションを作成したり、チュートリアルを参考にしてください。（ここでは割愛します）

## DjangoとApacheの連携

次に一番の鬼門であるDjangoとApacheの連携をしていきます。これをするにはmod_wsgiというもので先程のDjangoとApacheを連携させます。

まずはインストール

    pip install mod_wsgi

次に、インストール先を見つけます。

    python -c "import sys; print(sys.path)"
    ['', '/home/vagrant/anaconda3/lib/python37.zip', '/home/vagrant/anaconda3/lib/python3.7', '/home/vagrant/anaconda3/lib/python3.7/lib-dynload', '/home/vagrant/.local/lib/python3.7/site-packages', '/home/vagrant/anaconda3/lib/python3.7/site-packages']

    (base) vagrant@vagrant:~/.local/lib/python3.7/site-packages/mod_wsgi/server$ ls
    __init__.py  apxs_config.py  management
    __pycache__  environ.py      mod_wsgi-py37.cpython-37m-x86_64-linux-gnu.so

環境によって異なりますが、今回はvagrantでやっていたので、このような場所にありました。

/etc/apache2/mods-available/wsgi.load にこのようにパスを記載します。

    LoadModule wsgi_module /home/vagrant/.local/lib/python3.7/site-packages/mod_wsgi/server/mod_wsgi-py37.cpython-37m-x86_64-linux-gnu.so

ついでに/etc/apache2/mods-available/wsgi.conf にもこのように記載します。

    <IfModule mod_wsgi.c>
        WSGIPythonHome /home/vagrant/anaconda3
        WSGIPythonPath /home/vagrant/anaconda3/bin
    </IfModule>

そしてwsgiを有効化します。

    sudo a2enmod wsgi
    
    Enabling module wsgi.
    To activate the new configuration, you need to run:
      systemctl restart apache2

このような表示が出たら大丈夫です。

次にサイトの設定ファイルを作っていきます。

/etc/apache2/sites-available/default-ssl.conf

    NameVirtualHost *:80
    
    <VirtualHost *:80>
        ServerName mikuaka.ddo.jp
     
        RewriteEngine on
        RewriteCond %{HTTPS} off
        RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
     
    </VirtualHost>
    
    NameVirtualHost *:443
    
    <IfModule mod_ssl.c>
    	<VirtualHost _default_:443>
    
        ServerAdmin your@name.com
        ServerName your.name.com
        ServerAlias www.your.name.com
    
        WSGIDaemonProcess name display-name=%{GROUP} user=www-data group=www-data python-path=/home/ubuntu/your/project
        WSGIProcessGroup name
    
        WSGIScriptAlias / /var/www/name/wsgi.py
    
        <Directory "/var/www/name">
            <Files wsgi.py>
                Require all granted
            </Files>
        </Directory>
    
        Alias /static/ /var/www/name/static/
    
        <Directory /var/www/name/static/>
            Require all granted
        </Directory>
    
    		ErrorLog ${APACHE_LOG_DIR}/error.log
    		CustomLog ${APACHE_LOG_DIR}/access.log combined
    
    		SSLEngine on
    		SSLCertificateFile	/etc/letsencrypt/live/your.name.com/cert.pem
    		SSLCertificateKeyFile	/etc/letsencrypt/live/your.name.com/privkey.pem
    		SSLCertificateChainFile /etc/letsencrypt/live/your.name.com/chain.pem
    		
    		<FilesMatch "\.(cgi|shtml|phtml|php)$">
    				SSLOptions +StdEnvVars
    		</FilesMatch>
    		<Directory /usr/lib/cgi-bin>
    				SSLOptions +StdEnvVars
    		</Directory>
    
    	</VirtualHost>
    </IfModule>

自分はこんな感じで作りました。↑はSSLの設定も入っています。

最後にapacheを再起動させます。

    sudo service apache2 restart

ということでいかがだったでしょうか？DjangoとApacheの連携はかなりめんどくさいのでやらないい事がわかっていただけたと思いますｗ

この環境を使いLINE Bot作成を作成しているので、余裕があればそちらも記事にできたらと思っています。