paloma blog

NWエンジニアやってます。主に自宅環境のお遊びを書きます。Pythonもちょっと。タイトルは好きなカクテルから。

LXDでローカルPCにDokuwikiを立てる(Ubuntu16.04+nginx+php7)

いろいろ業界の勉強してると技術ログを残したいものですが、ブログに書き続けるのも結構辛いものがあります。
昔のやつが埋まっちゃったりとか、一々検索もめんどくさいですからね。

というわけでまとめがしやすいようにローカルPCにDokuwikiを立ててみました。

今のメインPCはUbuntuなのでコンテナ(LXD)で立ててみたいと思います。
コンテナは自分の環境を汚さずにいろいろ立てられるので好きです。

別にDockerでいいじゃんって思ったけどLXDの方がDockerより自由に立てられそうなので、LXDで作ることにしました。

また、Wikiサイトはこの記事を読んでDokuwikiにしました。

qiita.com

WikiOSSはたくさんありますが、勉強のまとめだけなので、さくっとこいつを作りたいと思います。

LXDのインストール

masashi@PC-ubuntu: ~$ sudo apt-get install lxd

インストール後は一回ログアウトします。

再ログイン後、バージョン確認

masashi@PC-ubuntu: ~$ lxd --version
2.0.11

LXDの初期化

sudoつけないとエラーが出ました。
bridgeが作れないのか。

/usr/sbin/dpkg-reconfigure は root で実行する必要があります
error: Failed to configure the bridge

とりあえず設定は全部デフォルトにします。

masashi@PC-ubuntu: ~$ sudo lxd init 
Do you want to configure a new storage pool (yes/no) [default=yes]
Name of the storage backend to use (dir or zfs) [default=dir]: 
Would you like LXD to be available over the network (yes/no) [default=no] 
Do you want to configure the LXD bridge (yes/no) [default=yes]
Warning: Stopping lxd.service, but it can still be activated by:
  lxd.socket

このあとGUIが出ていろいろ設定するんですが、スクショを撮り忘れました。 これも全部デフォルトです。

下記のメッセージがでて初期化完了です。

LXD has been successfully configured.

コンテナイメージ取得

masashi@PC-ubuntu: ~$ lxc launch ubuntu:16.04 ubuntu16
クライアント証明書を生成します。1分ぐらいかかります...
初めて LXD を使う場合、sudo lxd init と実行する必要があります
初めてコンテナを起動するには、"lxc launch ubuntu:16.04" と実行してみてくだ
さい。

ubuntu16 を作成中

()

コンテナの確認

コンテナのNWは10.94.47.0/24のようです。
インストール時のGUIで聞かれた気がする。

masashi@PC-ubuntu: ~$ lxc list
+----------+---------+---------------------+------+------------+-----------+
|   NAME   |  STATE  |        IPV4         | IPV6 |    TYPE    | SNAPSHOTS |
+----------+---------+---------------------+------+------------+-----------+
| ubuntu16 | RUNNING | 10.94.47.134 (eth0) |      | PERSISTENT | 0         |
+----------+---------+---------------------+------+------------+-----------+

ブリッジの確認。
ちゃんと出来てますね。
(ローカルIPががっつり出ちゃうけどまあいいか)

masashi@PC-ubuntu: ~$ ip address
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 6c:62:6d:e9:65:56 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.10/24 brd 192.168.0.255 scope global dynamic enp3s0
       valid_lft 2481sec preferred_lft 2481sec
    inet6 fe80::a3b9:45e0:316a:2753/64 scope link 
       valid_lft forever preferred_lft forever
4: lxdbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether fe:2c:4a:3d:4b:fa brd ff:ff:ff:ff:ff:ff
    inet 10.94.47.1/24 scope global lxdbr0
       valid_lft forever preferred_lft forever
    inet6 fe80::c071:faff:feb8:a94c/64 scope link 
       valid_lft forever preferred_lft forever
6: veth5YLIQG@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master lxdbr0 state UP group default qlen 1000
    link/ether fe:2c:4a:3d:4b:fa brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::fc2c:4aff:fe3d:4bfa/64 scope link 
       valid_lft forever preferred_lft forever

コンテナに入ってみます

この辺はDockerと同じですね。

masashi@PC-ubuntu: ~$ lxc exec ubuntu16 -- /bin/bash
root@ubuntu16:~# 

プロンプトが変わりました。

バージョン確認。
ホストOSと同じです。

root@ubuntu16:~# cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.3 LTS"

パッケージアップデートします。

root@ubuntu16:~# apt-get update ; apt-get upgrade

Dokuwiki用のパッケージインストール

公式ドキュメントに沿ってインストール

root@ubuntu16:~# apt-get install php7.0
root@ubuntu16:~# apt-get install php7.0-mbstring
root@ubuntu16:~# apt-get install php7.0-xml

Apacheはなんとなく触れるので今回はnginxでやってみます。

root@ubuntu16:~# apt-get install nginx

Dokuwikiを取得

root@ubuntu16:~# wget https://download.dokuwiki.org/src/dokuwiki/dokuwiki-stable.tgz

