[Lv3] ft_server
【ft_serverってどう実装するの?実装例】
Q.そも、何ができたらゴール?
A.https://localhost/wordpress
にアクセスしてユーザ登録できること。ローカルサーバ立てて、wordpress開設する。
Q. 環境は?
素直にVMが最善です。Dockerも入ってます。ローカルの環境差は厄介かもしれません。
それでもローカルでやる場合は、まず自分のOSに合ったDockerをインストールから始めます。チュートリアルもほどほどに。
【Docker起動しない(Windows10)】
A.VMと競合してるかも。CMDを管理者として実行。
・VirtualBox を起動させたいとき(Hyper-V無効化)、以下のコマンドを実行し Windows の再起動を行う。
bcdedit /set hypervisorlaunchtype off
・Docker を起動させたいとき(Hyper-V 有効化)は、以下のコマンドを実行し Windows の再起動を行う。
bcdedit /set hypervisorlaunchtype auto
0. 【ft_serverのすすめかた】
https://qiita.com/pottava/items/452bf80e334bc1fee69a
0. 【hkamiyaさん資料】https://www.evernote.com/l/AGGJD4TjgVBJSbQDAA9Gpi3BheCeAc2GGoM/
0. 【hkamiyaさんレビュー手引き】
https://www.evernote.com/l/AGGEFXXP5khBqIFG9zAowbfeUpMszW6eoDY/
1. まっさらなdebianのimageを作成。
ファイル名[Dockerfile]を作成し、以下を記述します。
これはLinuxのdebianなるOSを指定するコマンド。#はコメントアウト。
# get image
FROM debian:buster
# keep move
CMD tail -f /dev/null
Q. tail -f /dev/null?
A.コンテナを起動させ続けるためのタスク。
もしタスクが何もないと、コンテナは実行直後exitしてしまう。
ちなみにtail -f は指定した階層の標準出力待機。
本来の使用例は、tail -f /var/log/nginx/access.log とすれば、wordpressのアクセスと同時に、コマンドプロンプトにアクセスログが出力される。
docker build -t <image名> .
docker images
2. コンテナを起動。ここで仕事してく。
# コンテナの起動
docker run -d -p 8080:80 -p 443:443 <image名>
# コンテナ一覧
docker ps -a
# コンテナの中に入る
docker exec -it [CONTAINER ID] bash
# コンテナ抜ける
exit
# コンテナ消す
docker rm <container ID>
# image消す
docker rmi <image name>
<頻繁に使うオプションTOP3>
Q. run -d?
-d は、ターミナルとの入出力を、行わないオプション。バックグラウンド実行かも。タスクを与えないとすぐ死んじゃう。
Q run -it?
-iはキーボード入力をコンテナの標準入力に結び付けるオプション。bashの入力待機がタスクになって、コンテナ起動し続けてくれる。
-tは、ターミナルと入出力を行うオプション。コンテナの出力がターミナルに出るようにできる。-dと逆。
タスクのないイメージでdocker run すると、シェルの終了信号とともにコンテナもすぐ終了しちゃう。
docker run -it <コンテナ名> bash
とすれば、bashの入力待ちが動いている限りコンテナ起動できるかも。
3. コンテナ内で下記実装(OSやDockerの仕様にあわせて読み替える)
【wordpressにアクセスできるまで】
https://www.rosehosting.com/blog/how-to-install-wordpress-with-nginx-on-debian-10/
この実装を"自動で"実施するのが課題。実現するのがDockerfile。
wordpressにアクセスできるまで来たら、手順をDockerfileに書き進める。と
りあえず以下を追記。最低限のコマンドやツールを取得するまで。
# get image
FROM debian:buster
# install tools
RUN set -ex; \
apt-get update; \
apt-get -y install wget curl vim openssl \
nginx \
mariadb-server mariadb-client \
php-cgi php-common php-fpm php-pear php-mbstring php-zip php-net-socket php-gd php-xml-util php-gettext php-mysql php-bcmath; \
#apt-getのcache削除
rm -rf /var/lib/apt/lists/*
# keep move
CMD tail -f /dev/null
Q. set -e?
A. 本来はエラーが起きても無理やり最後まで実行されますが、-eをつけるとエラー発生時にそこで処理を中断します。
Q. set -x?
A. デバッグ情報を出力しています。
Q. set -u?
A. 未定義の変数読み込みをエラー扱いにします。つかってません。
4.【 SSL証明書を発行して、nginxのSSL設定をon】
・SSL証明書の発行。Dockerfileに追記。
https://linuxize.com/post/creating-a-self-signed-ssl-certificate/
・ファイル[default.tmpl]の作成。
/etc/nginx/sites-available/wordpress.conf を先ほど作ったけど、
/etc/nginx/sites-available/default.tmplに書き換える。(.tmplは7.で後述)
※.tmplファイルはコマンドENTRYPOINTで起動するファイル。置き換えしたら7.の実装も併せる。それをしないと、初期のdefaultのままになるかも。default.tmplをENTRYPOINTが読み込んで、defaultファイルが上書きされる仕組み。
・ついでにシンボリックリンク
ln -s /etc/nginx/sites-available/wordpress.conf /etc/nginx/sites-enabled/
を作ったけど、defaultファイルに上書き予定なので削除。
・ssl onをdefault.tmplに追記
https://gist.github.com/kenjiskywalker/4698573
5. phpmyadminのリンク先を設定。Dockerfileに追記。
http://blog.livedoor.jp/zye385/archives/25949692.html
# install phpmyadmin
WORKDIR /tmp/
RUN set -ex; \
wget https://files.phpmyadmin.net/phpMyAdmin/5.0.2/phpMyAdmin-5.0.2-all-languages.tar.gz; \
tar -xvzf phpMyAdmin-5.0.2-all-languages.tar.gz; \
rm phpMyAdmin-5.0.2-all-languages.tar.gz; \
mv phpMyAdmin-5.0.2-all-languages phpmyadmin; \
mv phpmyadmin/ /var/www/html/
6. httpアクセスした場合、httpsへリダイレクトの実装
[default.tmpl] にポート設定を追記する。
# 80 : httpでアクセスするポート
# 301 : リダイレクト先を指定。 https:// にリダイレクトさせる。(443ポートへ)
# 443 : https でアクセスするポート
# ------------------------ 変更前 -------------------------
server {
listen 80;
root /var/www/html/wordpress;
index index.php index.html index.htm;
server_name example.com;
・・・
}
# ------------------------ 変更後 -------------------------
server {
listen 80;
listen [::]:80;
server_name _;
# 301いったあと、lodalhostページに行く。
return 301 https://$host$request_uri;
}
server {
# SSL configuration
listen 443 ssl ;
listen [::]:443 ssl;
server_name wordpress.com;
# root /var/www/html/wordpress;
root /var/www/html;
index index.php index.html index.htm;
・・・
}
7. AUTOINDEX=offの実装 + docker run時に走らせるbashの作成
・Docker run時に起動させるbashファイル[service_start.sh]の作成。
各種serviceをstartさせる内容を記述。ファイル名は任意。
service mysql start
# service --status-all なぜか[-] php7.3-fpm。stopはさむといける。
service php7.3-fpm stop
service php7.3-fpm start
service nginx start
# tail -f /var/log/nginx/access.log をすると、access.logの逐次出力になる。
tail -f /dev/null
・renderコマンドを走らせるために、Entrykitをインストール。Dockerfile追記。
https://qiita.com/spesnova/items/bae6406bf69d2dc6f88b
・CMDコマンドはコメントアウトし、ENTRYPOINTで実装。
# put tmpl file
COPY ./srcs/default.tmpl /etc/nginx/sites-available/
# CMD tail -f /dev/null
ENTRYPOINT ["render", "/etc/nginx/sites-available/default", "--", "bash", "/tmp/service_start.sh"]
renderコマンドは、第二引数に指定のファイル(/etc/nginx/sites-available/default)を作成する。同じ箇所にあるテンプレートファイル(default.tmpl)を読む。
sites-availableにもともとdefaultファイルがあるので、上記名は上書きになる。
default.tmplの中身はnginxのポート設定。そのため4.)は.tmplで作成した。
※もしdefaultを残したい場合、別名の設定ファイルを作って、その名前のシンボリックリンクを/etc/nginx/sites-enables/に設置する必要がある。
defaultはもともとシンボリックリンクが作成されているので省略。
ln -s /etc/nginx/sites-available/*** /etc/nginx/sites-enabled/
・[default.tmpl]でautoindexをrenderコマンドで変更可能にする
# ------------------------ 変更前 -------------------------
location / {
try_files $uri $uri/ /index.php?$args;
}
# ------------------------ 変更後 -------------------------
location / {
autoindex {{ var "AUTOINDEX" | default "on" }};
try_files $uri $uri/ /index.php?$args;
}