[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;
		}

この記事が気に入ったらサポートをしてみませんか?