お名前.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 がインストールされているか確認する。
$ sudo service blk-availability stop && \
sudo chkconfig blk-availability off
$ sudo service cpuspeed stop && \
sudo chkconfig cpuspeed off
$ sudo service haldaemon stop && \
sudo chkconfig haldaemon off
$ sudo service mdmonitor stop && \
sudo chkconfig mdmonitor off
$ sudo service messagebus stop && \
sudo chkconfig messagebus off
$ sudo service netfs stop && \
sudo chkconfig netfs off
$ sudo service quota_nld stop && \
sudo chkconfig quota_nld off
$ sudo service rdisc stop && \
sudo chkconfig rdisc off
$ sudo service svnserve stop && \
sudo chkconfig svnserve off
$ sudo service udev-post stop && \
sudo chkconfig udev-post off
$ 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.conf
の worker_processes
と worker_cpu_affinity
は CPU のコア数を基に設定する。
CPU のコア数を確認するには、以下のコマンドで確認できる。
$ grep processor /proc/cpuinfo |wc -l
コア数が 3 の場合は以下、nginx.conf
の worker_processes
と worker_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