facts

オワタ\(^o^)/


CentOS 7でLet’s EncryptのSSL証明書を使用する

2017/07/24 17:30] 投稿者: lazycat カテゴリー: さくらのVPS

CentOS 7のサーバでオレオレ証明書でWebやメールサーバを運用していましたが、最近面倒くさくなってきました。

PCやMacは警告を二度と表示しないようにできますが、AndroidのChromeは証明書の警告をスキップする方法が見当たらず、アプリを終了すると毎回警告されます。

最近は非常に安い証明書もあるので、ちゃんとした証明書を買おうかとも思いましたが、VPSの使用料とドメイン代以外にあまりお金をかけたくありません。

前から名前を知ってはいたLet’s Encryptを使用してみることにします。
3ヶ月くらいで更新処理が必要という話を聞いていたので、面倒くさそうなので導入を見送ったような記憶がありますが、今は設定も更新も簡単にできるようです。

さくらインターネットのさくらのナレッジにあるnginx用の手順を参考に進めます。
Let’s EncryptのSSL証明書で、安全なウェブサイトを公開
nginx用ですが、Apacheでも基本的には同じですね。

すでにオレオレ証明書で、Apache、Postfix、Dovecotを設定済みなので、これらの設定については割愛します。
既存環境にLet’s EncryptのSSL証明書を使用する手順です。

certbot-autoをダウンロード

curl https://dl.eff.org/certbot-auto -o /usr/bin/certbot-auto
chmod 700 /usr/bin/certbot-auto

ertbot-autoで証明書を作成

certbot-auto certonly \
--webroot \
-w /var/www/html \
-d 証明書のドメイン \
--email メールアドレス

“-w /var/www/html”の部分はドキュメント・ルートのパスなので、VirtualHostの場合はVirtualHostのドキュメントルートにします。

利用規約(Terms of Service)が表示されるので、”A”を入力します。

-------------------------------------------------------------------------------
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.1.1-August-1-2016.pdf. You must agree
in order to register with the ACME server at
https://acme-v01.api.letsencrypt.org/directory
-------------------------------------------------------------------------------
(A)gree/(C)ancel:

Electronic Frontier Foundation にアドレスを共有するか聞かれるので、とりあえず”N”を入力します。

-------------------------------------------------------------------------------
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about EFF and
our work to encrypt the web, protect its users and defend digital rights.
-------------------------------------------------------------------------------
(Y)es/(N)o:

Apacheの設定を変更します。
/etc/httpd/conf/httpd.conf、SNIの場合はVirtualHostのSSLの証明書の設定を変更します。

SSLCertificateFile /etc/letsencrypt/live/証明書のドメイン/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/証明書のドメイン/privkey.pem

Apacheを再起動します。

systemctl restart httpd

Postfixの設定も変更します。
/etc/postfix/main.cf

smtpd_tls_cert_file = /etc/letsencrypt/live/証明書のドメイン/cert.pem
smtpd_tls_key_file = /etc/letsencrypt/live/証明書のドメイン/privkey.pem

Postfixを再起動します。

systemctl restart postfix

Dovecotの設定も変更します。
/etc/dovecot/conf.d/10-ssl.conf

ssl_cert = </etc/letsencrypt/live/証明書のドメイン/cert.pem
ssl_key = </etc/letsencrypt/live/証明書のドメイン/privkey.pem

Dovecotを再起動します。

systemctl restart dovecot

放っておくと3ヶ月で有効期限が切れてしまうので、証明書の自動更新設定を行います。
cron.dに下記の内容を登録します。viでやりました。
vi /etc/cron.d/certupdate

50 3 * * 0 root /usr/bin/certbot-auto renew --post-hook "systemctl restart httpd;systemctl restart postfix;systemctl restart dovecot" >/dev/null 2>&1

–post-hookを指定して証明書の更新時にApacheとPostfixとDovecotを再起動し、証明書がアップデートされるように設定しています。

CentOS 7.1 (1503)でopen files limitを変更する

2015/09/09 0:06] 投稿者: lazycat カテゴリー: さくらのVPS

CentOS 7のメモです。

open fileの制限で、Too many open filesが発生しないようにします。
ここのブログで発生したことはないですが…。

CentOS 6までは/etc/init.d/hogeに”ulimit -n 65535″のように書くだけでしたが、
CentOS 7はsystemdなので、方法が違います。

Apache
# mkdir -p /etc/systemd/system/httpd.service.d

vi /etc/systemd/system/httpd.service.d/limits.conf

[Service]
LimitNOFILE=65535

# systemctl daemon-reload

MariaDB
# mkdir -p /etc/systemd/system/mariadb.service.d

vi /etc/systemd/system/mariadb.service.d/limits.conf

[Service]
LimitNOFILE=65535

# systemctl daemon-reload

Dovecot
# mkdir -p /etc/systemd/system/dovecot.service.d

vi /etc/systemd/system/dovecot.service/limits.conf

[Service]
LimitNOFILE=65535

# systemctl daemon-reload

