ConoHaでArchLinuxのVPSを作成してどどんとふをぶち込む

#参考物、引用アリ
http://qiita.com/k0kubun/items/e60fae90c688ac960ab7
http://qiita.com/pollseed/items/9eaf2fc3097af20bd009
http://ch.nicovideo.jp/tanzo/blomaga/ar278527
http://mmau-mdsp.tumblr.com/post/53343248124/%E5%9F%BA%E6%9C%AC%E7%9A%84%E3%81%AApacman%E3%81%A8yaourt%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9
http://blog.hnron.net/entry/2015/06/17/094847

http://d.hatena.ne.jp/ozuma/20130511/1368284304
https://wiki.archlinuxjp.org/index.php/Let%E2%80%99s_Encrypt
http://qiita.com/ksworks/items/cbc7b73c62c5e115d830
https://h2ham.net/redirect-without-www-by-nginx

SSLの強度を確認。Aあれば十分
https://www.ssllabs.com/ssltest/analyze.html

http://www.walbrix.com/jp/blog/2007-09-spawn-fcgifastcgi.html
http://cre.jp/techblog/2016/01/27/dodontof-centos7-nginx-spawn/
https://wiki.archlinuxjp.org/index.php/Nginx
http://www.uetyi.com/server-const/nginx-setting/entry-1337.html
http://qiita.com/HeRo/items/7063b86b5e8a2efde0f4
http://nlogn.ath.cx/archives/001676.html
http://www.monoreview.com/archives/398


#はじめに
備忘録です。誰かに見せることを考えて居ません。
ただ質問があればお気軽にどうぞ。答えられるとは限りませんので悪しからず……

#環境
**PuTTYJP**
**WinSCP**
**ConoHa VPS** 月**630**円

|名称|設定値|
|:-----------------:|:------------------:|
|タイプ           |VPS|
|リージョン       |東京|
|メモリ           |512M|
|イメージタイプ    |OS|
|OS種類           |その他(ArchLinux)|
|自動バックアップ  |無効|
|ディスク容量      |SSD 50GB|
|接続許可ポートIPv4|全て許可|
|接続許可ポートIPv6|全て許可|
|SSH Key          |使用しない|

#ArchLinuxの環境整備
コンソールを開いて

```
LOGIN:root
Password:入力
```

##OSの最新化+α

###パッケージのアップデート
以下のコマンドひとつでシステムの全てのパッケージのアップデートができます。
これはリポジトリデータベースと同期してそれからシステムのパッケージをアップデートします(リポジトリにない'ローカル'パッケージは別です)
Sは--sync(同期)、yは--refresh(リポジトリデータベースと同期)、uは--upgrades(更新)です。
何かパッケージを導入する前には必ずこれをしましょう。取り返しがつかないことになるかもしれません。

```
# pacman -Syu
```

これでOSの更新が終わりました。一段落。

###良い物を入れよう
vimとzshを入れる。

```
# pacman -Syu
# pacman -S vim zsh
# chsh -s /bin/zsh
```
chshでzshシェルを使うようになりました。これで大分使いやすくなったと思います。

##ユーザーの追加

```
useradd -m -g wheel [user]      # ユーザを追加して wheel グループに入れる
passwd [user]                   # ユーザのパスワードを設定
pacman -S sudo                  # sudo をインストール
visudo                          # 下記参照
```

visudo では # Defaults env_keep += "HOME" 行と # %wheel ALL=(ALL) ALL 行のコメントアウトを解除して保存。 Defaults 行は、 sudo したときユーザの $HOME を参照できるようにする設定。これをしないと sudo vim したとき .vimrc が読み込まれなくて悲しいことになる。 %wheel 行は wheel グループのユーザに sudo する権限を与える。

管理者権限のないユーザにしたいなら staff グループあたりに入れておけばいい。あらかじめ groupadd staff を実行してグループを作っておく。

ここまで終えたらいったん exit して、今作ったユーザでログインし直す。

##SSH公開鍵認証を作る

###まずはopenssh

```
sudo pacman -S openssh
```

