#参考物、引用アリ
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
追加
ユーザー名 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
-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;
については、初見殺しです。複数のオプションの略語をつなげてるだけです。
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 ファイルを作成することで完全に自動化することが可能です。
[Unit]
Description=Let's Encrypt renewal
[Service]
Type=oneshot
ExecStart=/usr/bin/certbot renew --quiet --agree-tos
#dodontofをserviceで動くようにする
dodontof.rbの属性は700
#!/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")
[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