どのサービスも、同じですね。

open filesの確認方法は
# ps aux | grep “hoge”
でPIDを確認して、
# cat /proc/PID/limits | grep “open files”
です。

CentOS 7.1 (1503)にmaildrop 2.8をインストールする

2015/09/03 23:13] 投稿者: lazycat カテゴリー: さくらのVPS

またしてもCentOS 7です。

CentOS 7でPostfixと組み合わせるMDAはprocmailで特に困っていないのですが、5年前にVPSを使い始めたときにもprocmailは古いとすでに言われており、5年ほど経った今もprocmailは使われていながらももう古いという同じ状況です。

procmailのレシピも書いて使うのはもう慣れたので問題ないのですが、別の機会でmaildropを使うことになったのでCentOS 7でもわざわざmaildropを使ってみることにしました。

みんなprocmailで十分なのか、CentOS標準のパッケージにも、EPELにもありませんでした。

仕方ないのでソースからmaildropをインストールします。
標準で用意されているパッケージしか使わないと思って使い始めたCentOS 7も、なんだか方向性が変わってきました。
./configure時に–prefixを指定すれば、OSそのもののディレクトリを汚さずにソフトを入れられるのでむしろ歓迎です。

SourceForgeを見ると、maildropはCourierの一部のようです。
Courierはほかに何も使ってないので、不思議な感じです。

今回はmaildrop 2.8.3をインストールします。
maildrop 2.7以降は、ビルドにCourier Unicode Libraryが必要なようなので、先にCourier Unicode Libraryをインストールします。

# wget http://downloads.sourceforge.net/project/courier/courier-unicode/1.3/courier-unicode-1.3.tar.bz2
# tar xjf courier-unicode-1.3.tar.bz2
# cd courier-unicode-1.3

# ./configure --prefix=/opt/courier-unicode
# make
# make install

./configureの際に、–prefixを指定していつも通りインストール先を変えています。

Courier Unicode Libraryの作業が終わったら、maildropをビルドします。

# wget http://downloads.sourceforge.net/project/courier/maildrop/2.8.3/maildrop-2.8.3.tar.bz2
# tar xjf maildrop-2.8.3.tar.bz2
# cd maildrop-2.8.3

# ./configure --prefix=/opt/maildrop \
    CFLAGS="$CFLAGS -I/opt/courier-unicode/include" \
    CPPFLAGS="$CPPFLAGS -I/opt/courier-unicode/include" \
    LDFLAGS="-L/opt/courier-unicode/lib"
# make
# make install

こちらも./configureの際に、–prefixを指定していつも通りインストール先を変えています。
Courier Unicode Libraryを/opt/courier-unicodeにインストールしたので、include pathとlibrary pathを追加しています。ライブラリは標準のパスにインストールしないと少し面倒ですね。

Courier Unicode Libraryがないと怒られたりしましたが、インストール作業自体は簡単です。
Postfixではmain.cfで”mailbox_command = /opt/maildrop/bin/maildrop -d ${USER}”という感じで使います。

OpenSSHでユーザーのhomeをChrootDirectoryにしている場合、homeのオーナーがrootでなければChrootできないですが、この場合にはmaildropは”Home directory owned by wrong user.”と言って動作しません。
homeディレクトリのオーナーはユーザーにしましょう。ChrootDirectoryは仕方ないので/homeにします。

ユーザーごとのprocmailの設定は.procmailrcに書きましたが、maildropは.mailfilterに書きます。
maildropの設定ファイルの方が内容はわかりやすいですね。

以下、.mailfilterの設定例。
重複メールを消す場合
(dovecotだとMaildriの中にある.から始まるファイルはIMAPのメーラからフォルダに見えてしまうので注意)

`/opt/maildrop/bin/reformail -D 8192 $HOME/Maildir/duplicate.cache`
if ( $RETURNCODE == 0 )
    exit

SpamAssassinに渡す場合

xfilter "/usr/bin/spamc"

SpamAssassinにSPAM判定されたメールをSPAMフォルダに入れる場合

if ( /^X-Spam-Flag:.*YES/ )
{
	to "$HOME/Maildir/.SPAM"
}

CentOS 7.1 (1503)にHHVM 3.9をインストールしてApache 2.4でsuEXECのように動かす

2015/08/27 0:04] 投稿者: lazycat カテゴリー: WordPress, さくらのVPS

HHVMなるものを今更知ったのですが、速いとのことで、おもしろそうなので入れてみることにします。
タイミングのいいことに、HHVM3.9がリリースされたばかりです。
WordPressは動作するっぽいです。
このところCentOS 7漬けです。

Ubuntuはapt-getでインストールできるようですが、残念ながらCentOS 7パッケージの提供はありません。

“CentOS 7 HHVM”でググっても、謎のレポジトリのパッケージからインストールしていたり、そもそもCentOS 6用のパッケージをインストールしていたりする内容が出てくるのですが、後々トラブルが出そうでちょっと同じようには行いたくない感じです。