###WinSCPを使って一覧
SFTPを用いて作ったwheelグループのユーザーでログインします。
この時詳細設定でシェルの部分を/bin/zshと変更すること
22番ポートでログインすること
を忘れないでください。前者はpermission deniedされます。

###PuTTYgenを使って鍵生成
キー作成した後に公開鍵部分をauthorized_keysに追加

```
cd 
mkdir .ssh
cd .ssh
vim authorized_keys
```
公開鍵をコピペしたら

```
chmod 644 authorized_keys
chmod 700 ../.ssh
```

パーミッションは下記の通り。
~/.ssh 700
authorized_keys 644

自PC側にある秘密鍵は600

###SSH接続の設定変更

```
# vim /etc/ssh/sshd_config 
```

####設定すること
```
Port 22→任意の数字
Protocol 2
PermitRootLogin no
MaxAuthTries 6
PasswordAuthentication no
PermitEmptyPasswords no
X11Forwarding no
AllowUsers wheelユーザー名
```
1:鍵の認証に使うポート番号を変更します
2:プロトコル2を明示的に使用します。
3:ルートでログインできません。
4:パスワードが連続で認証出来る回数は6回です。(公開鍵認証は無関係)
5:パスワード認証ができません。
6:空パスワードでログインできません。
7:X11転送を許可しません。
8:wheelユーザー名ユーザーのみ公開鍵認証が使用出来ます。

####設定しておいたほうがいいけどどっちがいいかわからない
私はデフォルトのyesにしてます。

```
AllowAgentForwarding no
AllowTcpForwarding no
```

1:エージェントフォワーディングが出来ません。
2:ポートフォワーディングが出来ません。

###systemdの起動と再起動

```
#systemctl daemon-reload
#systemctl start sshd.service
#systemctl enable sshd.service
#reboot
```

これで公開鍵認証が出来るはず。

