django2をec2のapache2.4のvirtualhostで動かすhttpd.conf

django2をec2で動かしたいけど、apache2.4はすでに走っていてPHPのサイトがある、のでvirtualhostでdjango動かすというのが何とか起動まで確認できました。

LoadModule wsgi_module /var/www/project/venv/lib/python3.7/site-packages/mod_wsgi/server/mod_wsgi-py37.cpython-37m-x86_64-linux-gnu.so
WSGISocketPrefix run/wsgi
<VirtualHost *:80>
    ServerName hoge.com
    WSGIDaemonProcess hoge.com python-path=/var/www/project/mysite python-home=/var/www/project/venv/
    WSGIProcessGroup hoge.com
    WSGIScriptAlias / /var/www/project/mysite/mysite/wsgi.py

    DocumentRoot "/var/www/project/mysite/mysite"
    <Directory "/var/www/project/mysite/mysite">
        <Files wsgi.py>
            Require all granted
        </Files>
    </Directory>

    Alias /static /var/www/project/mysite/static
    <Directory "/var/www/project/mysite/static">
        Require all granted
    </Directory>
</VirtualHost>

もともとvirtualhostは動いてますのでそこの設定は省略で。
気をつけるところは、

WSGIDaemonProcess hoge.com python-path=/var/www/project/mysite python-home=/var/www/project/venv/

ではないでしょうか。python-pathもpython-homeもいるのに気付かず、venv環境が読めていなかったのと、
Directoryの中に設定を置いて、

Syntax error on line 4 of /etc/httpd/conf.d/11-django.conf:
WSGIDaemonProcess not allowed in context

などと怒られたりしていました。何にしろphpもpythonも同じapacheで動いているので節約できる・・のですが、やはりこんなことはあまりしたくないですね笑

albで繋がりにくいことがあるのを解消

AWSでケチケチ設計だとALBにインスタンス1つしかぶら下げてない、みたいなことあるじゃないですか。
そんな運用でどうにも接続が遅いときがあったんです。気がつくと繋がってる、みたいな。

EC2(http) <-> ALB(https) <-> the Internet

なんですが、

ロードバランサー属性のhttp/2がよくない!と聞き、それをoffにしたがあまり変わらず。。

問題は

アベイラビリティゾーンの選択で2つサブネットを選ぶところ、1つのサブネットがPrivateだったのが駄目、なのでした。

どうせ1つしかインスタンスつなげてないので、それにアクセスできるサブネットがPublicだったらいいじゃないか、と思いますよね?(浅はか)

もう1つpublicなサブネットを作り、2つともpublicなものにしたら直しました。メモメモ。

EC2のタイムゾーンを日本に変更

昔は設定ファイルを色々変えてた記憶があるのですが、今は設定ファイルをコピーするのがベターなんですかね?

cp /usr/share/zoneinfo/Japan /etc/localtime

シンボリックリンクを貼るだけでもいいらしいですが、まあ。

django2をapache2 @ ec2 で動かす。

django2をec2のapacheで動かします。とりあえずvenvを起動。

python用、pip用にyumで色々入れます。

$ sudo yum install python3 python3-devel gcc make httpd-devel

今回mysqlも使っていたのでこれも。

$ sudo yum install mysql-devel

$ pip install -r requirements.txt

使っているpkgによっては他にも色々入れなくてはいけないでしょうね。

django2.0でapache2で動かす。

djangoでapacheでlocalhostで動かしてみよ、と思っただけで、数時間経過しました笑
いやー、本当このあたりがややこしくて面倒ですね。私みたいにここでへこたれそうな人たちのためにメモを残しておきます。
とりあえず今起動まで出来た設定です。
こういうの考えるとPHPはいかに優しいかというのが身にしみますね。

・プロジェクトのために作ったディレクトリ:project
project
–project
–mysite
–blog
–static
みたいな感じですね。
・venvの環境:venv

として読み替えてください。

httpd.confに、

LoadModule wsgi_module /usr/local/var/www/project/venv/lib/python3.7/site-packages/mod_wsgi/server/mod_wsgi-py37.cpython-37m-darwin.so
WSGIScriptAlias / /usr/local/var/www/project/project/wsgi.py
WSGIPythonPath /usr/local/var/www/project/venv/lib/python3.7/site-packages
WSGIPythonHome /usr/local/var/www/project/venv
WSGIDaemonProcess localhost python-path=/usr/local/var/www/project/project
WSGIProcessGroup localhost