パッケージがない以上ビルドするしかないわけですが、日本語でまとめてあるのは下記のサイトぐらいでした。
http://y-uti.hatenablog.jp/entry/2014/07/11/060126
2014年の記事というかCentOS 7が出たばかりの頃の記事なので、ビルドまでの道のりが少しと思ってもう少し調べたら本家に書いてありました…。
CentOS 7が出てから1年も経ってますからね。

https://github.com/facebook/hhvm/wiki/Building-and-installing-hhvm-on-CentOS-7.x

この手順をベースに進めますが、実際に試すと書いてあることだけではうまくいきませんでした。
断片的な情報を集めて試行錯誤しましたが、最終的にはうまくいきました。

今回もsuEXECもどきです。Apacheと組み合わせてHHVMをユーザー権限で動作させます。

まずは、ビルドに必要なパッケージをインストールします。
EPELが必要です。

今更ですが、EPELは”yum install epel-release”で、インストールできます。

# yum install cpp gcc-c++ cmake git psmisc {binutils,boost,jemalloc}-devel \
{ImageMagick,sqlite,tbb,bzip2,openldap,readline,elfutils-libelf,gmp,lz4,pcre}-devel \
lib{xslt,event,yaml,vpx,png,zip,icu,mcrypt,memcached,cap,dwarf}-devel \
{unixODBC,expat,mariadb}-devel lib{edit,curl,xml2,xslt}-devel \
glog-devel oniguruma-devel ocaml gperf enca libjpeg-turbo-devel openssl-devel \
make --enablerepo=epel

実際にEPELからインストールされるのは、
enca
glog-devel
jemalloc-devel
libmcrypt-devel
lz4-devel
oniguruma-devel
だけでした。

“–enablerepo=epel”を付け忘れたら、
# yum install jemalloc-devel lz4-devel libmcrypt-devel glog-devel oniguruma-devel enca –enablerepo=epel
します。別に書かなくてもいいですね。

ccacheがインストールされていると自動で使ってくれるようなので、ccacheもインストールします。
ビルドし直すときに効果を発揮します。できればmakeは一度で終わりたいです。
# yum install ccache –enablerepo=epel

ソース用のディレクトリを作成します。
# mkdir ~/dev
# cd ~/dev

gitからソースコードを入手します。最新はこれです。
# git clone https://github.com/facebook/hhvm -b master hhvm –recursive

今回はHHVM-3.9.1を指定してみました。(※2015/10/14 HHVM 3.9.1に変更しました。)
# git clone https://github.com/facebook/hhvm -b HHVM-3.9.1 hhvm –recursive
かなり大きいので時間がかかります。

hhvmディレクトリに移動します。
# cd hhvm

※追記
そのままビルドすると、UNIX domain socketで動作させた場合に、socketのアクセス権が760なってしまいユーザー権限で動かす際に不都合があるのでソースを一カ所修正します。
# vi hphp/runtime/server/fastcgi/fastcgi-server.cpp

if (m_socketConfig.bindAddress.getFamily() == AF_UNIX) {
auto path = m_socketConfig.bindAddress.getPath();
chmod(path.c_str(), 0760);
}
↓113行目あたりにある0760を0766に変更します。
if (m_socketConfig.bindAddress.getFamily() == AF_UNIX) {
auto path = m_socketConfig.bindAddress.getPath();
chmod(path.c_str(), 0766);
}

この部分の変更でリビルドしましたが、2分くらいで終わりました。
入れててよかったccache。
※追記ここまで

自分でビルドしたものは標準のディレクトリに入れるとトラブル時に面倒なので、cmake実行時にprefixを指定します。
/opt/hhvmにインストールします。
こうすれば、問題が出たり要らなくなったときにさくっと消すことができます。
“-march=native”も指定してみました。

cmake \
    -DCMAKE_INSTALL_PREFIX:PATH=/opt/hhvm \
    -DCMAKE_C_FLAGS="-march=native" \
    -DCMAKE_CXX_FLAGS="-march=native" \
    .

「make with CORE_COUNT+1 threads, that would be fast. You may run out of RAM」ということで、
# make -j$(($(nproc)+1))
でmakeします。
さくらのVPS 1Gだとメモリも少ないですし、ただのmakeでもいいと思います。

環境次第ですが1~2時間くらいかかります。

Embedding php in hhvm
Creating symlinks for hhvm
[100%] Built target hhvm

と表示されたら完了です。

テストします。
# ./hphp/hhvm/hhvm –version

HipHop VM 3.9.1 (rel)
Compiler: tags/HHVM-3.9.1-0-g0f72cfc2f0a01fdfeb72fbcfeb247b72998a66db
Repo schema: 41db3511d4f69e5584304f64434cb13aa602e1ee

上記のようにバージョンが表示されます。(※2015/10/14 HHVM 3.9.1に変更しました。)

インストールします。
# make install

ビルドディレクトリを抜けます。
# cd ~

HHVMのサービスを追加します。
# vi /etc/systemd/system/hhvm.service