###ハマりどころと勘所
シェルに zsh を使っていて、 .zshenv で PATH 環境変数を設定している場合、グローバルな設定ファイルが PATH の値を上書きしてしまう。
pacman は /usr/bin や /usr/lib にパッケージをインストールする。他ディストリビューションのパッケージマネージャによくある /usr/local/* ではない。戸惑うかもしれないが /usr/local 以下をユーザが好きに使えるという利点がある。
pacman でインストールした gem や cpanm や npm も /usr 以下にパッケージをインストールすることに注意。 pacman 管理下のパッケージとコンフリクトする可能性がある。 /usr/local や /opt 以下にインストールするよう設定したほうがいい。
pacman でシステム関係のパッケージのアップデートに失敗したときは http://www.archlinux.org/ のニュースフィードを確認すること。システム関係のパッケージはアップデート処理中にマニュアルでの作業が必要になる場合があり、その作業内容はニュースフィードで告知される。

#WinSCPを管理者権限で使えるようにする

```
sudo visudo
```

```visudo
追加
ユーザー名 ALL=NOPASSWD: /usr/lib/openssh/sftp-server 
```

WinSCP側は設定→環境→SFTP→プロトコル　オプション→SFTPサーバ　の中を

```
sudo /usr/lib/ssh/sftp-server
```

に設定する。

#どどんとふ編

##nginx環境を構築

```
sudo pacman -Syu
sudo pacman -Sy nginx

sudo systemctl enable nginx
sudo systemctl start nginx
```

全体のファイルを同期してnginxをインストール
スタートアップ時にnginxが動作するように設定して起動

```
sudo grep root /etc/passwd
sudo groupadd html
sudo useradd -o -u 0 -g 0 -d /home/html -s /bin/zsh html
sudo visudo
```

```visudo
##
## User privilege specification
##
root ALL=(ALL) ALL
html ALL=(ALL) ALL ##←追加
```

###手順
grepでrootのGID,UID(0:0ってなってる奴)を調べる

```
root:x:0:0:root:/root:/bin/bash
```

"html"グループを作成
"html"グループに'html'ユーザーをroot権限を持たせて追加
visudoと一緒に設定して初めて効果を発揮する

###nginxのconfを編集してリッスンポート変更

最初の2行をいじる。その後http{}ブロック内にconfファイルを適用するように設定する

```
sudo vim /etc/nginx/nginx.conf
```

```
user nginx;
worker_processes 1;(512MBプランの場合　プロセス数調べて入れて)

http{
include ほにゃらら
include /etc/nginx/conf.d/*.conf;(conf.dディレクトリ下全てのconfファイルを読み込む)

serverほにゃらら
```

##iptablesを設定(しなくても動作はする)

```
sudo vim /etc/iptables/simple_firewall.rules
```

```simple_firewall.rules
-A INPUT -p tcp --dport nginxのlistenポート -j ACCEPT
-A INPUT -p tcp --dport SSH接続ポート -j ACCEPT
-A INPUT -p tcp --dport fcgiの通信ポート -j ACCEPT
-A INPUT -j DROP #ここは必ずCOMMITの1つ上に入れる
```
-A INPUT このアドレスを対象にする接続で
-p tcp TCPの
--dport ** **番ポートへのアクセスを
-j ACCEPT 許可
というコマンドを追加する。
その後ろは他全ての接続を捨てるコマンド

##いよいよ本体

```
sudo pacman -S fcgi spawn-fcgi ruby wget unzip logger
sudo mkdir /etc/nginx/conf.d
sudo vim /etc/nginx/conf.d/dodontof.conf
```

```
server{
  listen 80;
  server_name www.あなたのドメイン;
  return 301 https://dodontof.example.com$request_uri;
  root /htmlディレクトリへのパス/;
  index index.html index.htm;
#wwwをのけてドメイン名に統一する設定。
}

#server {
#  listen 80;
#  server_name  あなたのドメイン;
#  return 301 https:/$host$request_uri;
##httpからhttpsにリダイレクト
#}
#
#server{
#ssl_protocols TLSv1 TLSv1.1 TLSv1.2;#POODLE回避
#ssl_prefer_server_ciphers on;#サーバー側の暗号スイートを優先(TLSv1~1.2が使われるようにする)
#
#ssl_ciphers #ECDHE+AES128+AESGCM:ECDHE+AESGCM+ECDHE+AES128:ECDHE+AES:RSA+AES128+AESGCM:RSA+AESGCM:RSA+AES128:RSA+AES:RSA+3DES;
#
#listen 443 ssl http2;
#
#root /htmlディレクトリへのパス/;
#index index.html index.htm;
#
#ssl on;
#ssl_certificate /fullchain.pemへのパス;
#ssl_certificate_key /privkey.pemへのパス;
#
#  root /home/nginx/dodontof.example.com/public_html;
#  index index.html index.htm;
#
#  client_max_body_size 128M;
#
#  access_log /home/nginx/dodontof.example.com/logs/access.log combined;
#  error_log  /home/nginx/dodontof.example.com/logs/error.log;
#
#  location ~ ^/.*\.rb$ {
#    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#    proxy_set_header X-Forwarded-Proto $scheme;
#    proxy_set_header Host $http_host;
#
#    fastcgi_pass 127.0.0.1:9000;
#    fastcgi_index index.html;
#    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
#    include fastcgi_params;
#}
```

```
wget http://www.dodontof.com/Download/DodontoF_release/バージョン名.zip
unzip zipファイル名
sudo mkdir /home/nginx/dodontof.example.com/logs -p
cd /home/nginx/dodontof.example.com
```

あとは展開とか属性設定とか色々公式と同じ通りに頑張って
DodontoFServer.rbの最初の
/usr/local/bin/rubyは
/usr/bin/rubyに変えること(pathが違う場合。)

##SSL環境構築

https://certbot.eff.org/#arch-nginx

```
sudo pacman -S certbot
certbot certonly --email email@example.com --webroot -w /path/to/html/ -d your.domain
```

Let'sEncryptというものを使ってサーバーの証明書を取得します。
成功したら/etc/letsencrypt/live/自分のドメイン名/
ディレクトリ下に4つのファイルが生成されます。
fullchain.pemはssl_certificateに、
privkey.pemはssl_certificate_keyに適用します。ここへのパスを覚えたらもう一度

```
sudo vim /etc/nginx/conf.d/dodontof.conf
```

でdodontof.confをいじくり回す。今回はssl関連のところを。
ssl_ciphers ECDHE+AES128+AESGCM:ECDHE+AESGCM+ECDHE+AES128:ECDHE+AES:RSA+AES128+AESGCM:RSA+AESGCM:RSA+AES128:RSA+AES:RSA+3DES;
については、初見殺しです。複数のオプションの略語をつなげてるだけです。

```dodontof.conf
server{
  listen 80;
  server_name www.あなたのドメイン;
  return 301 https://dodontof.example.com$request_uri;
#wwwをのけてドメイン名に統一する設定。
}

server {
  listen 80;
  server_name  あなたのドメイン;
  return 301 https:/$host$request_uri;
#httpからhttpsにリダイレクト
}

server{
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;#POODLE回避
ssl_prefer_server_ciphers on;#サーバー側の暗号スイートを優先(TLSv1~1.2が使われるようにする)

ssl_ciphers ECDHE+AES128+AESGCM:ECDHE+AESGCM+ECDHE+AES128:ECDHE+AES:RSA+AES128+AESGCM:RSA+AESGCM:RSA+AES128:RSA+AES:RSA+3DES;

listen 443 ssl http2;

root /htmlディレクトリへのパス/;
index index.html index.htm;

ssl on;
ssl_certificate /fullchain.pemへのパス;
ssl_certificate_key /privkey.pemへのパス;

  root /home/nginx/dodontof.example.com/public_html;
  index index.html index.htm;

  client_max_body_size 128M;

  access_log /home/nginx/dodontof.example.com/logs/access.log combined;
  error_log  /home/nginx/dodontof.example.com/logs/error.log;

  location ~ ^/.*\.rb$ {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header Host $http_host;

    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.html;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}
```

証明書は三ヶ月ごとに更新が必要になりますが、以下の .service ファイルを作成することで完全に自動化することが可能です。

```/etc/systemd/system/certbot.service
[Unit]
Description=Let's Encrypt renewal

[Service]
Type=oneshot
ExecStart=/usr/bin/certbot renew --quiet --agree-tos
```

#dodontofをserviceで動くようにする
dodontof.rbの属性は700

```dodontof.rb

#!/usr/bin/ruby
#--*-coding:utf-8-*--
Encoding.default_external='utf-8' if defined?(Encoding) && Encoding.respond_to?('default_external')

require 'rubygems'
require 'cgi'
require 'fcgi'
require 'logger'

$logger = Logger.new('./fcgilog.txt')
$logger.level = Logger::ERROR
$logger.info("### FCGI.each start")

$logger.info("    load")
load 'DodontoFServer.rb'

FCGI.each do |fcgi|
   $logger.info("do")
   begin
     $logger.info("  begin")
     $stdout = fcgi.out
     $stdin = fcgi.in
     ENV.replace(fcgi.env)

     $logger.info("    execute")
     executeDodontoServerCgi()

     fcgi.finish
     $logger.info("  finish")
   rescue Exception => e
     $logger.fatal(e)
   end
   $logger.info("end")
end
$logger.info("### FCGI.each end")
```

```dodontof.service
[Unit]
Description=DodontoF spawn-fcgi
After=nginx.service
Wants=nginx.service

[Service]
Type=forking
User=nginx
Group=nginx
PIDFile=/home/nginx/dodontof.example.com/dodontof.pid
ExecStart=/usr/bin/spawn-fcgi -d /home/nginx/dodontof.example.com/public_html/DodontoF -f /home/nginx/dodontof.example.com/public_html/DodontoF/dodontof.rb -p 9000 -F 10 -P /home/nginx/dodontof.example.com/dodontof.pid
ExecReload=/bin/kill -HUP $MAINPID
ExecStop=/bin/kill $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target
```

導入してからの注意
rubygemsを使う。(msgpack,fcgi導入のため)
gems install msgpack の要領でインストール出来るがその前にパス設定を済ませておくこと。もしくはこういう感じでユーザー個別ではなく上位のgemsフォルダにインストールする方法もある。

```
gems install fcgi
gems install msgpack --no-user-install
```