Nginxを使って仮想サーバーをたてる

先日作った Sinatra アプリに、sombrero という仮想サーバー名でアクセスできるようにする。
Nginx の仮想サーバーの設定は、/etc/nginx/conf.d 以下に「仮想サーバー名.conf」という設定ファイルを作ることで行う。
というわけで、今回は /etc/nginx/conf.d/sombrero.conf ファイルを作る。

[takatoh@aybesea ~]$ cd /etc/nginx/conf.d
[takatoh@aybesea conf.d]$ sudo vim sombrero.conf

ファイルの内容は次の通り:

upstream unicorn-sombrero {
    server 127.0.0.1:9000;
}

server {
    # port
    listen 80;

    # server name
    server_name sombrero;

    client_max_body_size 8M;

    # log files
    access_log /var/log/nginx/sombrero/access.log combined;
    error_log /var/log/nginx/sombrero/error.log warn;

    keepalive_timeout 60;
    proxy_connect_timeout 60;
    proxy_read_timeout 60;
    proxy_send_timeout 60;

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_pass http://unicorn-sombrero;
    }
}

80 番ポートで待ち受けて、アプリの動いている 9000 番ポートへ転送している。

ログファイルのためのディレクトリを作る。

[takatoh@aybesea conf.d]$ sudo mkdir /var/log/nginx/sombrero

これで OK のはず。Nginx をリスタート。

[takatoh@aybesea conf.d]$ sudo systemctl restart nginx

別のマシンから http://sombrero/ にアクセスしてみると、ちゃんと動作していることが確認出来た。

CentOS 7にNginxをインストールする

Nginx は CentOS 7 の標準リポジトリでは提供されていないので、まずは EPEL リポジトリを登録する。

[takatoh@aybesea ~]$ sudo yum install epel-release.noarch

Nginx をインストール。

[takatoh@aybesea ~]$ sudo yum install nginx

firewalld の設定とリスタート。

[takatoh@aybesea ~]$ sudo firewall-cmd --add-service=http --zone=public --permanent
[takatoh@aybesea ~]$ sudo systemctl restart firewalld

Nginx の起動と自動起動の設定。

[takatoh@aybesea ~]$ sudo systemctl enable nginx
[takatoh@aybesea ~]$ sudo systemctl start nginx

これでとりあえずは OK。他のマシンからもアクセスできることを確認した。

WindowsからSambaの共有フォルダにコピーするときエラーが発生するようになってしまった

Samba で共有フォルダを作っている Ubuntu マシン(wplj)の外付け HDD を ext4 にフォーマットしたところ、Windows からファイルをコピーするときに、頻繁にエラーが発生するようになってしまった。
そもそも wplj の共有フォルダは Windows マシンのデータバックアップに使っていたもので、もとは NTFS のまま使っていた。そこに robocopy コマンドでバックアップをとっていた。例えば次のように。

robocopy /mir F:\softwares P:\

F: は Windows マシンの外付け HDD、P: は wplj の共有フォルダをネットワークドライブとして割り当てたものだ。wplj の外付け HDD が NTFS のときはこれで何の問題もなくバックアップできていたんだけど、ext4 にしたら「予期しないネットワークエラー」が頻繁に発生するようになってしまった、というわけ。robocopy コマンドだけでなく、エクスプローラーを使ってコピーしてみても状況は同じだった。まったくコピーができないわけじゃないので、ますますわからない。Web を見ながらいくつか解決方法を試してみたけれど、状況は変わらず。それで困っている。

ところで、よくわからないんだけど、CentOS マシン(aybesea)にたてた Samba の共有フォルダでは、上記のようなエラーは起こらない。なぜだろう?

新しいPC(Windows 10)のセットアップをした

昨日の話。Windowsマシン valarie の買い替えの新しい PC のセットアップをした。Windows の更新にすげー時間がかかったせいで1日仕事だった。
セットアップ自体は特に難しいところはないんだけど、途中で Windows の更新をするところで数時間もかかってしまった。特に、「完了の割合」が 99% になってからずっと2時間くらい進まず、結局お祈りしながら強制リブートした。無事リブートしたのでよしとする。更新がどうなったかは分からないけど、今日になってみたら新しい更新がインストールされていたので、結果としては大丈夫だったようだ。
以下、インストールしたアプリケーション。

  • Norton Internet Security
  • iTunes
  • Dropbox
  • Firefox
  • Adobe Reader DC
  • Sublime Text 3
  • 秀丸
  • Git
  • RLogin
  • FFFTP
  • VirtualBox
  • B’s Recoder GOLD
  • Microsoft Office 2013
  • Ruby
  • Python
  • Node.js