[Unit]
Description=HHVM HipHop Virtual Machine (FCGI)
After=syslog.target network.target

[Service]
ExecStartPre=-/usr/bin/mkdir -p /var/run/hhvm
ExecStartPre=-/usr/bin/chmod 777 /var/run/hhvm
ExecStart=/opt/hhvm/bin/hhvm --config /etc/hhvm/server.ini --mode daemon

ExecStartPost=-/usr/bin/sleep 2s
ExecStartPost=-/usr/bin/chmod 766 /var/run/hhvm/hhvm.sock

Restart=on-failure

[Install]
WantedBy=multi-user.target
DirectoryIndex

socketが標準だと760のアクセス権で作成されます。
PHP-FPMの時は666なので問題なかったのですが、760だとHHVMをユーザー権限で動かすことができません。
ExecStartPostでHHVMの起動後にアクセス権を変更しています。
すぐにchmodを行うとファイルがないと言われるので、sleepを入れています。
※追記:ExecStartPostでchmodを行う方法は、負荷が高いときや起動時にsleep 2sを入れても安定しない場合があったのでので、ソースを書き換えることにしました。

ExecStartであまりオプションを指定していませんが、ここでは最低限のオプションを指定し、設定はserver.iniファイルに代わりに書きます。

設定ファイル用のディレクトリを作成します。
# mkdir /etc/hhvm

設定ファイルを作成します。
# vi /etc/hhvm/server.ini

hhvm.server.user = apache

hhvm.server.type = fastcgi
hhvm.server.file_socket = /var/run/hhvm/hhvm.sock
hhvm.repo.central.path = /var/run/hhvm/hhvm.hhbc
pid = /var/run/hhvm/pid

hhvm.log.header = true
hhvm.log.use_log_file = true
hhvm.log.file = /var/log/hhvm/error.log

hhvm.server.fix_path_info = true

date.timezone = "Asia/Tokyo"
session.cookie_httponly = 1
session.hash_function = 1

session.save_handler=memcache
session.save_path="tcp://localhost:11211?persistent=1&weight=1&timeout=1&retry_interval=15"

server.iniはhhvmの設定と、php.iniが合体したような感じです。
memcachedも使用するようにしました。設定値はmemcacheです。

試行錯誤した結果、”hhvm.server.fix_path_info = true“を指定するのがポイントでした。
これがあると、Apache側では

<FilesMatch "\.php$">
    SetHandler "proxy:unix:/var/run/hhvm/hhvm.sock|fcgi://localhost/"
</FilesMatch>

でphpをHHVMで動かすことができます。
このオプションがないとphpを動かすとパスが変になって、PHP-FPMのようにFilesMatchとSetHandlerでfcgi proxyを使うことができません。
“hhvm.server.fix_path_info = true”なしの場合はProxyPassMatchで動かすことになりますが、ProxyPassMatchはDirectoryIndexが効かなかったりするのでおすすめできません。

ログのディレクトリとファイルを作成します。
# mkdir /var/log/hhvm
# touch /var/log/hhvm/error.log
# chown apache:apache /var/log/hhvm/error.log

サービスを起動します。
# systemctl start hhvm
# systemctl enable hhvm

例としてapache権限で動かす設定を記載しましたが、apache以外のユーザーで動かすことも可能なので、suEXECもどきとしても使えます。

例えば、
サービスと設定ファイルを
/etc/systemd/system/hhvm-user.service
/etc/hhvm/server-user.ini
みたいにして、

server-user.iniで

hhvm.server.user = user

hhvm.server.file_socket = /var/run/hhvm/hhvm-user.sock
hhvm.repo.central.path = /var/run/hhvm/hhvm-user.hhbc
pid = /var/run/hhvm/pid-user

hhvm.log.file = /var/log/hhvm/user.log

という感じにして、

ApacheではVirturalHostなどで、

<FilesMatch "\.php$">
    SetHandler "proxy:unix:/var/run/hhvm/hhvm-user.sock|fcgi://localhost/"
</FilesMatch>

とすれば、HHVMの実行ユーザーを変えることができます。

PHP-FPMで設定したときはPHP-FPMのサービスは一つでしたが、だいたい同じですね。

CentOS 7.1 (1503)でMovable Type 6をPSGIとApache 2.4で動かす

2015/08/23 18:30] 投稿者: lazycat カテゴリー: さくらのVPS

このブログはMovable Typeではないですが、CentOS 7でMovable TypeをPSGIで動作させた時の設定を記しておきます。

前回のApacheとPHP-FPMも同じ組み合わせの情報はありませんでしたが、今回も同じ構成の情報がなかったので、またいろんな情報を参考にまとめました。

調べ物をしていてたまにあるのですが、記事に日付が入っていないブログがあります。
情報の鮮度がわからないので、せっかく記事にしてあるのに残念ですね。

本題です。
前回設定した環境がベースです。

CentOS 7
Apache 2.4 (suEXEC有効)
MariaDB 5.5
Memcached
PHPは、今回関係ないですね。

