Linux初心者がVPS借りてWebサービスをホストするまでのこまごましたことメモ

こういうことを残しておくと将来の自分に感謝されるのでメモ。

# VPSを選ぶ

VPSはConoHaを借りた。

さくらのVPSも触ってはみたけれど、コンソールが日本語キーボードで入力することが前提みたいになっていたのが自分的にマイナス。
単にかっこいいからという理由でUSキーボードを使うVPS初心者にはハードモードだった。

ConoHaの場合は以下の２つの設定をすればOK。

- VPS設定 - コンソールキーマップを "ja" から "en-us"に変更する
- コンソールで次のコマンドを入力

```bash
sudo loadkeys us
```

このコマンドはサッと対処するにはいいが再起動すると初期化されてしまうことに注意。

[CentOS/コンソール上の英語キーボード・日本語キーボードの切替方法](http://linux.just4fun.biz/CentOS/%E3%82%B3%E3%83%B3%E3%82%BD%E3%83%BC%E3%83%AB%E4%B8%8A%E3%81%AE%E8%8B%B1%E8%AA%9E%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E3%83%BB%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E3%81%AE%E5%88%87%E6%9B%BF%E6%96%B9%E6%B3%95.html)

## 日本語入力ができない問題

CUIから日本語入力ができないが手元のMacからSSHで接続した場合はできるので必要なときはそっちから入力することにした。

## OSを選ぶ
CentOS v6.7を選んだ。
最新のCentOS v7も選べたが、初心者には差異がよくわからないということ、細かい設定方法をウェブで探すときにCentOS v6の方が情報が多いので。

# CentOSの基本設定 〜 SSH

少し古い記事だけどけっこう参考になる。

[CentOSをサーバーとして活用するための基本的な設定](http://tanaka.sakura.ad.jp/archives/001065.html)

SSHキーを設定する部分は次のブログ記事がわかりやすい。

[さくらvpsの設定自分メモ - ssh設定① - for mac](http://tweeeety.hateblo.jp/entry/20140103/1388702277)
[さくらvpsの設定自分メモ - ssh設定④ - for mac２台目とか](http://tweeeety.hateblo.jp/entry/2014/09/26/183545)

ただし、SSHキーをmacで生成するコマンドは "ssh keygen" ではなく "ssh-keygen"だった。
また、SSHの設定を変更してサービスを変更する部分はCentOS6と7で異なっている。

```bash
# CentOS6
/etc/init.d/sshd restart

#CentOS7
systemctl restart sshd.service
```

参考
http://www.putorius.net/2014/07/restarting-services-in-red-hat-7-or.html

# 動作環境のインストール

## インストールするもの

- nginx
- MongoDB
- Golang

基本的に公式ドキュメントの手順に進めればOK

## nginx のインストール

- /etc/yum.repos.d/nginx.repoを作成

https://www.nginx.com/resources/wiki/start/topics/tutorials/install/

- nginxインストール
https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-centos-6-with-yum

## golangのインストール

- 最初にgolangのファイルをダウンロードするコマンド

```bash
wget https://storage.googleapis.com/golang/go1.5.3.linux-amd64.tar.gz
```
※後述する原始的なデプロイ方法を取ったのでこれはおそらく必要なかった。

参考
[How to install Go language on Linux](http://ask.xmodulo.com/install-go-language-linux.html)

# 資産のデプロイ

## 原始的（で非効率）なやり方

- とりあえずVPSでアプリを動かすことを優先している
- 開発機であるMacのローカルでLinux用にビルドしてscpで転送するというもの。

GOOS=linux GOARCH=386 CGO_ENABLED=0 go build -o app.linux github.com/seihmd/app
sudo scp -rp ./app  user@xxx.xxx.xxx.xxx:/path

- golangのドキュメント通り .linux というファイル名にしたがlinuxでは拡張子は合ってないようなものなのでなんでもいいかもしれない。
- 普通はgithubの資産をフェッチしてvpsサーバーでビルドして、という手順？そこらへんはよくわからない。
- ただ、その手順だとwebpackでjsファイルを一つにしているフロントエンドの資産をビルドするためにさらにNode.jsやらなにやら入れないといけないのでやめた。
- 手元のMacでもLinux用のバイナリをビルドできるGoの手軽さに甘えることにした。

## 資産のデプロイ先ディレクトリ

- とりあえず/home/username/以下に作ったディレクトリにデプロイした。
- CentOSでよく使われるのは/var/www/っぽい？

# Google analytics

目ぼしい項目を設定したら後は[Dot metrix](https://dot-metrix.com/)で確認するようにした

# ドメイン設定

1. お名前.comとかでドメインを取得

2. ConoHaのダッシュボードからDNSの設定をする
 - [お名前.comでドメインを取得してConoHaで公開するまで](http://qiita.com/sugra511/items/3b05423d4adeeec5cdd4)
3. ここまででDNSの設定値は次のようになった

|タイプ|	名称|	値|
|-----|----|------|
|A(通常)|@  |xxx.xxx.xxx.xx|
|NS    |@  |ns-a1.conoha.io|	
|NS    |@  |ns-a2.conoha.io|	
|NS    |@  |ns-a3.conoha.io|

# nginxの設定

## 初期設定

まずは最低限と謳われる設定をしておく。mydomain.confの記述は変更する必要がある。

[CentOS 6.5でnginxを動かす為の最低限の設定](http://qiita.com/ksworks/items/cbc7b73c62c5e115d830)

## webアプリをホストする設定

WebアプリはGoのフレームワーク **Martini** を使用しているので、mydomain.confを合わせる必要がある。

[How To Use Martini to Serve Go Applications Behind an Nginx Server on Ubuntu](https://www.digitalocean.com/community/tutorials/how-to-use-martini-to-serve-go-applications-behind-an-nginx-server-on-ubuntu)

```nginx:mydomain.conf
server {
  listen  80;
  server_name  mydomainname;
  location / {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header Host $host;
    proxy_pass http://127.0.0.1:3000;  
}
```

何もフレームワークを使わないなら次の記事が参考になりそう。

[Nginx + Golang でWebアプリケーション開発を試してみた](http://umegusa.hatenablog.jp/entry/2015/02/22/025832)

nginxをrestartすれば（かつドメインが通っていれば）、ドメイン名のURLでWebサービスが表示されるようになる。

## セキュリティ・パフォーマンスのための設定

```nginx:nginx.conf
http{:
  gzip  on;
  gzip_types  application/x-javascript application/json;
  gzip_vary   on;
  gzip_proxied  any;

  server_tokens  off;
```

- gzip_typesで"application/x-javascript"としたのはchromeのデベロッパツールでContent-Typeをみるとそうなっていたから。

- gzip_staticの設定はやりたいけどなぜかbundle.jsが404エラーになるのでまだできていない

# Favicon
## 作成

keynoteと[Favicon Generator](http://realfavicongenerator.net/)で作成した

かなり縮小して表示されるので、複雑な図形でないことや輪郭（色の明暗？）がはっきりしていたほうがいい

## 表示設定

- index.htmlのheadにlinkを追加

```html
<link href="favicon.ico" type="shortcut icon" sizes="96x96">
```
- nginxの設定は特に無し
- faviconの置き場所
 index.htmlと同じディレクトリ

approot --- app.linux
　　 　　└ public --- index.html, favicon.ico

## ブラウザからの確認

Faviconを差し替えても古いアイコンが表示されるのはキャッシュされているから。
その場合、/favicon.ico にアクセスし、リロードをかけて新しいファイルを取得させる必要がある。

# リリース前の確認

- 各ブラウザ、モバイル表示の確認
- Webサービス作った系のエントリを読んで復習

# 完成？

作ったサービスについてはそのうちQiitaにエントリを書く予定。

# 便利コマンドメモ

- mongoDBのエラー

mongoコマンドで次のエラーが出たとき
Failed global initialization: BadValue Invalid or no user locale set. Please ensure LANG and/or LC_* environment variables are set correctly.

```bash
export LC_ALL=C
```

- iptablesをOFFにする

Vagrant使って開発中にブラウザからlocalhost:xxxxが確認できないときは大体これ

```bash
/etc/init.d/iptables save
/etc/init.d/iptables stop
```

- .bash_profileのリロード

```bash
source ~/.bash_profile
```

- ストレージ容量の確認

```bash
df -h
```