とりあえずこんなところ。
あ、ホスト名は montana にした。
あと古いマシンは廃棄する前に CentOS を入れていろいろ実験してみるつもり。

vsftpdのインストールと設定→解決

昨日の vsftpd が動かない問題、解決した。
話は2段階で進む。まずはじめに、vsftpd 自体が起動しない問題、これは listen ディレクティブと listen_ipv6 ディレクティブが両方 YES になっていたためだった。listen_ipv6 のほうをコメントアウトして解決。

listen=YES
#listen_ipv6=YES

これで起動するようにはなったけど、アクセスしてみると「500 OOPS: vsftpd: refusing to run with writable root inside chroot()」というエラーが出てログインできない。これが2つめ。ググるとつぎのページが見つかった。

cf. vsftpdの設定で謎のエラーにハマった – TomoProgの技術書

どうやら chroot した先に書き込み権限があるとエラーになるらしい。allow_writeable_chroot ディレクティブを追加して解決。

allow_writeable_chroot=YES

それにしても listenlisten_ipv6 はデフォルトで両方 YES になってた。デフォルトが動かない設定になってるってどういうことよ?

vsftpdのインストールと設定→動かない

メインマシン envelopes (Ubuntu 16.04) と Windowns マシン valarie とのデータのやり取りのため、envelopes に vsftpd をインストールした。

takatoh@envelopes $ sudo apt install vsftpd

設定は、基本的には以前さくらの VPS に設定した時と同じ。ただし、ASCII 転送を有効にした。あと、設定ファイルは /etc/vsftpd.conf にあった。

# ASCII mangling is a horrible feature of the protocol.
ascii_upload_enable=YES
ascii_download_enable=YES

それから以下を追記。

userlist_deny=NO
userlist_file=/etc/vsftpd.user_list
local_root=Public

空の chroot_list ファイルを作る。

takatoh@envelopes $ sudo touch vsftpd.chroot_list

user_list ファイルを作る。

takatoh@envelopes $ sudo vim vsftpd.user_list

takatoh だけを指定した。

ポート 21 を開ける。

takatoh@envelopes $ sudo ufw allow 21/tcp
ルールを追加しました
ルールを追加しました (v6)

vsftpd をリスタート。

takatoh@envelopes $ sudo systemctl restart vsftpd

あれ?何もメッセージが出ないけどいいのかな?

takatoh@envelopes $ ps ax | grep vsftpd
18124 pts/18   S+     0:00 grep --color=auto vsftpd

ああ、やっぱり動いてない。なんでだ……

middleman deplyが動いてくれない

www.panicblanket.com にホームページを作った。とはいっても2ページしか無いんだけど。
作成には Ruby 製静的サイトジェネレータの Middleman を使った。Middleman の使い方はググればいっぱい出てくるのでここでは省略。とりあえず日本語の公式サイトへのリンクだけ載せておこう。

 cf. Middleman

基本的にはこの公式サイトの説明のとおりにやっていけば、サイトを作れる。というか作れた。
問題はサーバへのデプロイだ。デプロイは、要するにサーバの然るべきディレクトリにファイルをコピーすればいいので、FTP でも何でもいいんだけど、ファイル数が多くなればそれだけ面倒になる。で、公式サイトでは middleman-deploy というプラグインを使うといい、みたいなことが書いてあったのでそうすることにした。
ところがこれが罠だったわけだ。使い方は簡単、Gemfile に middleman-deploy を追加して、bundle install --path vendor/bundle コマンドでインストール。config.rb にデプロイのための設定を書き足して(今回は FTP を使うことにした)、bundle exec middleman deploy を実行するだけ。
で、実行したところこんなエラーが出た。