依存関係などで後から問題を出したくないので、今回も基本的に標準レポジトリしか使いません。
どうしてもパッケージがない場合にEPELのみ使用します。
PerlのモジュールでEPELにもパッケージがない場合にのみcpanmでインストールします。
cpanmもlocal::libを使用してOS標準のディレクトリに入れず、何かあってもOSに問題が及ばないようにします。

というわけで、まずはyumでcpanmとlocal::libをインストールします。

# yum -y install perl-App-cpanminus perl-local-lib

local::libを有効にするため、zshなので.zshrcに下記を追加します。
bashなら.bashrcでしょうか。

eval $(perl -Mlocal::lib)

設定ファイルを再読込します。
# source .zshrc

次に、MT6を設置します。
suEXECなので、パーミッションをディレクトリは701、cgiは700にします。
mtcheck.cgiにアクセスして、必要なモジュールを確認します。

yum searchで探すわけですが、CentOS 7で必要だったものをとりあえず結果だけ書いておきます。

標準レポジトリからインストール
# yum install perl-IPC-Run perl-XML-LibXML perl-Crypt-SSLeay perl-GD perl-Archive-Tar ImageMagick-perl perl-YAML-Syck perl-Mozilla-CA perl-Net-SMTP-SSL

EPELレポジトリからインストール(Cache::Memcachedもついでに入れておきます)
# yum install perl-Net-SMTPS perl-Cache-Memcached perl-Crypt-DSA perl-Plack –enablerepo=epel

これで、足りないものが、
Cache::File
Imager
XML::SAX::Expat
XML::SAX::ExpatXS
CGI::PSGI
XMLRPC::Transport::HTTP::Plack
になります。

上記をcpanmでインストールします。
一部依存関係のビルドで失敗してしまうので、yumでもう少しモジュールを足します。

Imager用
# yum -y install libjpeg-devel libpng-devel giflib-devel
XML::SAX::ExpatXS用
# yum -y install expat-devel
XMLRPC::Transport::HTTP::Plack用(依存関係のSOAP::Liteのインストールが失敗する)
# yum install perl-SOAP-Lite –enablerepo=epel

cpanmでインストールします。
# cpanm Cache::Fil XML::SAX::Expat XML::SAX::ExpatXS CGI::PSGI XMLRPC::Transport::HTTP::Plack

local::libなので、このままだとcpanmでインストールしたものはパスが通ってないので、mt-check.cgiで足りないと相変わらず言われます。
ApacheがsuEXECなので、SetEnv PERL5LIBも使用できません。

MT5.1以降で使用できるLocalLibを使用します。

PerlモジュールをsuEXECの実行ユーザーのhomeにコピーします。
# cp -r ~/perl5 /home/user

mt-config.cgiに下記を追加します。

LocalLib /var/www/home/user/perl5/

前回、suEXECのために、/homeを/var/www/homeとして、マウントしています。

これで、必要なモジュールはすべてそろいました。
Movable Typeをインストールして設定します。

Memcachedも有効にします。mt-config.cgiに下記を追加します。

MemcachedServers localhost:11211

CGIでの動作であればこれで終了です。

CGIからPSGIに切り替えます。
ここまでの手順で、すでに下記のコマンドでPSGIとして動作が可能です。
# cd /path/to/mt
# plackup mt.msgi

ですが、

plackup コマンドで起動される Web サーバーはリクエストを順次処理するシンプルな実装であるため、例えば自身の記事に対してトラックバックを送信した場合などのときにデッドロックが発生します。

MTの公式に書いてあるので、PSGIサーバはStarman/Starletを使用します。

“plackup mt.psgi”で起動した状態だと、システム情報でmt-check.cgiが存在するのにないと言われたりするのも、上記の問題かもしれません。

Task::Plackをcpanmでインストールします。
こちらも一部依存関係のビルドで失敗してしまうので、yumでモジュールを足します。

Task::Plack用(依存関係のMouseのインストールが失敗する)
# yum install perl-Mouse –enablerepo=epel

cpanmでインストールします。割と時間がかかります。
# cpanm Task::Plack

もう一度、PerlモジュールをsuEXECの実行ユーザーのhomeにコピーしておきます。
# cp -r ~/perl5 /home/user

MTの公式ではStarmanを使用することを想定と記載がありますが、
StarmanよりもStarletの方が速いとのことなので、Starletを使用します。
# cd /path/to/mt
# plackup -s Starlet mt.msgi

これで、PSGIで動作するようになりました。

が、シェルを閉じると止まってしまいます。
screenで動かしてもいいですが、再起動のたびに自分で立ち上げないといけません。
サービスとして動作させます。

起動スクリプトを作成します。
場所はどこでもいいですが、/opt/local/binに入れることにします。

# vi /opt/local/bin/mtrun

#!/bin/sh
eval $(perl -Mlocal::lib)

MTPATH=/path/to/mt
PSGI=mt.psgi

cd $MTPATH

