19
19

More than 5 years have passed since last update.

CentOS 6.7 に Nginx、HHVM、MariaDB をインストールし、WordPress を動かす。

Last updated at Posted at 2015-09-27

お名前.com の VPSメモリ 2G プラン に標準 OS の CentOS 6.5 を使ってサーバーのセットアップをしています。

インフラ初心者が纏めているため、信用しないでください(笑)
この記事を参考にセットアップしたことによって被った損害・損失に対し、いかなる場合でも一切の責任を負いませんのでご了承ください。あくまでも自己責任でお願いします。

ツッコミやアドバイス、コメントでお待ちしています !

CentOS のセットアップ

アップデート

$ yum clean all && \
yum -y update && \
yum clean all && \
yum -y upgrade && \
yum clean all && \
cat /etc/redhat-release

日本語に対応

言語パッケージをグループインストール。

$ yum -y groupinstall "Japanese Support"

設定ファイルを編集。

$ vi /etc/sysconfig/i18n

下記のように変更。

LANG="ja_JP.UTF-8"
SUPPORTED="ja_JP.UTF-8:ja_JP:ja"
SYSFONT="latarcyrheb-sun16"

設定を反映させる。

$ source /etc/sysconfig/i18n

vim をインストール

$ sudo yum -y install vim-enhanced && \
sudo mv /bin/vi /bin/vim-tiny && \
sudo ln -s /usr/bin/vim /bin/vi

エイリアスを追加

$ vi /etc/bashrc
# alias
alias vi='vim'

$ source /etc/bashrc

行番号を表示

$ vi /etc/vimrc

下記を追加。

set number

/etc/vimrc はシステム設定なので、行番号を表示を追加くらいに留めておくのがよい。
設定ファイルの場所は、以下の通り。

   システム vimrc: "/etc/vimrc"
    ユーザ vimrc: "$HOME/.vimrc"
第 2 ユーザ vimrc: "~/.vim/vimrc"
     ユーザ exrc: "$HOME/.exrc"

Nginx ファイルを Syntaxhighlight するようにする

nginx.vim ファイルをダウンロードし、ファイルタイプを追加する。

$ sudo mkdir -p ~/.vim/syntax && \
cd ~/.vim/syntax && \
sudo wget https://raw.githubusercontent.com/evanmiller/nginx-vim-syntax/master/syntax/nginx.vim && \
vi ~/.vim/filetype.vim

下記をペースト。

