日記

更新頻度はあまり高くはありませんがネタがあったら書いていこうと思います。

Raspberry pi 2にNginx+GolangでWebサーバー構築

NginxとGolangで自宅Webサーバ環境を構築したので、その方法を書きたいと思います。

http://hardikdabhi.com/blog/automation-boards/img/raspberrypi-logo.png https://avatars2.githubusercontent.com/u/1412239?v=3&s=200 https://techstars.jp/blog/wp-content/uploads/2015/10/gopher_head.png

環境

Linux raspberrypi 4.1.17-v7+ #838 SMP Tue Feb 9 13:15:09 GMT 2016 armv7l GNU/Linux
nginx version: nginx/1.6.2

Raspbianインストールからセキュリティ設定

ココらへんは他のサイトに書かれているのでそれらを参考してください。
インストール時の注意点としてはWebサーバ用途であればGUIは必要ないのでRaspbian LITEで良いです。あと、IPアドレスですが、ルータの設定ページにどこからどこまでをプライベートIPとして使うとか書かれているので下からpingしていけばOKです。pingできればssh pi@[ip-address]で接続してパスワードはraspberryです。通ればほぼ確でラズパイです。

セキュリティ設定は

Raspberry Piのセキュリティー設定 for Webサーバー用 パート1 | ものづくりエクスペリメント

Raspberry Piのセキュリティー設定 for Webサーバー用 パート2 | ものづくりエクスペリメント

を参考にしてください。

Nginx導入

RaspbianのパッケージにあるNginxは1.6.2です。安定版は1.8ですがソースからビルドしたところセグメンテーションフォールトでクラッシュしてしまったので、仕方なく1.6.2を使いました。

ここからの過程はroot権限が必要なのでrootでなければsudoをつけてください。

apt-get update
apt-get upgrade
apt-get install nginx

でインストールします。

Nginxの設定ファイルは/etc/nginx以下にあります。設定しなければならないものは/etc/nginx/nginx.conf/etc/nginx/sites-available/[server-name]です。設定ファイルはホームディレクトリなどにバックアップをとっておくと良いです。
/etc/nginx/nginx.confは好みですが自分はserver_tokens off;gzip on;にしました。

/etc/nginx/sites-available/[server-name]にはバーチャルホストの設定をします。自分は下記のように設定しました。

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    server_name [server-name];

    root /var/www/html/[プロジェクトネーム];
    index index.html;

    location / {
        try_files $uri $uri/ =404;
        proxy_pass http://127.0.0.1:[ポート番号];
    }
    location ~ .*\.(jpg|JPG|gif|GIF|png|PNG|swf|SWF|css|CSS|js|JS|inc|INC|ico|ICO) {
        root    /var/www/html/[プロジェクトネーム]/public;
    }
}

サーバネーム、パスやポート等は自分の環境にしてください。ポート番号は環境変数で設定すると便利です。
ルートにアクセスした時デフォルトで表示するサイトの設定ファイルにはlistenの最後にdefault-serverを追記します。はじめから入っている/etc/nginx/sites-available/defaultdefault-serverは消してください。この設定の場合Goの実行ファイルは/var/www/html/[プロジェクトネーム]以下に静的ファイルは/var/www/html/[プロジェクトネーム]/public以下に配置します。location /にあるproxy_passはこのバーチャルホストの/にきたアクセスはhttp://127.0.0.1:[ポート番号]に転送してくださいという意味です。もし別のマシンでGoのWebサーバを動かす場合はIPアドレスを変更します。その下のlocation ~ .*\.(jpg....は静的ファイルの保存場所を表しています。

記述完了したら保存して/etc/nginx/sites-enabled以下にシムリンクを貼ります。

ln -s /etc/nginx/sites-available/[プロジェクトネーム] /etc/nginx/sites-enabled/[プロジェクトネーム]

これで設定が有効化されます。そしたら

nginx -t

で設定ファイルの正しさを検証します。

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

とでたらOKです。

そしたら下記コマンドでNginxを再起動します。

nginx -s reload

これでNginxの設定が完了しました。

ルータの設定

Webサーバを公開するにあたりルータの80番ポートにきた通信をラズパイに転送する設定をします。ルータのプライベートIPアドレスにアクセスし設定画面を開きます。まずラズパイのマックアドレスに対するプライベートIPアドレスを固定してください。そしたら80番ポートをラズパイのプライベートIPアドレスマッピングしてください。これでルータの80番ポートの通信がラズパイに転送されます。

GoのWebサーバの導入

Goはクロスコンパイル可能なコンパイル型言語なのでラズパイ上にビルド環境を作成する必要はありません。作成してもいいですが、セキュリティを高めたければ作らないほうがいいです。クロスコンパイルには

GitHub - mitchellh/gox: A dead simple, no frills Go cross compile tool

を使います。

go get -u https://github.com/mitchellh/gox

で開発マシンにインストールしてください。

gox osarch="linux/arm"

でラズパイで動くバイナリを生成できます。

バイナリを生成したらscpコマンドなりsftpなりで設定ファイルで指定した場所に実行ファイル、静的ファイル群を転送します。最後に

cd [実行ファイルのあるパス]
./[プロジェクトネーム] &

でセットアップ完了です。

LAN内で[ラズパイのプライベートIP]、LAN外部から[自宅のグローバルIP]にそれぞれアクセスして結果が返されることを確認してください。

あとはドメインDNSの設定がありますがこれらも上記サイト等に書かれているのでそちらを参考にしてください。