plackup -s Starlet $PSGI

local::libを使っているので、eval $(perl -Mlocal::lib)が必要です。
Starmanを使う場合は、最後がstarman –preload-app $PSGIになります。

# chmod +x /opt/local/bin/mtrun

サービスを追加します。
CentOS 7はsystemdなので、下記のようになります。

# vi /etc/systemd/system/mtpsgi.service

[Unit]
Description=Movable Type PSGI Service
After=network.target

[Service]
ExecStart=/opt/local/bin/mtrun
User=user
Group=user
Restart=on-failure

[Install]
WantedBy=multi-user.target

Descriptionは適当です。
ExecStartで作成した起動スクリプトを指定します。
User、GroupはApacheのsuEXECと同じユーザーを指定します。指定しないとアクセス権で問題が起こります。

# systemctl start mtpsgi.service
# systemctl enable mtpsgi.service

最後に、Apacheのリバースプロキシの設定をします。
VirtualHostの中に、ProxyPass、ProxyPassReverseを追加します。

<VirtualHost *:80>
ProxyPass /mt http://localhost:5000/mt
ProxyPassReverse /mt http://localhost:5000/mt
</VirtualHost>

# systemctl restart httpd

リバースプロキシを設定すると、MTのログのIPアドレスがすべて127.0.0.1で記録されてしまうので、
mt-config.cgiに下記を追加します。

TransparentProxyIPs 1

CentOS 7.1 (1503)でApache 2.4 Event MPM(suEXEC)とsuEXECもどきのPHP-FPMとMemcachedを組み合わせて動かす

2015/08/12 14:19] 投稿者: lazycat カテゴリー: WordPress, さくらのVPS

さくらのVPSにCentOS 7をセットアップした時の備忘録です。
Apache 2.4 Event MPMとPHP-FPMを組み合わせて使います。
CGIはsuEXECで動きます。PHPはsuEXECみたいに動きます。
PHPのセッション管理はmemcachedを使用します。

PHP-FPMだとnginxの情報が多くて、同じ構成はググっても出てきませんでした。
いろんな情報を参考にまとめました。
ユーザー名は”user”として書いてあります。

以前はremiやrpmforgeレポジトリを使用していましたが、サポート期間の不安や、パッケージの依存関係で問題が出るとどうにもならなくなるので、基本的に標準レポジトリしか使いません。
どうしてもパッケージがない場合にEPELのみ使用します。

yumでhttpd php-cli php-fpm memcached php-pecl-memcacheあたりをインストールします。
モジュール版のphpは不要です。

PHPのsuEXECもどきの設定をします。
併せてMemcachedを使用する設定をします。

# vi /etc/php.d/memcache.ini
下の方にあるsession.save_handlerとsession.save_pathのコメントを取ります。

; Use memcache as a session handler
session.save_handler=memcache
; Defines a comma separated of server urls to use for session storage
session.save_path="tcp://localhost:11211?persistent=1&weight=1&timeout=1&retry_interval=15"

# vi /etc/php.ini
コメントアウトします。

;session.save_handler = files

PHP-FPMの設定をします。
ユーザーごとに設定ファイルを作成します。
ログも分けます。
PHP-FPMはunix socketで動かします。
標準の/etc/php-fpm.d/www.confが不要であれば削除するかリネームします。

# vi /etc/php-fpm.d/user.conf

[user]
listen = /var/run/php-fpm/php-fpm-user.sock
user = user
group = user

pm = dynamic
pm.max_children = 5
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 4

php_admin_value[error_log] = /var/log/php-fpm/user.log
php_admin_flag[log_errors] = on

ログファイルを作成します。
# touch /var/log/php-fpm/user.log
# chown user:user /var/log/php-fpm/user.log

/var/log/php-fpmのアクセス権が770なのでそのままだとログが書き込みできません。
書き込みできるようにログディレクトリのアクセス権を変更します。
# chmod 775 /var/log/php-fpm

PHP-FPMのunix socketをバーチャルホストごとに変更すれば、PHPの実行ユーザーを変えられます。

次に、CGIのsuEXECです。

CentOS 7のsuEXECは/var/www/…./public_htmlというディレクトリでないと動作しないので、suEXECが動作する環境を作ります。
/var/wwwの下にユーザーディレクトリを持ってくるのは微妙です。
SSHのchrootも有効にしているので、ユーザーディレクトリからのシンボリックも使えません。
/var/wwwの下からシンボリックリンクを作成しても、今度はsuEXECがシンボリックリンクで動作しません。
シンボリックリンクではなく、mountのbindオプションを使用します。

/home/userの下に、public_htmlを作成し、バーチャルホストの公開ディレクトリにします。

# mkdir /home/user/public_html
# chown user:user /home/user/public_html
# chmod 701 /home/user/public_html(Apacheの動作にXX1が必要です)

mount –bindでマウントします。
# mkdir /var/www/home
# mount –bind /home /var/www/home
これで、/var/www/homeが/homeと同じ内容になります。