takatoh@envelopes $ bundle exec middleman deploy
/home/takatoh/w/www.panicblanket.com/vendor/bundle/ruby/2.3.0/gems/middleman-core-4.2.1/lib/middleman-core/extensions.rb:96:in `load': Tried to activate old-style extension: deploy. They are no longer supported. (RuntimeError)
	from /home/takatoh/w/www.panicblanket.com/vendor/bundle/ruby/2.3.0/gems/middleman-core-4.2.1/lib/middleman-core/extensions.rb:127:in `block in load_settings'
	from /home/takatoh/w/www.panicblanket.com/vendor/bundle/ruby/2.3.0/gems/middleman-core-4.2.1/lib/middleman-core/extensions.rb:125:in `each'
	from /home/takatoh/w/www.panicblanket.com/vendor/bundle/ruby/2.3.0/gems/middleman-core-4.2.1/lib/middleman-core/extensions.rb:125:in `load_settings'
	from /home/takatoh/w/www.panicblanket.com/vendor/bundle/ruby/2.3.0/gems/middleman-core-4.2.1/lib/middleman-core/extension_manager.rb:12:in `initialize'
	from /home/takatoh/w/www.panicblanket.com/vendor/bundle/ruby/2.3.0/gems/middleman-core-4.2.1/lib/middleman-core/application.rb:263:in `new'
	from /home/takatoh/w/www.panicblanket.com/vendor/bundle/ruby/2.3.0/gems/middleman-core-4.2.1/lib/middleman-core/application.rb:263:in `initialize'
	from /home/takatoh/w/www.panicblanket.com/vendor/bundle/ruby/2.3.0/gems/middleman-cli-4.2.1/bin/middleman:49:in `new'
	from /home/takatoh/w/www.panicblanket.com/vendor/bundle/ruby/2.3.0/gems/middleman-cli-4.2.1/bin/middleman:49:in `'
	from /home/takatoh/w/www.panicblanket.com/vendor/bundle/ruby/2.3.0/bin/middleman:23:in `load'
	from /home/takatoh/w/www.panicblanket.com/vendor/bundle/ruby/2.3.0/bin/middleman:23:in `
'

長いけど、最初のところに、「Tried to activate old-style extension: deploy. They are no longer supported. (RuntimeError)」って書いてある。deploy は古いスタイルの拡張で、すでにサポートされていない、らしい。GitHub の middleman-deploy のページを見てみると、インストールしたバージョン 1.0 がリリースされたのが 2014 年。これ以降新しいバージョンのリリースがない。そりゃ古いよなぁ。でも公式サイトに書いてあるんだぜ?どうしろってんだ。

結局、FTP でファイルをひとつずつアップした。スタイルシートを含めても3ファイルしか無いので、大したことはなかったけど、これからファイル数が増えたらなんか考えなきゃいけない。みんなどうしてるんだろう?

FTPサーバ(vsftpd)の設定

さくらで借りている VPS に FTP サーバ(vsftpd)を設定した記録。

環境

  • CentOS 6.9
  • x86_64

方針

  • ASCII転送はなし
  • 特定のユーザしかアクセスさせない
  • ホームディレクトリのpublic以下しかアクセスさせない
  • アップロードしたファイルにユーザ以外の書き込み権限を付与しない

FTP用ユーザの作成

[takatoh@tk2-254-36564 ~]$ sudo useradd ftpuser
[takatoh@tk2-254-36564 ~]$ sudo passwd ftpuser
ユーザー ftpuser のパスワードを変更。
新しいパスワード:
新しいパスワードを再入力してください:
passwd: 全ての認証トークンが正しく更新できました。

ftpuser のホームディレクトリに public ディレクトリを作る。

[takatoh@tk2-254-36564 ~]$ ls -l /home
合計 8
drwx------ 2 ftpuser ftpuser 4096 10月 15 07:37 2017 ftpuser
drwx------ 5 takatoh takatoh 4096 10月  5 21:54 2017 takatoh
[takatoh@tk2-254-36564 ~]$ sudo mkdir -p /home/ftpuser/public
[takatoh@tk2-254-36564 ~]$ sudo ls -l /home/ftpuser
合計 4
drwxr-xr-x 2 root root 4096 10月 15 07:41 2017 public
[takatoh@tk2-254-36564 ~]$ sudo chown ftpuser:ftpuser /home/ftpuser/public
[takatoh@tk2-254-36564 ~]$ sudo ls -l /home/ftpuser
合計 4
drwxr-xr-x 2 ftpuser ftpuser 4096 10月 15 07:41 2017 public

インストール

[takatoh@tk2-254-36564 ~]$ sudo yum install vsftpd

設定ファイル /etc/vsftpd/vsftpd.conf の設定

変更した点、重要な点だけ書く。

[takatoh@tk2-254-36564 ~]$ cd /etc/vsftpd
[takatoh@tk2-254-36564 vsftpd]$ ls
ftpusers  user_list  vsftpd.conf  vsftpd_conf_migrate.sh
[takatoh@tk2-254-36564 vsftpd]$ sudo cp vsftpd.conf vsftpd.conf.orig
[takatoh@tk2-254-36564 vsftpd]$ sudo vim vsftpd.conf

anonymousログインを許可しない。NO に変更。

anonymous_enable=NO

ローカルユーザのログインを許可する設定。そのまま。

local_enable=YES

anonymousログインでの書き込みを許可しない。コメントのまま。

#anon_upload_enable=YES

anonymousログインでのディレクトリ作成を許可しない。コメントのまま。

#anon_mkdir_write_enable=YES

ログファイルにアップロードとダウンロードの詳細を記録する。そのまま。

xferlog_enable=YES

データ接続でサーバがポート20を送信元にする。そのまま。

connect_from_port_20=YES

ログファイルのファイル名。デフォルトでよいのでコメントのまま。

#xferlog_file=/var/log/xferlog

ログをxferlogのフォーマットにする。そのまま。

xferlog_std_format=YES

アップロード、ダウンロードでの ASCII 転送を認めないのでコメントのまま。

#ascii_upload_enable=YES
#ascii_download_enable=YES

ローカルユーザがログイン後にホームディレクトリに chroot するかの設定。コメントを外して有効にする。

chroot_local_user=YES

chroot_listを有効にする。chroot_local_user の設定で意味が変わる。YES の場合、chroot_list_file は chroot しないユーザを指定する。コメントを外して有効にする。

chroot_list_enable=YES

chroot_local_user を有効にしたので、chroot_list_file が無いとアクセスできない。コメントを外して有効にする。

chroot_list_file=/etc/vsftpd/chroot_list

スタンドアローン(デーモン)として起動するかの設定。そのまま。

listen=YES

ここからはデフォルトの設定ファイルにないので追記。
userlist_deny を NO にするとアクセスを許可するユーザーのリストになる。NO にする。

userlist_deny=NO

ユーザリストのファイルを指定。

userlist_file=/etc/vsftpd/user_list

ログイン後に移動するディレクトリを指定。chrootが有効になっている場合、chroot後のルートを指定する。

local_root=public

vsftpd.confの設定は終了。

chroot_local_user、chroot_list_enable の両方をYESにしたので、chroot_list_fileが無いとログインを拒否される。空のファイルを作る。

[takatoh@tk2-254-36564 vsftpd]$ sudo touch /etc/vsftpd/chroot_list

デフォルトでは /etc/vsftpd/user_list がアクセスを拒絶するリストになっている。許可するファイルに編集し直す。書いてあるユーザ名をすべてコメントアウトして ftpuser を追加する。

[takatoh@tk2-254-36564 vsftpd]$ sudo vim /etc/vsftpd/user_list

iptablesの設定

ftpのデータ用ポートのためのモジュールを読み込むように設定する。

[takatoh@tk2-254-36564 vsftpd]$ cd /etc/sysconfig
[takatoh@tk2-254-36564 sysconfig]$ sudo vim iptables-config
IPTABLES_MODULES="ip_conntrack_ftp"

ポート21への接続を許可するようにする。

[takatoh@tk2-254-36564 sysconfig]$ sudo vim iptables

つぎの行を追加。state ESTABLISHED,RELATEDとREJECTの間に追加する。

-A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT

iptables を再起動。

[takatoh@tk2-254-36564 sysconfig]$ sudo service iptables restart
iptables: Setting chains to policy ACCEPT: filter          [  OK  ]
iptables: Flushing firewall rules:                         [  OK  ]
iptables: Unloading modules:                               [  OK  ]
iptables: Applying firewall rules:                         [  OK  ]
iptables: Loading additional modules: ip_conntrack_ftp     [  OK  ]

FTPサーバ(デーモン)の起動

[takatoh@tk2-254-36564 ~]$ sudo service vsftpd start
Starting vsftpd for vsftpd:                                [  OK  ]

OS起動時にvsftpdも起動するようにする。

[takatoh@tk2-254-36564 ~]$ sudo chkconfig vsftpd on
[takatoh@tk2-254-36564 ~]$ sudo chkconfig --list vsftpd
vsftpd         	0:off	1:off	2:on	3:on	4:on	5:on	6:off

これでインストールと設定は終了。

テスト

ローカルから接続してファイルをアップロードしてみる。

takatoh@envelopes $ ftp ftp.lathercraft.net
Connected to lathercraft.net.
220 (vsFTPd 2.2.2)
Name (ftp.lathercraft.net:takatoh): ftpuser
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
226 Directory send OK.
ftp> put example.zip
local: example.zip remote: example.zip
200 PORT command successful. Consider using PASV.
150 Ok to send data.
226 Transfer complete.
300012340 bytes sent in 26.17 secs (10.9330 MB/s)
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
-rw-r--r--    1 501      502      300012340 Oct 14 23:47 example.zip
226 Directory send OK.
ftp> bye
221 Goodbye.

うまくいったようだ。
試しに wget でダウンロードしてみたけど、これもうまく行った。

参考ページ

cf. ftpサーバ(vsftpd)の設定

はてなダイアリーからはてなブログへ

はてなダイアリーに置いてある以前の古い記事をはてなブログに移行した。特に理由があったわけではないんだけど、なんとなく。はてなブログができてずいぶん経つし、ダイアリーはいつまであるかなー、と思ったからかな。
ともかく、はてなブログへは次のリンクからアクセスできます。

 cf. Haskellはスケるよ

さくらのVPSプラン乗り換え計画(14)

WordPress を旧サーバから移行する。

下準備

旧サーバから新サーバへ、データを移動しておく。Wordpress のデータをディレクトリごと tar でまとめて、データベースは mysqldump で出力した。

ユーザとデータベースを作成

WordPress 用のユーザとデータベースを作成。

[takatoh@tk2-254-36564 ~]$ mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 46
Server version: 5.1.73 Source distribution

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> CREATE USER 'wordpress'@'localhost' IDENTIFIED BY 'xxxxxxxx';
Query OK, 0 rows affected (0.01 sec)

mysql> CREATE DATABASE wpdb;
Query OK, 1 row affected (0.00 sec)

mysql> GRANT ALL ON wpdb.* TO 'wordpress'@'localhost';
Query OK, 0 rows affected (0.00 sec)

mysql> exit
Bye

データベースにデータを復元

今作ったデータベースにデータを復元する。

[takatoh@tk2-254-36564 ~]$ mysql -u wordpress -p wpdb < wpdb.sql
Enter password:

WordPressのデータを展開

tar で固めておいた WordPress のデータ一式を /var/www/wordpress に展開する。

[takatoh@tk2-254-36564 ~]$ cd /var/www
[takatoh@tk2-254-36564 www]$ sudo cp ~/wordpress.tgz .
[sudo] password for takatoh: 
[takatoh@tk2-254-36564 www]$ sudo tar xzf wordpress.tgz
[takatoh@tk2-254-36564 www]$ ls
cgi-bin  error  html  icons  lathercraft  wordpress  wordpress.tgz

Nginxにバーチャルホストの設定

/etc/nginx/conf.d/blog2.lathercraft.net.conf ファイルを作る。

server {
    # port
    listen 80;

    # server name
    server_name blog2.lathercraft.net;

    # document root
    root /ver/www/wordpress;

    # index
    index index.php;

    # log files
    access_log /var/log/nginx/blog.lathercraft.net/access.log main;
    error_log /var/log/nginx/blog.lathercraft.net/error.log warn;

    if (!-e $request_filename) {
        rewrite ^/(.+)# /index.php?q=$1 last;
        break;
    }

    try_files $uri $uri/ /index.php?q=$uri&$args;

    # php-fpm
    location ~\.php$ {
        root /var/www/wordpress;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico)$ {
        root /var/www/wordpress;
        access_log off;
        expires 30d;
    }
}

で、ログファイル用のディレクトリを作ったら Nginx をリスタート。

[takatoh@tk2-254-36564 conf.d]$ sudo service nginx restart
Stopping nginx:                                            [  OK  ]
Starting nginx:                                            [  OK  ]

名前解決のためにゾーン編集

さくらのゾーン編集のページで、blog2.lathercraft.net を登録する。

確認

さて、これで OK のはず。ブラウザで確認してみよう。
OK、大丈夫のようだ。

[追記]

しばらく様子を見ていたけど、大丈夫のようなので、blog2.lathercraft.net ではなく blog.lahtercraft.net でアクセスできるように変更した。

これで VPS プラン乗り変え計画は全て完了した。