au BufRead,BufNewFile /etc/nginx/*,/etc/nginx_old/*,/usr/local/nginx/conf/* if &ft == '' | setfiletype nginx | endif

作業用ユーザーを作成

$ useradd exampleuser && \
passwd exampleuser && \
usermod -G wheel exampleuser && \
id exampleuser

作業用ユーザーの公開鍵ファイルの作成

ローカル PC で、秘密鍵と公開鍵のペアキーを作成。
※ conoha の部分は適当に読み替えてください。

# 秘密鍵を生成
$ openssl genrsa -des3 -out ~/.ssh/conoha_rsa 2048

# パーミッションの変更
$ chmod 600 ~/.ssh/conoha_rsa

# 公開鍵を生成
$ ssh-keygen -y -f ~/.ssh/conoha_rsa > ~/.ssh/conoha_rsa.pub

# 鍵を登録する
$ ssh-add -K ~/.ssh/conoha_rsa

# 公開鍵をクリップボードにコピー
$ pbcopy < ~/.ssh/conoha_rsa.pub

リモートサーバーに公開鍵を設置

$ sudo mkdir -p /home/exampleuser/.ssh/ && \
sudo vi /home/exampleuser/.ssh/authorized_keys

ここで、先ほどクリップボードにコピーした公開鍵をペーストし保存。
保存後、.ssh ディレクトリ、authorized_keys の所有権やアクセス権を変える。

$ sudo chown exampleuser:exampleuser /home/exampleuser/.ssh/ && \
sudo chmod 700 /home/exampleuser/.ssh/ && \
sudo chown exampleuser:exampleuser /home/exampleuser/.ssh/authorized_keys && \
sudo chmod 400 /home/exampleuser/.ssh/authorized_keys

wheel グループのメンバーのみ root になれるようにする

$ vi /etc/pam.d/su
auth required pam_wheel.so use_uid <- コメントアウトを外す

$ vi /etc/login.defs
SU_WHEEL_ONLY yes                  <-最後の行に追加

sudo コマンドの設定

$ visudo
# %wheel ALL=(ALL) ALL            <- sudo コマンドにパスワードを必要とする場合 # を外す
# %wheel ALL=(ALL) NOPASSWD: ALL  <- sudo コマンドにパスワードを必要としない場合 # を外す

ログイン認証の方法と SSH ポート番号を変更

$ vi /etc/ssh/sshd_config
Port 10022                               <- SSH のポート番号を変更
Protocol 2                               <- SSH のプロトコルを SSH2 のみにする
PermitRootLogin no                       <- root でのログインを拒否
PubkeyAuthentication yes                 <- 公開鍵での認証を許可
AuthorizedKeysFile .ssh/authorized_keys  <- 公開鍵の設置場所をユーザディレクトリ配下の .ssh/authorized_keys に変更
IgnoreUserKnownHosts yes                 <- /etc/ssh_known_hosts または ~/.ssh/known_hosts を無視
PermitEmptyPasswords on                  <- パスワードが設定されていないアカウントを拒否
PasswordAuthentication on                <- パスワード認証を拒否
AllowUsers exampleuser                   <- ログイン許可するユーザー

設定を反映させる。

$ service sshd restart

ファイヤーウォールの設定(ポート番号の変更)

iptables がインストールされているか確認する。

$ rpm -qa iptables
バージョン情報が表示されればインストールされている

iptables をインストールする。

$ yum -y install iptables iptables-ipv6

iptables の設定

$ vi /etc/sysconfig/iptables
$ VGd

下記をペースト。

*filter
:INPUT   ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT  ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]

-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# SSH, HTTP, SSL
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 10022 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80    -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 443   -j ACCEPT

-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited

COMMIT

設定を反映させる。

$ service iptables restart

ip6tables の設定

$ vi /etc/sysconfig/ip6tables
$ VGd

下記をペースト。

*filter :INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]

-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmpv6 -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 51 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 51 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d ff02::fb -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# SSH, HTTP, SSL
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 10022 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80    -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 443   -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 546 --sport 547 -s fe80::/10 -d fe80::/10 -j ACCEPT

-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited

COMMIT

設定を反映させる。

$ service ip6tables restart

新しく作成したユーザーでサーバーにログインできるか確認

この作業時は、ログイン中の root ユーザーは絶対にログアウトさせないこと。
ログアウトしてしまうと、今までの設定に誤りがあった場合に取り返しがつかなくなる。

  • ssh or sftp ログインができる
  • su or sudo コマンドが使用できる

上記 2 点を確認する。
失敗する場合は設定が間違っている。
2 点の確認が成功した場合、ログイン中だった root ユーザーをログアウトさせ
root ユーザーでログインできない事を確認する。

以降の作業は新規に作成したユーザーで作業を行う。

不要なデーモンを停止

下記コマンドで起動中のデーモンを確認し不要なサービスを停止させる。

$ chkconfig --list | grep 3:on

acpid
ホスト側からシャットダウンできなくなるので on にしておく。
また、カスタムOS をインストールした場合は acpid がインストールされているか確認する。

ConohaのカスタムOSにacpidをインストール

blk-availability

$ sudo service blk-availability stop && \
sudo chkconfig blk-availability off

cpuspeed

$ sudo service cpuspeed stop && \
sudo chkconfig cpuspeed off

haldaemon

$ sudo service haldaemon stop && \
sudo chkconfig haldaemon off

mdmonitor

$ sudo service mdmonitor stop && \
sudo chkconfig mdmonitor off

messagebus

$ sudo service messagebus stop && \
sudo chkconfig messagebus off

netfs

$ sudo service netfs stop && \
sudo chkconfig netfs off

quota_nld

$ sudo service quota_nld stop && \
sudo chkconfig quota_nld off

rdisc

$ sudo service rdisc stop && \
sudo chkconfig rdisc off

svnserve

$ sudo service svnserve stop && \
sudo chkconfig svnserve off

udev-post

$ sudo service udev-post stop && \
sudo chkconfig udev-post off

yum-updateonboot

$ sudo service yum-updateonboot stop && \
sudo chkconfig yum-updateonboot off

yum-updatesd
※ yum-cron を使用するため停止させる。

$ sudo service yum-updatesd stop && \
sudo chkconfig yum-updatesd off

yum の自動アップデート

$ sudo yum -y install yum-cron

yum-cron 設定方法はこちらの記事で !
yum を使って システムアップデートを行う (自動化も)

アップデート不要なパッケージを指定

$ vi /etc/yum.conf

下記をペースト。

[main]
exclude=gcc* kde* openssh* kernel* php* mysql*

yum-cron の設定

$ vi /etc/sysconfig/yum-cron

yum-cron の起動

$ sudo service yum-cron start
$ sudo chkconfig yum-cron on

TCP カーネルパラメータの変更

ipv6 が不要であれば、その辺りは各々調節してください。

sysctl -w vm.swappiness=0 && \
sysctl -w net.ipv4.ip_local_port_range="18000 65535" && \
sysctl -w net.ipv4.tcp_tw_reuse=1 && \
sysctl -w net.ipv4.tcp_fin_timeout=10 && \
sysctl -w net.ipv4.tcp_max_syn_backlog=1024 && \
sysctl -w net.core.somaxconn=65535 && \
sysctl -w net.ipv6.conf.all.disable_ipv6=1 && \
sysctl -w net.ipv6.conf.default.disable_ipv6=1 && \
sysctl -w net.ipv6.conf.lo.disable_ipv6=1

設定ファイルの編集。

$ sudo cp /etc/sysctl.conf /etc/sysctl.conf_old && \
sudo vi /etc/sysctl.conf

下記を最後の行に追加。

vm.swappiness = 0
net.ipv4.ip_local_port_range = 18000 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_max_syn_backlog = 1024
net.core.somaxconn = 65535
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1

設定を反映させる。

$ sysctl -p

参考
Nginxのパフォーマンスを極限にするための考察
ローカルポートを食いつぶしていた話
Linuxカーネルパラメータ一覧・標準設定(CentOS 6)

prelink を無効化

$ sudo vi /etc/sysconfig/prelink
PRELINKING=no

$ sudo /usr/sbin/prelink -ua

SELinux を無効化

$ sudo vi /etc/selinux/config
SELINUX=disabled

root 宛のメールを転送する

$ sudo sed -i '/^root:/d' /etc/aliases && \
sudo vi /etc/aliases

「# Person who should get root's mail」の下にある「root:」の値を書き換える。

root: hoge@example.com

設定を反映させる。

$ sudo newaliases && \
sudo echo test | mail root

レポジトリの追加

$ rpm --import http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-6 && \
rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

$ rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi && \
rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

$ rpm --import https://yum.mariadb.org/RPM-GPG-KEY-MariaDB && \
vi /etc/yum.repos.d/mariadb.repo

# 以下を記述
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1.6/centos6-amd64
enabled=0
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

ライブラリを諸々インストール

# $ yum -y install http://vault.centos.org/6.5/cr/x86_64/Packages/kernel-devel-2.6.32-504.el6.x86_64.rpm

# お名前.com VPS 標準OS CentOS6.5 では一旦 remove
$ yum -y remove libyaml libyaml-devel

$ yum -y install \
    boost-devel \
    cmake cmake-devel \
    gperf gperf-devel \
    git git-devel \
    libmemcached libmemcached-devel \
    libevent libevent-devel \
    libcurl libcurl-devel \
    libxml2 libxml2-devel \
    libxslt libxslt-devel \
    libicu libicu-devel \
    libcap libcap-devel \
    libedit libedit-devel \
    libgcc libgcc.i686 \
    libjpeg-turbo libjpeg-turbo-devel \
    libpng libpng-devel \
    libyaml libyaml-devel \
    gcc-c++ \
    glibc-devel glibc-devel.i686 \
    unixODBC unixODBC-devel \
    sqlite sqlite-devel \
    expat expat-devel \
    bzip2 bzip2-devel \
    openssl openssl-devel \
    openldap openldap-devel \
    readline readline-devel \
    elfutils-libelf elfutils-libelf-devel \
    binutils binutils-devel \
    freetype freetype-devel \
    ImageMagick ImageMagick-devel \
    gzip gzip-devel \
    tar tar-devel \
    perl perl-devel \
    zip zip-devel \
    unzip unzip-devel \
    wget wget-devel

$ yum -y --enablerepo=epel install \
    libmcrypt libmcrypt-devel \
    gperftools gperftools-devel

$ yum -y install http://pkgrepo.linuxtech.net/el6/release/x86_64/liblcms2-2.4-1.el6.x86_64.rpm

$ yum -y install --enablerepo=epel,remi make pcre pcre-devel gd-devel zlib-devel GeoIP-devel libmemcache automake autoconf re2c

# 鬼車 のインストール
$ cd /tmp && \
sudo wget http://www.geocities.jp/kosako3/oniguruma/archive/onig-5.9.5.tar.gz -O onig-current.tar.gz && \
sudo mkdir onig-current && \
tar -zxvf onig-current.tar.gz -C /tmp/onig-current --strip-components=1 && \
cd ./onig-current && \
sudo ./configure && sudo make && sudo make install && \
rm -rf /tmp/onig-current.tar.gz && \
rm -rf /tmp/onig-current/

OPcache、Memcached、PHP をインストール

yum -y install --enablerepo=remi,remi-php56 \
    gd-last gd-devel \
    php php-devel \
    php-common \
    php-mbstring \
    php-pdo \
    php-cli \
    php-gd \
    php-fpm \
    php-mysql php-mysqlnd \
    php-xml \
    php-pear php-pear-DB php-pear-Auth-* php-pecl-crypto \
    php-odbc \
    php-xmlrpc \
    php-mcrypt \
    php-soap \
    php-tidy \
    php-opcache \
    php-pecl-memcached memcached

APCu をインストール

$ cd /tmp/ && \
sudo wget https://github.com/krakjoe/apcu/archive/v4.0.7.tar.gz -O apcu-current.tar.gz && \
sudo mkdir apcu-current && \
sudo tar -zxvf apcu-current.tar.gz -C /tmp/apcu-current --strip-components=1 && \
cd /tmp/apcu-current && \
phpize && \
sudo ./configure && sudo make && sudo make install && \
rm -rf /tmp/apcu-current.tar.gz && \
rm -rf /tmp/apcu-current/

MariaDB をインストール

$ yum -y install --enablerepo=mariadb \
    MariaDB-devel \
    MariaDB-client \
    MariaDB-server

MariaDB を起動

$ service mysql start

MariaDB の初期設定

$ mysql_secure_installation

Enter current password for root (enter for none):  <- ENTER
Set root password? [Y/n]                           <- ENTER
New password:                                      <- パスワードを入力
Re-enter new password:                             <- パスワードを再入力
Remove anonymous users? [Y/n]                      <- ENTER
Disallow root login remotely? [Y/n]                <- ENTER
Remove test database and access to it? [Y/n]       <- ENTER
Reload privilege tables now? [Y/n]                 <- ENTER

MariaDB を一旦終了させる

$ service mysql stop

設定ファイルの作成

サンプルファイルをコピーする。

$ sudo cp /usr/share/mysql/my-medium.cnf /etc/my.cnf.d/my.cnf
サンプルファイルの場所 用途
/usr/share/mysql/my-small.cnf 64MB RAM 以下の小規模サーバー向け
/usr/share/mysql/my-medium.cnf 32〜64MB RAM の MySQL 専用サーバー、または 128MB RAM 程度のサーバー向け
/usr/share/mysql/my-large.cnf 512MB RAM 程度の MySQL 専用サーバー向け
/usr/share/mysql/my-huge.cnf 1~2GB RAM 程度の MySQL 専用サーバー向け
/usr/share/mysql/my-innodb-heavy-4G.cnf 4GB RAM 程度で InnoDB ストレージエンジンのみを使用する大規模 MySQL 専用サーバー向け

カスタマイズ設定を追加

$ sudo mv /etc/my.cnf.d/server.cnf /etc/my.cnf.d/server.cnf_old && \
sudo vi /etc/my.cnf.d/server.cnf

下記をペースト。

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
#pid-file=/var/lib/mysql/mysql.pid
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
character-set-server=utf8
explicit_defaults_for_timestamp=1
default-storage-engine=InnoDB

innodb_strict_mode
innodb_file_per_table
innodb_use_sys_malloc
innodb_buffer_pool_size=128M
innodb_write_io_threads=4
innodb_read_io_threads=4
innodb_thread_concurrency=16
innodb_log_file_size=16M
innodb_flush_log_at_trx_commit=2
innodb_flush_method=O_DIRECT
innodb_fast_shutdown=0
innodb_buffer_pool_dump_at_shutdown=1
innodb_buffer_pool_load_at_startup=1

query_cache_size=128M
query_cache_limit=2M
query_cache_min_res_unit=4k
query_cache_type=1

tmp_table_size=128M
max_heap_table_size=128M

table_open_cache=1024
max_allowed_packet=1M
sort_buffer_size=512K
read_buffer_size=256K
read_rnd_buffer_size=256K
join_buffer_size=256K
key_buffer_size=16M

max_connections=256
thread_cache_size=256

slow_query_log
slow_query_log_file=/var/log/mysqld-slow.log
long_query_time=1

log-error=/var/log/mysqld.log

wait_timeout=60

plugin-load=handlersocket.so

[mysqld_safe]
log-error=/var/log/mysqld.log

データベースのチューニング

$ cd ~/
$ wget https://raw.githubusercontent.com/major/MySQLTuner-perl/master/mysqltuner.pl
$ perl <(wget -q -O - mysqltuner.pl)

MySQLTunerでMySQLのチューニングを診断する方法

ヒント

# データベース一覧
MariaDB [(none)]> show databases;

# ユーザー一覧
MariaDB [(none)]> select Host, User, Password from mysql.user;

# 指定のデータベースのテーブル一覧
MariaDB [(none)]> SHOW TABLES FROM tablename;

Nginx をインストール

Nginx をソースコードからインストールします。
執筆時点での最新安定版は、1.8.0です。

Nginx ユーザーを作成

$ useradd --shell /sbin/nologin nginx && \
id nginx

ソースコードのダウンロード

$ cd /tmp/ && \
sudo wget http://nginx.org/download/nginx-1.8.0.tar.gz -O nginx-current.tar.gz && \
sudo mkdir nginx-current && \
sudo tar -zxvf nginx-current.tar.gz -C /tmp/nginx-current --strip-components=1 && \
cd /tmp/nginx-current

NGX Cache Purge

$ sudo wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz -O ngx_cache_purge.tar.gz && \
sudo mkdir ngx_cache_purge && \
sudo tar -zxvf ngx_cache_purge.tar.gz -C /tmp/nginx-current/ngx_cache_purge --strip-components=1 && \
sudo rm -rf ngx_cache_purge.tar.gz

OpenSSL

$ sudo wget http://www.openssl.org/source/openssl-1.0.2d.tar.gz -O openssl.tar.gz && \
sudo mkdir openssl && \
sudo tar -zxvf openssl.tar.gz -C /tmp/nginx-current/openssl --strip-components=1 && \
sudo rm -rf openssl.tar.gz

NGX PageSpeed

$ git clone https://github.com/pagespeed/ngx_pagespeed.git && \
rm -rf ./ngx_pagespeed/.git && \
cd ./ngx_pagespeed && \
sudo wget https://dl.google.com/dl/page-speed/psol/1.9.32.6.tar.gz && \
sudo tar -zxvf 1.9.32.6.tar.gz && \
sudo rm -rf ./1.9.32.6.tar.gz

ビルド

$ cd /tmp/nginx-current && \
sudo ./configure \
--prefix=/etc/sysconfig/nginx \
--sbin-path=/usr/sbin/nginx \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/subsys/nginx \
--http-client-body-temp-path=/var/cache/nginx/client_temp \
--http-proxy-temp-path=/var/cache/nginx/proxy_temp \
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
--http-scgi-temp-path=/var/cache/nginx/scgi_temp \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_addition_module \
--with-http_sub_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_random_index_module \
--with-http_secure_link_module \
--with-http_stub_status_module \
--with-http_auth_request_module \
--with-mail \
--with-mail_ssl_module \
--with-file-aio \
--with-ipv6 \
--with-debug \
--with-http_spdy_module \
--with-openssl=/tmp/nginx-current/openssl \
--add-module=/tmp/nginx-current/ngx_cache_purge \
--add-module=/tmp/nginx-current/ngx_pagespeed && \
sudo make && sudo make install && \
sudo rm -rf /tmp/nginx-current/ && \
sudo rm -rf /tmp/nginx-current.tar.gz

フォルダの作成

$ sudo mkdir -m 755 -p /var/cache/nginx/ngx_pagespeed/ && \
sudo mkdir -m 755 -p /var/cache/nginx/ngx_pagespeed/ && \
sudo chown -R nginx:nginx /var/cache/nginx && \
sudo mkdir -m 755 -p /var/run/nginx/ && \
sudo chown nginx:nginx /var/run/nginx/ && \
sudo mkdir -m 755 -p /var/log/nginx/ngx_pagespeed/ && \
sudo chown -R nginx:nginx /var/log/nginx/ && \
sudo mkdir -m 755 -p /var/run/hhvm/ && \
sudo chown nginx:nginx /var/run/hhvm/ && \
sudo mkdir -m 755 -p /var/log/hhvm/ && \
sudo chown -R nginx:nginx /var/log/hhvm/ && \
sudo mkdir -m 755 -p /var/log/php-fpm/ && \
sudo chown -R nginx:nginx /var/log/php-fpm/

起動スクリプトの作成

$ vi /etc/init.d/nginx

下記をペースト。

#!/bin/sh
#
# nginx - this script starts and stops the nginx daemon
#
# chkconfig:   - 85 15
# description:  Nginx is an HTTP(S) server, HTTP(S) reverse \
#               proxy and IMAP/POP3 proxy server
# processname: nginx
# config:      /etc/nginx/nginx.conf
# config:      /etc/sysconfig/nginx
# pidfile:     /var/run/nginx.pid

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0

nginx="/usr/sbin/nginx"
prog=$(basename $nginx)

sysconfig="/etc/sysconfig/$prog"
lockfile="/var/lock/subsys/nginx"
pidfile="/var/run/nginx/${prog}.pid"

NGINX_CONF_FILE="/etc/nginx/nginx.conf"

[ -f $sysconfig ] && . $sysconfig


start() {
    [ -x $nginx ] || exit 5
    [ -f $NGINX_CONF_FILE ] || exit 6
    echo -n $"Starting $prog: "
    daemon $nginx -c $NGINX_CONF_FILE
    retval=$?
    echo
    [ $retval -eq 0 ] && touch $lockfile
    return $retval
}

stop() {
    echo -n $"Stopping $prog: "
    killproc -p $pidfile $prog
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f $lockfile
    return $retval
}

restart() {
    configtest_q || return 6
    stop
    start
}

reload() {
    configtest_q || return 6
    echo -n $"Reloading $prog: "
    killproc -p $pidfile $prog -HUP
    echo
}

configtest() {
    $nginx -t -c $NGINX_CONF_FILE
}

configtest_q() {
    $nginx -t -q -c $NGINX_CONF_FILE
}

rh_status() {
    status $prog
}

rh_status_q() {
    rh_status >/dev/null 2>&1
}

# Upgrade the binary with no downtime.
upgrade() {
    local oldbin_pidfile="${pidfile}.oldbin"

    configtest_q || return 6
    echo -n $"Upgrading $prog: "
    killproc -p $pidfile $prog -USR2
    retval=$?
    sleep 1
    if [[ -f ${oldbin_pidfile} && -f ${pidfile} ]];  then
        killproc -p $oldbin_pidfile $prog -QUIT
        success $"$prog online upgrade"
        echo
        return 0
    else
        failure $"$prog online upgrade"
        echo
        return 1
    fi
}

# Tell nginx to reopen logs
reopen_logs() {
    configtest_q || return 6
    echo -n $"Reopening $prog logs: "
    killproc -p $pidfile $prog -USR1
    retval=$?
    echo
    return $retval
}

case "$1" in
    start)
        rh_status_q && exit 0
        $1
        ;;
    stop)
        rh_status_q || exit 0
        $1
        ;;
    restart|configtest|reopen_logs)
        $1
        ;;
    force-reload|upgrade)
        rh_status_q || exit 7
        upgrade
        ;;
    reload)
        rh_status_q || exit 7
        $1
        ;;
    status|status_q)
        rh_$1
        ;;
    condrestart|try-restart)
        rh_status_q || exit 7
        restart
        ;;
    *)
        echo $"Usage: $0 {start|stop|reload|configtest|status|force-reload|upgrade|restart|reopen_logs}"
        exit 2
esac

実行権限を付与する。

$ chmod +x /etc/init.d/nginx

設定ファイルを用意

Amimoto の Nginx 設定ファイル を参考にするとよいと思います。
独自に用意している場合は、git clone などでリモートサーバーに持ってくると楽かもですね。

$ mv /etc/nginx/ /etc/nginx_old/ && \
cd /etc/ && \
git clone https://github.com/YOUR_USERNAME/nginx.git --depth=1 && \
rm -rf /etc/nginx/.git

nginx.confworker_processesworker_cpu_affinity は CPU のコア数を基に設定する。
CPU のコア数を確認するには、以下のコマンドで確認できる。

$ grep processor /proc/cpuinfo |wc -l

コア数が 3 の場合は以下、nginx.confworker_processesworker_cpu_affinity は以下のようになる。

worker_processes     3;
worker_cpu_affinity  001 010 100;

Nginx の起動

一番最後に行う。

ヒント

特定の URL のキャッシュを削除する。

$ find /var/cache/nginx/ -type f -exec grep -l "KEY: http://192.168.30.10/.*$" {} \; | xargs rm -f

HHVM のインストール

以下手順は HHVM Github Wiki Building and installing HHVM on CentOS 6.6 記載の手順と基本的に同じです。

gcc のインストール

著者は、この方法でインストールに成功したことがないです。

$ cd /tmp && \
sudo wget ftp://ftp.gnu.org/gnu/gcc/gcc-5.2.0/gcc-5.2.0.tar.gz -O gcc-current.tar.gz && \
sudo mkdir gcc-current && \
sudo tar -zxvf gcc-current.tar.gz -C /tmp/gcc-current --strip-components=1 && \
cd /tmp/gcc-current

gmp

$ sudo wget https://gmplib.org/download/gmp-6.0.0/gmp-6.0.0.tar.bz2 -O gmp-current.tar.bz2 && \
sudo mkdir gmp && sudo tar -jxvf gmp-current.tar.bz2 -C /tmp/gcc-current/gmp --strip-components=1

mpfr

$ sudo wget http://www.mpfr.org/mpfr-current/mpfr-3.1.3.tar.bz2 -O mpfr-current.tar.bz2 && \
sudo mkdir mpfr && sudo tar -jxvf mpfr-current.tar.bz2 -C /tmp/gcc-current/mpfr --strip-components=1

mpc

$ sudo wget http://www.multiprecision.org/mpc/download/mpc-1.0.3.tar.gz -O mpc-current.tar.gz && \
sudo mkdir mpc && sudo tar -zxvf mpc-current.tar.gz -C /tmp/gcc-current/mpc --strip-components=1

isl

$ sudo wget ftp://ftp.irisa.fr/pub/mirrors/gcc.gnu.org/gcc/infrastructure/isl-0.15.tar.bz2 -O isl-current.tar.bz2 && \
sudo mkdir isl && sudo tar -jxvf isl-current.tar.bz2 -C /tmp/gcc-current/isl --strip-components=1

cloog

$ sudo wget http://bastoul.net/cloog/pages/download/cloog-0.18.4.tar.gz -O cloog-current.tar.gz && \
sudo mkdir cloog && sudo tar -zxvf cloog-current.tar.gz -C /tmp/gcc-current/cloog --strip-components=1

ビルド

$ sudo mkdir /tmp/gcc-build && cd /tmp/gcc-build && \
sudo ../gcc-current/configure --enable-languages=c,c++,fortran --enable-multilib --prefix=/usr/local/gcc
$ sudo make && sudo make install

新バージョンに入れ替える

$ yum remove -y gcc gcc-c++ cpp
$ sudo mv /usr/bin/g++ /usr/bin/g++_old && \
sudo mv /usr/bin/c++ /usr/bin/c++_old && \
sudo ln -s -f /usr/local/gcc/bin/gcc /usr/bin/gcc && \
sudo ln -s -f /usr/local/gcc/bin/g++ /usr/bin/g++ && \
sudo ln -s -f /usr/local/gcc/bin/c++ /usr/bin/c++ && \
sudo ln -s -f /usr/local/gcc/bin/cpp /usr/bin/cpp && \
sudo ln -s -f /usr/local/gcc/bin/gfortran /usr/bin/gfortran && \
sudo ln -s -f /usr/local/gcc/bin/gcov /usr/bin/gcov && \
sudo cp /usr/local/gcc/lib64/libstdc++.so.6.0.20 /usr/lib64/. && \
sudo mv /usr/lib64/libstdc++.so.6 /usr/lib64/libstdc++.so.6.bak && \
sudo ln -s -f /usr/lib64/libstdc++.so.6.0.20 /usr/lib64/libstdc++.so.6

gcc のインストールその 2

$ sudo wget http://people.centos.org/tru/devtools-2/devtools-2.repo -O /etc/yum.repos.d/devtools-2.repo && \
sudo yum -y install devtoolset-2-gcc devtoolset-2-binutils devtoolset-2-gcc-c++ && \
sudo mv /usr/bin/g++ /usr/bin/g++_old && \
sudo mv /usr/bin/c++ /usr/bin/c++_old && \
sudo mv /usr/bin/c++filt /usr/bin/c++filt_old && \
sudo mv /usr/bin/cpp /usr/bin/cpp_old && \
sudo mv /usr/bin/cc /usr/bin/cc_old && \
sudo mv /usr/bin/gcov /usr/bin/gcov_old && \
sudo ln -s -f /opt/rh/devtoolset-2/root/usr/bin/c++ /usr/bin/ && \
sudo ln -s -f /opt/rh/devtoolset-2/root/usr/bin/c++filt /usr/bin/ && \
sudo ln -s -f /opt/rh/devtoolset-2/root/usr/bin/cpp /usr/bin/ && \
sudo ln -s -f /opt/rh/devtoolset-2/root/usr/bin/g++ /usr/bin/ && \
sudo ln -s -f /opt/rh/devtoolset-2/root/usr/bin/gcc /usr/bin/ && \
sudo ln -s -f /opt/rh/devtoolset-2/root/usr/bin/gcc-ar /usr/bin/ && \
sudo ln -s -f /opt/rh/devtoolset-2/root/usr/bin/gcc-nm /usr/bin/ && \
sudo ln -s -f /opt/rh/devtoolset-2/root/usr/bin/gcc-ranlib /usr/bin/ && \
sudo ln -s -f /opt/rh/devtoolset-2/root/usr/bin/gcov /usr/bin/ && \
hash -r

gmp

$ cd /tmp && \
sudo wget https://gmplib.org/download/gmp-6.0.0/gmp-6.0.0.tar.bz2 -O gmp-current.tar.bz2 && \
sudo mkdir gmp-current && sudo tar -jxvf gmp-current.tar.bz2 -C /tmp/gmp-current --strip-components=1 && \
cd /tmp/gmp-current && \
sudo ./configure --enable-cxx && sudo make && sudo make install && \
rm -rf /tmp/gmp-current.tar.gz && \
rm -rf /tmp/gmp-current/

mpfr

$ cd /tmp && \
sudo wget http://www.mpfr.org/mpfr-current/mpfr-3.1.3.tar.bz2 -O mpfr-current.tar.bz2 && \
sudo mkdir mpfr-current && sudo tar -jxvf mpfr-current.tar.bz2 -C /tmp/mpfr-current --strip-components=1 && \
cd /tmp/mpfr-current && \
sudo ./configure && sudo make && sudo make install && \
rm -rf /tmp/mpfr-current.tar.gz && \
rm -rf /tmp/mpfr-current/

mpc

$ cd /tmp && \
sudo wget http://www.multiprecision.org/mpc/download/mpc-1.0.3.tar.gz -O mpc-current.tar.gz && \
sudo mkdir mpc-current && sudo tar -zxvf mpc-current.tar.gz -C /tmp/mpc-current --strip-components=1 && \
cd /tmp/mpc-current && \
sudo ./configure && sudo make && sudo make install && \
rm -rf /tmp/mpc-current.tar.gz && \
rm -rf /tmp/mpc-current/

isl

$ cd /tmp && \
sudo wget ftp://ftp.irisa.fr/pub/mirrors/gcc.gnu.org/gcc/infrastructure/isl-0.15.tar.bz2 -O isl-current.tar.bz2 && \
sudo mkdir isl-current && sudo tar -jxvf isl-current.tar.bz2 -C /tmp/isl-current --strip-components=1 && \
cd /tmp/isl-current && \
sudo ./configure && sudo make && sudo make install && \
rm -rf /tmp/isl-current.tar.gz && \
rm -rf /tmp/isl-current/

cloog

$ cd /tmp && \
sudo wget http://bastoul.net/cloog/pages/download/cloog-0.18.4.tar.gz -O cloog-current.tar.gz && \
sudo mkdir cloog-current && sudo tar -zxvf cloog-current.tar.gz -C /tmp/cloog-current --strip-components=1 && \
cd /tmp/cloog-current && \
sudo ./configure && sudo make && sudo make install && \
rm -rf /tmp/cloog-current.tar.gz && \
rm -rf /tmp/cloog-current/

libtool のインストール

$ cd /tmp && \
sudo wget http://ftpmirror.gnu.org/libtool/libtool-2.4.6.tar.gz -O libtool-current.tar.gz && \
sudo mkdir ./libtool-current && \
sudo tar -zxvf libtool-current.tar.gz -C /tmp/libtool-current --strip-components=1 && \
cd ./libtool-current && \
sudo ./configure && sudo make && sudo make install && \
sudo rm -rf /tmp/libtool-current/ && \
sudo rm -rf /tmp/libtool-current.tar.gz

HHVM のダウンロード

$ cd /usr/local && \
git clone git://github.com/facebook/hhvm.git --depth=1 && \
cd hhvm && \
export CMAKE_PREFIX_PATH=/usr/local

curl のインストール

# 下記 URL 先から適当にミラーを選んでください
# http://curl.haxx.se/latest.cgi?curl=tar.gz
$ cd /tmp && \
sudo wget http://curl.mirror.anstey.ca/curl-7.44.0.tar.gz -O curl-current.tar.gz && \
sudo mkdir ./curl-current && \
sudo tar -zxvf ./curl-current.tar.gz -C /tmp/curl-current --strip-components=1 && \
cd ./curl-current && \
./configure --enable-libcurl-option && sudo make && sudo make install && \
sudo rm -rf /tmp/curl-current/ && \
sudo rm -rf /tmp/curl-current.tar.gz

Boost のインストール

$ cd /tmp && \
sudo wget http://downloads.sourceforge.net/project/boost/boost/1.59.0/boost_1_59_0.tar.gz -O boost-current.tar.gz && \
sudo mkdir ./boost-current && \
sudo tar -zxvf boost-current.tar.gz -C /tmp/boost-current --strip-components=1 && \
cd ./boost-current && \
sudo ./bootstrap.sh && \
sudo ./b2 --layout=system install
$ export PATH=/usr/local/boost/include:$PATH && \
export PATH=/usr/local/boost/lib:$PATH && \
sed -i '/export PATH/i PATH=$PATH:/usr/local/boost/include' ~/.bash_profile && \
sed -i '/export PATH/i PATH=$PATH:/usr/local/boost/lib' ~/.bash_profile

# 上記で Path が通らない場合は以下を追加
$ export BOOST_INCLUDEDIR=/usr/local/boost/include:$BOOST_INCLUDEDIR && \
export LD_LIBRARY_PATH=/usr/local/boost/lib

export BOOST_ROOT=/usr/local/boost/:$BOOST_ROOT

export CMAKE_INCLUDE_PATH=$CMAKE_PREFIX_PATH/boost/include && \
export CMAKE_LIBRARY_PATH=$CMAKE_PREFIX_PATH/boost/lib

# 後始末
$ sudo rm -rf /tmp/boost-current/ && \
sudo rm -rf /tmp/boost-current.tar.gz

libmemcached のインストール

$ cd /tmp && \
sudo wget https://launchpad.net/libmemcached/1.0/1.0.9/+download/libmemcached-1.0.9.tar.gz -O libmemcached-current.tar.gz && \
sudo mkdir ./libmemcached-current && \
tar -xzvf ./libmemcached-current.tar.gz -C /tmp/libmemcached-current --strip-components=1 && \
cd ./libmemcached-current && \
./configure --prefix=$CMAKE_PREFIX_PATH && sudo make && sudo make install && \
sudo rm -rf /tmp/libmemcached-current/ && \
sudo rm -rf /tmp/libmemcached-current.tar.gz

JEMalloc のインストール

$ cd /tmp && \
sudo wget http://www.canonware.com/download/jemalloc/jemalloc-3.5.1.tar.bz2 -O jemalloc-current.tar.gz && \
sudo mkdir ./jemalloc-current && \
tar -xjvf jemalloc-current.tar.gz -C /tmp/jemalloc-current --strip-components=1 && \
cd ./jemalloc-current && \
./configure --prefix=$CMAKE_PREFIX_PATH && sudo make && sudo make install && \
sudo rm -rf /tmp/jemalloc-current/ && \
sudo rm -rf /tmp/jemalloc-current.tar.gz

sqlite のインストール

$ cd /tmp && \
sudo wget http://ftp.osuosl.org/pub/blfs/conglomeration/sqlite/sqlite-autoconf-3081101.tar.gz -O sqlite-current.tar.gz && \
sudo mkdir ./sqlite-current && \
tar -zxvf sqlite-current.tar.gz -C /tmp/sqlite-current --strip-components=1 && \
cd ./sqlite-current && \
./configure --prefix=$CMAKE_PREFIX_PATH && sudo make && sudo make install && \
sudo rm -rf /tmp/sqlite-current/ && \
sudo rm -rf /tmp/sqlite-current.tar.gz

OCaml のインストール

$ sudo wget http://download.opensuse.org/repositories/home:/ocaml/CentOS_6/home:ocaml.repo -O /etc/yum.repos.d/ocaml.repo && \
yum -y install ocaml

TBB のインストール

$ yum -y install ftp://ftp.pbone.net/mirror/ftp5.gwdg.de/pub/opensuse/repositories/home:/zgyarmati:/hhphp/CentOS_CentOS-5/x86_64/tbb-4.0-2.6.x86_64.rpm
$ yum -y install ftp://ftp.pbone.net/mirror/ftp5.gwdg.de/pub/opensuse/repositories/home:/zgyarmati:/hhphp/CentOS_CentOS-5/x86_64/tbb-devel-4.0-2.6.x86_64.rpm

glog のインストール

$ cd /tmp && \
sudo wget https://google-glog.googlecode.com/files/glog-0.3.3.tar.gz -O glog-current.tar.gz && \
sudo mkdir glog-current && \
tar -zxvf glog-current.tar.gz -C /tmp/glog-current --strip-components=1 && \
cd ./glog-current && \
./configure && sudo make && sudo make install && \
sudo rm -rf /tmp/glog-current/ && \
sudo rm -rf /tmp/glog-current.tar.gz

libdwarf のインストール

$ cd /tmp && \
sudo wget http://www.prevanders.net/libdwarf-20150310.tar.gz -O libdwarf-current.tar.gz && \
sudo mkdir libdwarf-current && \
tar -zxvf libdwarf-current.tar.gz -C /tmp/libdwarf-current --strip-components=1 && \
cd ./libdwarf-current && \
./configure && sudo make && \
sudo cp ./libdwarf/libdwarf.a /usr/lib64/ && \
sudo cp ./libdwarf/libdwarf.h /usr/include/ && \
sudo cp ./libdwarf/dwarf.h /usr/include/ && \
sudo rm -rf /tmp/libdwarf-current/ && \
sudo rm -rf /tmp/libdwarf-current.tar.gz

HHVM のインストール

$ cd /usr/local/hhvm && \
git submodule update --init --recursive
$ sudo cmake .
$ sudo sed -i -e 's/$/..\/..\/..\/lib\/libmemcached.so/g' hphp/hhvm/CMakeFiles/hhvm.dir/link.txt
$ sudo make
$ export PATH=/usr/local/hhvm/hphp/hhvm:$PATH && \
sed -i '/export PATH/i PATH=$PATH:/usr/local/hhvm/hphp/hhvm' ~/.bash_profile

設定ファイルの作成

$ sudo mldir /etc/hhvm/ && \
sudo vi /etc/hhvm/server.hdf

下記をペースト。

PidFile = /var/run/hhvm/hhvm.pid

Server {
  Type = fastcgi
  FileSocket = /var/run/hhvm/hhvm.sock
  User = nginx
  Group = nginx
}

Log {
  Level = Warning
  AlwaysLogUnhandledExceptions = true
  RuntimeErrorReportingLevel = 8191
  UseLogFile = true
  UseSyslog = false
  File = /var/log/hhvm/error.log
  Access {
    * {
      File = /var/log/hhvm/access.log
      Format = %h %l %u % t \"%r\" %>s %b
    }
  }
}

Repo {
  Central {
    # Path = /var/log/hhvm/.hhvm.hhbc
    Path = /var/tmp/hhvm.hhbc
  }
}

MySQL {
  TypedResults = false
}
$ sudo vi /etc/hhvm/config.hdf

下記をペースト。

Log {
  Level = Warning
  AlwaysLogUnhandledExceptions = true
  RuntimeErrorReportingLevel = 8191
}

MySQL {
  TypedResults = false
}

Eval {
  JitASize = 67108864
  JitAStubsSize = 67108864
  JitGlobalDataSize = 22554432
}

起動スクリプトの作成

$ sudo vi /etc/init.d/hhvm

下記をペースト。

#!/bin/bash
#
# /etc/rc.d/init.d/hhvm
#
# Starts the hhvm daemon
#
# chkconfig: 345 26 74
# description: HHVM (aka the HipHop Virtual Machine) is an open-source virtual machine designed for executing programs written in Hack and PHP
# processname: hhvm

### BEGIN INIT INFO
# Provides: hhvm
# Required-Start: $local_fs
# Required-Stop: $local_fs
# Default-Start:  2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: start and stop hhvm
# Description: HHVM (aka the HipHop Virtual Machine) is an open-source virtual machine designed for executing programs written in Hack and PHP
### END INIT INFO

# Source function library.
. /etc/init.d/functions

start() {
  echo -n "Starting hhvm: "
        /usr/local/hhvm/hphp/hhvm/hhvm --config /etc/hhvm/server.hdf --user nginx --mode daemon
  touch /var/lock/subsys/hhvm
}

stop() {
  echo -n "Shutting down hhvm: "
  killproc -p /var/run/hhvm/hhvm.pid hhvm
  rm -f /var/lock/subsys/hhvm
}

case "$1" in
  start)
  start
  ;;
  stop)
  stop
  ;;
  status)
    status -p /var/run/hhvm/hhvm.pid hhvm
  ;;
  restart)
    stop
  start
  ;;
  reload|condrestart|probe)
  echo "$1 - Not supported."
  ;;
  *)
  echo "Usage: hhvm {start|stop|status|reload|restart[|probe]"
  exit 1
  ;;
esac
exit $?

実行権限を付与。

$ chmod +x /etc/init.d/hhvm

php.ini を変更

$ sudo mv /etc/php.ini /etc/php.ini_old && \
sudo vi /etc/php.ini

下記をペースト。

[PHP]
engine = On
short_open_tag = On
asp_tags = Off
precision = 14
y2k_compliance = On
output_buffering = 4096
zlib.output_compression = Off
implicit_flush = Off
unserialize_callback_func =
serialize_precision = 100
allow_call_time_pass_reference = Off
safe_mode = Off
safe_mode_gid = Off
safe_mode_include_dir =
safe_mode_exec_dir =
safe_mode_allowed_env_vars = PHP_
safe_mode_protected_env_vars = LD_LIBRARY_PATH
disable_functions =
disable_classes =
zend.enable_gc = On
expose_php = Off
max_execution_time = 90
max_input_time = 60
memory_limit = 128M
error_reporting = E_ALL & ~E_DEPRECATED
display_errors = Off
display_startup_errors = Off
log_errors = On
log_errors_max_len = 1024
ignore_repeated_errors = Off
ignore_repeated_source = Off
report_memleaks = On
track_errors = Off
html_errors = Off
variables_order = "GPCS"
request_order = "GP"
register_globals = Off
register_long_arrays = Off
register_argc_argv = Off
auto_globals_jit = On
post_max_size = 8M
magic_quotes_gpc = Off
magic_quotes_runtime = Off
magic_quotes_sybase = Off
auto_prepend_file =
auto_append_file =
default_mimetype = "text/html"
doc_root =
user_dir =
enable_dl = Off
file_uploads = On
upload_max_filesize = 4M
max_file_uploads = 20
allow_url_fopen = On
allow_url_include = Off
default_socket_timeout = 60

[Date]
date.timezone = "Asia/Tokyo"

[filter]

[iconv]

[intl]

[sqlite]

[sqlite3]

[Pcre]

[Pdo]

[Phar]

[Syslog]
define_syslog_variables  = Off

[mail function]
SMTP = localhost
smtp_port = 25
sendmail_path = /usr/sbin/sendmail -t -i
mail.add_x_header = On

[SQL]
sql.safe_mode = Off

[ODBC]
odbc.allow_persistent = On
odbc.check_persistent = On
odbc.max_persistent = -1
odbc.max_links = -1
odbc.defaultlrl = 4096
odbc.defaultbinmode = 1

[MySQL]
mysql.allow_persistent = On
mysql.max_persistent = -1
mysql.max_links = -1
mysql.default_port =
mysql.default_socket =
mysql.default_host =
mysql.default_user =
mysql.default_password =
mysql.connect_timeout = 60
mysql.trace_mode = Off

[MySQLi]
mysqli.max_links = -1
mysqli.default_port = 3306
mysqli.default_socket =
mysqli.default_host =
mysqli.default_user =
mysqli.default_pw =
mysqli.reconnect = Off

[OCI8]

[PostgresSQL]
pgsql.allow_persistent = On
pgsql.auto_reset_persistent = Off
pgsql.max_persistent = -1
pgsql.max_links = -1
pgsql.ignore_notice = 0
pgsql.log_notice = 0

[Sybase-CT]
sybct.allow_persistent = On
sybct.max_persistent = -1
sybct.max_links = -1
sybct.min_server_severity = 10
sybct.min_client_severity = 10

[bcmath]
bcmath.scale = 0

[browscap]

[Session]
;session.save_handler = files
session.save_handler = memcached
;session.save_path = "/var/tmp/php/session"
session.save_path = "tcp://localhost:11211"
session.use_cookies = 1
session.use_only_cookies = 1
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 0
session.cookie_path = /
session.cookie_domain =
session.cookie_httponly =
session.serialize_handler = php
session.gc_probability = 1
session.gc_divisor = 1000
session.gc_maxlifetime = 1440
session.bug_compat_42 = Off
session.bug_compat_warn = Off
session.referer_check =
session.entropy_length = 0
session.entropy_file =
session.cache_limiter = nocache
session.cache_expire = 180
session.use_trans_sid = 0
session.hash_function = 0
session.hash_bits_per_character = 5
url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=fakeentry"

[MSSQL]
mssql.allow_persistent = On
mssql.max_persistent = -1
mssql.max_links = -1
mssql.min_error_severity = 10
mssql.min_message_severity = 10
mssql.compatability_mode = Off
mssql.secure_connection = Off

[Assertion]

[COM]

[mbstring]

[gd]

[exif]

[Tidy]
tidy.clean_output = Off

[soap]
soap.wsdl_cache_enabled=1
soap.wsdl_cache_dir="/var/tmp"
soap.wsdl_cache_ttl=86400

[sysvshm]

[apc]
extension=apcu.so

apc.enabled=1
apc.enable_cli=1
apc.shm_segments=1
apc.shm_size=64M
apc.num_files_hint=128
apc.user_entries_hint=8192
apc.ttl=3600
apc.gc_ttl=3600
apc.user_ttl=7200
apc.use_request_time=1
apc.cache_by_default=1
apc.filters=.*\.phar
apc.mmap_file_mask=/dev/zero
apc.file_update_protection=2
apc.max_file_size=1M
apc.stat=1
apc.stat_ctime=0
apc.canonicalize=0
apc.write_lock=1
apc.report_autofilter=0
apc.rfc1867=0
apc.rfc1867_prefix =upload_
apc.rfc1867_name=APC_UPLOAD_PROGRESS
apc.rfc1867_freq=0
apc.rfc1867_ttl=3600
apc.include_once_override=0
apc.lazy_classes=0
apc.lazy_functions=0
apc.coredump_unmap=0
apc.file_md5=0
apc.preload_path

[opcache]
;zend_extension=opcache.so

opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.blacklist_filename=/etc/php.d/opcache*.blacklist
opcache.revalidate_freq=60
opcache.fast_shutdown=1

[memcached]
;extension=memcached.so

php.ini をコピーする

$ sudo cp -rf /etc/php.ini /etc/hhvm/php.ini

memcached の設定

設定を確認

$ cat /etc/php.d/50-memcached.ini
$ cat /etc/sysconfig/memcached

起動

$ sudo service memcached start && \
sudo chkconfig memcached on

PHP-FPM を設定

設定ファイルを作成

$ sudo mv /etc/php-fpm.conf /etc/php-fpm.conf_old && \
sudo vi /etc/php-fpm.conf

下記をペースト。

include=/etc/php-fpm.d/*.conf

[global]
pid = /var/run/php-fpm/php-fpm.pid
error_log = /var/log/php-fpm/error.log

設定ファイルを作成。

$ sudo mv /etc/php-fpm.d/www.conf /etc/php-fpm.d/www.conf_old && \
sudo vi /etc/php-fpm.d/www.conf

以下をペースト。

[www]
listen = /var/run/php-fpm.sock
listen.owner = nginx
listen.group = nginx
listen.mode = 0666

user = nginx
group = nginx

pm = dynamic
pm.max_children = 5
pm.start_servers = 1
pm.min_spare_servers = 1
pm.max_spare_servers = 4
pm.max_requests = 200

rlimit_files = 131072
rlimit_core = unlimited

request_terminate_timeout = 90
request_slowlog_timeout = 60

slowlog = /var/log/php-fpm/www-slow.log

php_admin_value[error_log] = /var/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on
php_admin_value[upload_max_filesize] = 4M
php_admin_value[post_max_size] = 4M
php_admin_value[max_execution_time] = 60

起動

$ sudo service php-fpm start && \
sudo chkconfig php-fpm on

HHVM を起動

$ sed -i -e '$ahhvm --mode daemon --user nginx --group nginx --config /etc/hhvm/server.hdf -vServer.Type=fastcgi -vServer.FileSocket=/var/run/hhvm/hhvm.sock' /etc/rc.d/rc.local && \
hhvm --mode daemon --user nginx --config /etc/hhvm/server.hdf -vServer.Type=fastcgi -vServer.FileSocket=/var/run/hhvm/hhvm.sock

# このコマンドは要らない?
$ update-alternatives --install /usr/bin/php php /usr/local/hhvm/hphp/hhvm/hhvm 60
$ sudo service hhvm start && \
sudo chkconfig hhvm on 

MySQL の起動

$ sudo service mysql start && \
sudo chkconfig mysql on

ドキュメントルートの作成

$ sudo mkdir -m +w -p /var/www/vhosts/default/ && \
sudo chown -R nginx:nginx /var/www/vhosts/*

WordPress のインストール

WP CLI のインストール

$ sudo wget https://raw.github.com/wp-cli/builds/gh-pages/phar/wp-cli.phar -O /usr/bin/wp && \
sudo chmod +x /usr/bin/wp

WordPress 用の DB を作成

$ mysql -u root -p
$ create database wordpress_db default character set utf8 collate utf8_general_ci;
$ GRANT ALL PRIVILEGES ON wordpress_db.* TO wordpress_db@localhost IDENTIFIED BY 'wordpress_db' WITH GRANT OPTION;

WordPress のインストール

root ユーザーだとエラーが出るので注意。

$ wp core download --locale=ja --path='/var/www/vhosts/default/'
$ cd /var/www/vhosts/default
$ wp core config --dbname='wordpress_db' --dbuser='wordpress_db' --dbpass='wordpress_db'
$ wp core install --url='192.168.30.10' --title='WordPress Test' --admin_name='admin' --admin_password='admin' --admin_email='admin@example.jp'

root ユーザーに戻り、各ディレクトリの所有者とグループを変更。

$ sudo chown -R nginx:nginx /var/www/vhosts/default/*

Nginx の起動

$ sudo service nginx start && \
sudo chkconfig nginx on

セキュリティ

Exec-Shield を有効化

$ su - root
$ echo 2 > /proc/sys/kernel/exec-shield
$ exit

LogWatch

ログ監視ツール。

$ sudo yum -y install logwatch &&\
sudo logwatch --print

必要に応じて logwatch の設定ファイル /etc/logwatch/conf/logwatch.conf を書き換える。

Logwatch を CentOS にインストールする
ログ監視ツール logwatch のインストールと設定 〜 CentOS6

DenyHosts

SSH のブルートフォースアタック対策ツール。

$ sudo yum -y install denyhosts && \
sudo service denyhosts start && \
sudo chkconfig denyhosts on

Clam AntiVirus

オープンソースで開発・運用されているウィルス対策ソフト。

$ sudo yum -y --enablerepo=epel install clamd && \
sudo vi /etc/clamd.conf

設定ファイルが開いたら、「User clam」を「User root」へ変更。

Clam AntiVirus を起動させる。

$ sudo service clamd start && \
sudo chkconfig clamd on

ウイルス定義ファイルをアップデート。

$ sudo freshclam

スケジュール設定ファイルを作成。

$ sudo vi /etc/cron.daily/virusscan

下記をペースト。

#!/bin/bash

PATH=/usr/bin:/bin

# clamd update
yum  --enablerepo=epel -y update clamd > /dev/null 2>&1

# virus scan
CLAMSCANTMP=`mktemp`
clamscan --recursive --remove  / > $CLAMSCANTMP 2>&1
[ ! -z "$(grep FOUND$ $CLAMSCANTMP)" ] && \

# when detect virus, send mail
grep FOUND$ $CLAMSCANTMP | mail -s "Virus Found in `hostname`" root
rm -f $CLAMSCANTMP

実行権限を付与。

$ sudo chmod +x /etc/cron.daily/virusscan

WAF (Web Application Firewall)

Nginx の場合、ngx_pagespeed などのように、ソースコードからビルドしなくてはならない。

現在調査中。
(WordPress と仲良くやれるのだろうか・・・。)

バックアップ

$ sudo wget ftp://mondo.mirror.pclark.com/pub/mondorescue/rhel/6/x86_64/mondorescue.repo -O /etc/yum.repos.d/mondorescue.repo && \
sudo yum -y --enablerepo=mondorescue install mondo && \
sudo mkdir ~/backup

バックアップを実行。

$ sudo mondoarchive -Oi -s 10000m -d ~/.backup -E ~/.backup -S /tmp -T /tmp -p `hostname`_`date +%Y%m%d`

バックアップファイルをローカルにダウンロード。

$ scp -P 10022 -i ~/.ssh/conoha_rsa exampleuser@192.168.0.0:/home/exampleuser/.backup/v192-168-0-0.example.jp_20150829-1.iso Desktop

SSL の設定

CSR と秘密鍵の作成

CSR ファイルは SSL 証明書購入申請の際に使用します。

$ openssl req -nodes -newkey -sha256 rsa:2048 -nodes -keyout example.jp.`date +'%Y%m%d'`.key -out example.jp.`date +'%Y%m%d'`.csr -subj "/C=JP/ST=Tokyo/L=Shibuya-ku/O=OrganizationUnitName/OU=-/CN=example.jp"

証明書の作成

Nginx の場合 ssl_certificate に指定するファイルです。

$ cat example_jp.crt サーバー証明書.crt 中間証明書.crt クロスルート証明書.crt > example.jp.`date +'%Y%m%d'`.pem

DH鍵交換に使用するパラメータファイルの作成

Nginx の場合 ssl_dhparam に指定するファイルです。

$ openssl dhparam 2048 -out example.jp.dhparam.`date +'%Y%m%d'`.pem

TLS Session Ticket に使用する鍵の作成

Nginx の場合 ssl_session_ticket_key に指定するファイルです。

$ openssl rand 48 > example.jp.ticket.`date +'%Y%m%d'`.key

OCSP Stapling に使用するパラメータファイルの作成

Nginx の場合 ssl_trusted_certificate に指定するファイルです。

$ cat 中間証明書.crt クロスルート証明書.crt ルート証明書.crt > example.jp.trusted.`date +'%Y%m%d'`.pem

GeoTrust クイックSSLプレミアム

中間CA証明書
https://www.geotrust.co.jp/resources/repository/intermediate.html
ルートCA証明書
http://www.geotrust.com/resources/root-certificates/index.html

参考サイト

Generate Mozilla Security Recommended Web Server Configuration Files
SSLチェックツール
SSL Server Test
GeoTrust SSL ToolBox
Security/Server Side TLS

参考サイト一覧

19
19
1

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
19
19