起動時からマウントするように、/etc/fstabに追加します
# echo “/home /var/www/home none bind 0 0” >> /etc/fstab

これで、Apache以外の準備はできました。

Apacheの設定です。

# vi /etc/httpd/conf.modules.d/00-mpm.conf
Event MPMに変更。

#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
LoadModule mpm_event_module modules/mod_mpm_event.so

# vi /etc/httpd/conf.modules.d/00-proxy.conf
proxy_fcgi_moduleはPHP-FPMで使用する。

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so

バーチャルホストごとに、CGIとPHPの実行ユーザーを実際のユーザーにします。
# vi /etc/httpd/conf/httpd.conf

<VirtualHost *:80>
    SuexecUserGroup user user
    DocumentRoot "/var/www/home/user/public_html"
    ServerName virtual.example.com
    <FilesMatch "\.php$">
        SetHandler "proxy:unix:/var/run/php-fpm/php-fpm-user.sock|fcgi://localhost/"
    </FilesMatch>
</VirtualHost>

<Directory "/var/www/home/user/public_html">
    Options ExecCGI
    AllowOverride None
    Require all granted
</Directory>

CGIはSuexecUserGroupでユーザーを指定します。
PHPはfcgi proxyを使用して、ユーザーごとに作成したPHP-FPMのunix socketを使用します。

これでおしまいです。

今更CentOS 7の感想

2015/08/12 12:15] 投稿者: lazycat カテゴリー: さくらのVPS

さくらのVPSを契約してから気づけばもう5年近く経っていました。
2011年にCentOS 6じゃなく、Scientific Linux 6をインストールして使ってからも同じくらい経ちます。

CentOS 7がリリースされてから1年くらい経ってますが、iptablesじゃないとか、コマンドとか変わっているらしいということで、面倒そうでスルーしていました。
別のところで使っているサーバのCentOS 5のサポート終了が近くなっているので、慌てないようにCentOS 7を導入することにしました。
CentOS 7であと9年くらいは安泰なはず。

Scientific Linux 6はまだサポート終了は先ですが、この際CentOS 7に移行しました。

さくらのVPSもメモリ1GBの同じ金額でSSDのプランがあったので、今回は新しくSSDのプランを契約しています。
今まで使っていたのはメモリが初期のメモリ512MBのプランが1GBになったものをずっと使っていたので、HDDも20GBしかなく、SSDプランの30GBにも負けていました…。

特にここ数年CentOS 5/6のサーバを運用してきたので、面倒ではありましたが、あまりトラブルはありませんでした。
むしろ、新しいOSっていいなって思いました。
昔もブログとかで調べましたが、最近はQuitaとかに情報が上がっているので昔よりも情報が豊富ですね。

ハマったところを書いてみようと思います。

ssh-keygen -t rsaで作成される鍵がAES-128-CBCになってたので、SFTPクライアントでうまく扱えなかった。
クライアントの問題だけど、結局パスワードなしで鍵を作成することになった。

PHPのセッション管理をmemcachedで行おうとしたら、php-pecl-memcacheとphp-pecl-memcachedのせいで混乱した。

このくらいでしょうか。

5年前にはなかった機能があったりして便利だったり、いい感じのサーバになりました。
nginxは、興味はあるけど、Apacheで頑張りました。

i.softbank.jpをSSL有効のfetchmailでiCloudに転送

2012/12/13 16:41] 投稿者: lazycat カテゴリー: OS X, さくらのVPS

去年の「iPhoneと@me.comで絵文字を受信したい…」という投稿で、i.softbank.jpをiCloud(当時はme.com)にfetchmailで転送する設定を書きましたが、最近サーバを再起動したところ転送されなくなっていたので設定を変更しました。

まだ1年ちょっとですが、いい感じで使えてました。

ログを見たら、
SSL connection failed.
socket error while fetching from …@imap.softbank.jp
という、SSLのSocketエラーなので、

下記の設定を

poll imap.softbank.jp
protocol imap
port 993
user i.softbank.jpのユーザー名(@の前の部分)
pass パスワード
ssl
sslproto ssl2
idle
mda “/usr/sbin/sendmail @me.comのアドレス”

下記に変更しました。

poll imap.softbank.jp
protocol imap
port 993
user i.softbank.jpのユーザー名(@の前の部分)
pass パスワード
ssl
sslproto ssl23
idle
mda “/usr/sbin/sendmail @me.comのアドレス”

これでOKでした。

転送できなかった期間のメールがサーバに残ったままだったので、
現在は過去のメールはi.softbank.jpに置いていないため、

ついでに、

#no fetchall

#no fetchall
fetchall

に変更しました。

iPhoneと@me.comで絵文字を受信したい…

2011/10/14 3:42] 投稿者: lazycat カテゴリー: OS X, さくらのVPS

iCloudの正式サービスが始まりました。

iPhoneのプッシュに対応したme.comも無料で使えるようになったので、是非利用したいところです。
ですが、me.comでは絵文字の送受信ができません。
me.comのアドレスでMacもiPhoneも一本化したいのですが、うまいこといきませんね。