解凍

root@ubuntu16:~# tar xvf dokuwiki-stable.tgz 

ディレクトリ移動
私は/var/lib配下に入れるのが好きなのでここに移動します。
ドキュメントルートはどこがベストプラクティスなんですかねえ。

root@ubuntu16:~# mv dokuwiki-2017-02-19e /var/lib/dokuwiki

バックアップとって設定ファイル書き換えます。

root@ubuntu16:~# cp -i /etc/nginx/sites-available/default{,.bk}
root@ubuntu16:~# ls -l /etc/nginx/sites-available/
total 8
-rw-r--r-- 1 root root 2074 Feb 11  2017 default
-rw-r--r-- 1 root root 2074 Feb  7 14:58 default.bk

こんな感じ。
ローカルだしまだnginx慣れてないのでhttpでいいです。

root@ubuntu16:~# cat /etc/nginx/sites-available/default
#server {
#    listen               80;
#    listen                   [::]:80;
#    server_name          wiki.domain.example;
#    return 301 https://$server_name$request_uri;
#}
 
server {
    #listen [::]:443 ssl;
    listen 80;
 
    #server_name localhost;
 
    # Maximum file upload size is 4MB - change accordingly if needed
    client_max_body_size 4M;
    client_body_buffer_size 128k;
 
    root /var/lib/dokuwiki;
    index doku.php;
    
    #Remember to comment the below out when you're installing, and uncomment it when done.
    location ~ /(data/|conf/|bin/|inc/|install.php) { deny all; }

#   Uncomment this prevents images being displayed ! 
#    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
#        expires 31536000s;
#        add_header Pragma "public";
#        add_header Cache-Control "max-age=31536000, public, must-revalidate, proxy-revalidate";
#        log_not_found off;
#    }
 
    location / { try_files $uri $uri/ @dokuwiki; }
 
    location @dokuwiki {
        # rewrites "doku.php/" out of the URLs if you set the userewrite setting to .htaccess in dokuwiki config page
        rewrite ^/_media/(.*) /lib/exe/fetch.php?media=$1 last;
        rewrite ^/_detail/(.*) /lib/exe/detail.php?media=$1 last;
        rewrite ^/_export/([^/]+)/(.*) /doku.php?do=export_$1&id=$2 last;
        rewrite ^/(.*) /doku.php?id=$1&$args last;
    }
 
    location ~ \.php$ {
        try_files $uri $uri/ /doku.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
        fastcgi_param REDIRECT_STATUS 200;
    fastcgi_index doku.php;
        #fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_pass unix:run/php/php7.0-fpm.sock;
    }
}

サービス起動

root@ubuntu16:~# systemctl start nginx

httpが上がりました。ssh使わないし閉じちゃってもいいかも。

root@ubuntu16:~# ss -ltn
State      Recv-Q Send-Q Local Address:Port               Peer Address:Port              
LISTEN     0      128          *:80                       *:*                  
LISTEN     0      128          *:22                       *:*                  
LISTEN     0      128         :::22                      :::*    

所有ユーザ変更を忘れていました。

root@ubuntu16:~# chown -R www-data:www-data /var/lib/dokuwiki

php-fpmとnginxを再起動。
php-fpmが何者かよくわかってないけどFastCGI実装の一つだそう。

root@ubuntu16:~# systemctl restart php7.0-fpm

root@ubuntu16:~# systemctl restart nginx

ローカルでアクセスしてみます。

root@ubuntu16:~# curl -I localhost
HTTP/1.1 200 OK
Server: nginx/1.10.3 (Ubuntu)
Date: Mon, 12 Feb 2018 09:45:31 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
Set-Cookie: DokuWiki=8mbt5hbngnkj4hp92d6l7mlnp1; path=/; HttpOnly
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
X-UA-Compatible: IE=edge,chrome=1

大丈夫そうなのでホストからも確認。

masashi@PC-ubuntu:~$ curl -I 10.94.47.134
HTTP/1.1 200 OK
Server: nginx/1.10.3 (Ubuntu)
Date: Mon, 12 Feb 2018 09:46:29 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
Set-Cookie: DokuWiki=7d9kukc20pv85djjrk0imq9s64; path=/; HttpOnly
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
X-UA-Compatible: IE=edge,chrome=1

OKですね。
ではブラウザから。

f:id:paloma69:20180212191550p:plain

できました!

編集してみる

文章書いてみます。

f:id:paloma69:20180212191600p:plain

セーブして...

f:id:paloma69:20180212191610p:plain

ページが作れました!
Dokuwikiの使い方含め技術ログもここに書きためていこう思います。

セキュリティ周りの設定がガバガバな気がしますが、とりあえず動いたのでOKです。
細かいのはこれからチューニングしていきます。(できたら)

参考サイト

公式ドキュメントはphp5系なのでこちらを参考に7系で動かしました。

Nginx・PHP7.0・Ubuntu14.04でphpinfoを表示させる - Qiita

ていうかqiitaに書きためとけばいい気がしてきた...