DocumentRoot "/usr/local/var/www/project/project"
<Directory "/usr/local/var/www/project/project">
    <Files wsgi.py>
    Require all granted
    </Files>
</Directory>

Alias /static /usr/local/var/www/project/static
<Directory /usr/local/var/www/project/static>
  Require all granted
</Directory>

です。
どれが何の設定、というのはおいおい追っていきます・・

あ、後、mysqlを動かすためにpipで

PyMySQL

を入れていたのですが、apacheだと、

mysqlclient

を要求されたので、pip installしました。

homebrewのapacheが分かりやすくなってた

久々にmacのhomebrewでapache起動したら、起動方法分かりやすくなってますね。apacheというかbrewのupdateですね。upgradeしたら、

The default ports have been set in /usr/local/etc/httpd/httpd.conf to 8080 and in
/usr/local/etc/httpd/extra/httpd-ssl.conf to 8443 so that httpd can run without sudo.

To have launchd start httpd now and restart at login:
brew services start httpd
Or, if you don’t want/need a background service you can just run:
apachectl start

brew services start hoge
なんてのが出来たんですね。

$ brew services start httpd
==> Tapping homebrew/services
Cloning into ‘/usr/local/Homebrew/Library/Taps/homebrew/homebrew-services’…
remote: Enumerating objects: 14, done.
remote: Counting objects: 100% (14/14), done.
remote: Compressing objects: 100% (10/10), done.
remote: Total 14 (delta 0), reused 9 (delta 0), pack-reused 0
Unpacking objects: 100% (14/14), done.
Tapped 1 command (44 files, 58.7KB).
==> Successfully started `httpd` (label: homebrew.mxcl.httpd)

はー楽。今まで設定ファイルをload、unloadしてたのは格好悪いなと思ってたんですよね笑

Safariでエラー(NSPOSIXErrorDomain:100)が出たり、他のブラウザでもSSL通信で繋がりにくかったりした

何か繋がりにくい、となっていたhttpsのサイトが、mac high sieraのSafariでエラー「NSPOSIXErrorDomain:100」が出てびっくり。
他のブラウザでも繋がりにくかったりした。
どうも、Apacheからのhttp2用ヘッダーが届いたりプロキシ経由で削除されたりで失敗するらしい・・

https://qiita.com/ameyamashiro/items/8d4be0f11ffe12472052

ALBでhttp/2の属性をオフにすることで対処。

Djangoでは常にカスタムUserを使用すべき

まさに仰るとおりだと思ったのでメモります。

https://qiita.com/NAKKA-K/items/7627b6a22f364941b989

最近物忘れがひどく笑

まだsuperuser以外のユーザを作ったこともないですが、大事だと思った。

そして、カスタム例としては

https://qiita.com/okoppe8/items/10ae61808dc3056f9c8e

で。参考になります。

DjangoでAttributeError: ‘str’ object has no attribute ‘tzinfo’が出たら

AttributeError: ‘str’ object has no attribute ‘tzinfo’

ってエラーで、

・既存のテーブルをmodel.pyで使ってるから何かおかしかった?
・TimeZoneがAsia/Tokyoだから models.pyの models.DateTimeFieldの中で特殊なことをしなくてはいけない?

など色々考えたのですが、models.DateTimeFieldとか使う場合には、

from django.utils import timezone

がいる、というだけなのですよね・・(汗

散々検索してしまった。同じような人のためにメモを残しておきます。

mysql 8.0 にCSV(TSV)を流し込めない

表題の通り、mysql 8.0 にTSVを流し込めなかったのです。

ERROR 1148 (42000): The used command is not allowed with this MySQL version

バージョンはhomebrewで入れた8.0.12

mysql> select version();
+———–+
| version() |
+———–+
| 8.0.12 |
+———–+
1 row in set (0.01 sec)

で、クライアントとサーバに local_infile=1 を設定することで出来るようになりました。

$ mysql -u root –local_infile=1

mysql> SELECT @@local_infile;
+—————-+
| @@local_infile |
+—————-+
| 0 |
+—————-+
1 row in set (0.01 sec)

mysql> SET persist local_infile=1;

mysql> SELECT @@local_infile;
+—————-+
| @@local_infile |
+—————-+
| 1 |
+—————-+
1 row in set (0.00 sec)

セキュリティ的なことですかね。流し込めなくなったのは。