絵文字の受信時にはソフトバンクのマークみたいな記号になります…。
これはGmailより劣りますね。

携帯各社が相互変換して見れるようになっているらしいので、me.comはダメです。
すぐにアップルが対応するとも思えません。

個人的に下記の3つを何とかしたいところ
・プッシュでメールを受信したい
・絵文字の受信がしたい
・受信のメールサーバは統一したい

これを満たすにはどうしたら良いのか?

プッシュはme.comを使う必要があるため、iPhoneは最終的にme.comで受信しないといけません。
絵文字はi.softbank.jpでメールを受ける必要があります。

i.softbank.jpからme.comに転送すればいけそうです。
が、i.softbank.jpには転送の機能がありません。残念。

そうなると、外部の力を借りるしかありません。
幸い、Linuxのサーバを借りているので、そこでfetchmailを動かして転送することにします。
借りてて良かったVPS。

下記、Scientific Linux 6での手順です。

1. fetchmailをインストールします
yum -y install fetchmail

2. fetchmailを動かすための設定をします
適当なユーザーアカウントで動かします
vi /home/ユーザー/.fetchmailrc

set daemon 600 #これがないとバックグラウンドで動きません 数字は300とか600とか900やら適当で
set postmaster root
set no bouncemail
set syslog

defaults
protocol auto
no mimedecode
no fetchall
keep

poll imap.softbank.jp
protocol imap
port 993
user i.softbank.jpのユーザー名(@の前の部分)
pass パスワード
ssl
sslproto ssl23 #これがないとSocket errorになる
idle #リアルタイムで転送してくれます
mda “/usr/sbin/sendmail @me.comのアドレス”

defaultsにある
“fetchall”や”no fetchall”、”keep””no keep”は好みに応じて。

下記のURLが参考になりましたが、SSLの接続でハマりました。
http://isoftbankforward.web.fc2.com/pcforward.html

3. パスワードなどが書いてあるので、一応ファイルのパーミッションを変更します
chmod 600 /home/ユーザー/.fetchmailrc

fetchmailの自動起動の仕方は下記URLそのままです。
http://scientificsrv.com/fetchmail.shtml

これで、me.comに転送されます。
MacはiCloudのメールで受信します。

iPhoneも同じでも良いのですが、小細工します。
返信してもらうときのアドレスがme.comの方だと、携帯からのメールが直で来ることになってしまう、絵文字が文字化けするので…。

iPhoneのiCloudのメールはオフにし、メールアカウントを手動で設定します。

アカウントの追加の、最初に差出人の名前やメールアドレスを入れる画面ではme.comのメールアドレスを入れます。
最初にi.softbank.jpのアドレスを入れると、アカウントの受信の設定で、何故かプッシュの設定が出てこないようです。

次に、下記のように入力します。

受信
サーバ: imap.mail.me.com (pXX-imap.mail.me.comでも可)
ユーザー名: iCloudメールアドレス
パスワード: Apple IDのパスワード

送信
サーバ: smtp.softbank.jp
ユーザー名: i.softbank.jpのユーザー名(@の前の部分)
パスワード: i.softbank.jpのパスワード

上記の設定でアカウントができたら、最後に差出人のアドレスをi.softbank.jpのアドレスに変更します。
差出人がi.softbank.jpのアドレスじゃないと、smtp.softbank.jpで送れません。

これで、他の人からは、i.softbank.jpでやりとりしているように見えるようになります。

この設定のメリットは
・返信されても絵文字受信OK
・絵文字の送信もOK
・携帯の受信制限に引っかからない
・アドレスが変わったという連絡が不要…

最終的に
「iPhoneと@me.comとi.softbank.jpを組み合わせて絵文字を受信したい」
になってしまいました。

me.comが重いのが難点ですね。
Lionにも絵文字あるんだから、me.comも対応してほしい。

Scientific Linux 6.1

2011/07/30 10:17] 投稿者: lazycat カテゴリー: エレクトロニクス, さくらのVPS

Scientific Linux 6.1が公開されてたので、さくっとアップデート。

yum clean all
yum –releasever=6.1 update yum
yum –releasever=6.1 update glibc
yum –releasever=6.1 update

問題なし。

 

こっちの方がいいようだ。

http://listserv.fnal.gov/scripts/wa.exe?A2=ind1107&L=scientific-linux-users&T=0&P=50939

Option 1: similar to RHEL / CentOS for i386 and x86_64:

yum install yum-conf-sl6x
yum clean all
yum update

Option 2: Scientific Linux way

i386:
rpm -Uvh http://ftp.scientificlinux.org/linux/scientific/6.1/i386/os/Packages/sl-release-6.1-2.i686.rpm
yum clean all
yum update

x86_64:
rpm -Uvh http://ftp.scientificlinux.org/linux/scientific/6.1/x86_64/os/Packages/sl-release-6.1-2.x86_64.rpm
yum clean all
yum update

次のページ