LoginSignup
2
4

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-11-11

参考物、引用アリ

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 VPS630

名称 設定値
タイプ 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
追加
ユーザー名 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
##
## 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環境構築

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
2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4