過去に Ubuntu 14.04LTS,Ubuntu 16.04 LTSでLEMP環境で使う場合のメモ書きとして投稿しましたが、今回Ubuntu 18.04 LTSが出たので、最新の情報に更新しておきます。
まず、構築する構成は以下のとおり
- Ubuntu 18.04 LTS
- Nginx(Let’s Encrypt で TLS 1.2 HTTP2対応)
- PHP 7.2
- MariaDB 10.3
今回はさくらのVPS上にカスタムOSとして Ubuntu 18.04をインストールした直後を想定します。
・NTPサーバーの設定
正確な時間は大事です
ntpdを入れる
sudo apt-get install ntp
ntpの設定
sudo vi /etc/ntp.conf
serverの項目に下記のものを入れておきましょう
server ntp.nict.jp
日本の標準時を作っている
NICT(情報通信研究機構)の
NTPサーバーなので正確かと。sakuraのVPSを使ってるなら ntp1.sakura.ad.jp が経路的に近いので良いかと。
・SSH周りの設定
ssh で、rootログインを無効にし、
google Authenticatorの2段階認証を導入する。(注:2段階認証を設定する場合は、必ずNTPサーバー設定後にする)
Google Authentication を導入
sudo apt-get install libpam-google-authenticator
Google Authentication を有効化
sudo vi /etc/pam.d/sshd
@include common-authとなっている下の行辺りに以下を追記
auth required pam_google_authenticator.so
sshdの設定変更
sudo vi /etc/ssh/sshd_config
Port 10022 # ポート22から任意のポートへ
PermitRootLogin no # rootでのログインをオフに
PasswordAuthentication no #パスワードでのログインをオフ
ChallengeResponseAuthentication yes #google authenticatorを使う為
ここまでsshd_configの設定をしたら、今度はgoogleのキーを作成して2段階認証できるようにします
google-authenticator
画面の指示に従い、スマホにキーを登録できればOK、万が一の緊急キーも控えておくように。 ここまで設定したら一度マシンを再起動しましょう。
sudo shutdown -r now
・NGINXを導入
ubuntuのリポジトリにあるnginxはバージョンが古いため、最新のものを公式から拾うようapt-getにリポジトリ追加をする。
sudo vi /etc/apt/sources.list.d/nginx.list
ここで、開発中の最新版と安定版の2つのリポジトリが存在するため、使用用途や好みでどちらかを設定する。(私は最新版を利用)
Stable version(安定板)
deb [arch=amd64] http://nginx.org/packages/ubuntu/ bionic nginx
deb-src http://nginx.org/packages/ubuntu/ bionic nginx
Mainline version(最新版)
deb [arch=amd64] http://nginx.org/packages/mainline/ubuntu/ bionic nginx
deb-src http://nginx.org/packages/mainline/ubuntu/ bionic nginx
このままインストールをしようとすると、depパッケージのGPGキーエラーが出てインストールできない為、GPGキーをインポートしておく
GPGキーインポートのために gnupg2をインストール
sudo apt-get install gnupg2
GPGキーをインポート
wget -O - http://nginx.org/keys/nginx_signing.key | sudo apt-key add -
aptパッケージ一覧を更新し、nginxをインストール
sudo apt-get update
sudo apt-get install nginx
PHPインストール
sudo apt-get install php7.2-cgi php7.2-mysql php7.2-gd php7.2-apcu php7.2-fpm php-pear php7.2-xmlrpc php7.2-mbstring
まずはnginxでPHPを動かす為のphp-fpmの設定から
php-fpmの設定
sudo vi /etc/php/7.2/fpm/php-fpm.conf
下記の部分を書き換える
events.mechanism = epoll #コメントアウトする
php-fpmの設定2
sudo vi /etc/php/7.2/fpm/pool.d/www.conf
下記の部分を書き換える
user = nginx #ユーザーをnginxへ
group = nginx #グループもnginxへ
listen = /run/php/php7.2-fpm.sock
listen.owner = nginx #ソケットユーザーをnginxへ
listen.group = nginx #ソケットグループもnginxへ
listen.mode = 0660 #ソケットのアクセス制限をかける
現状ソケット利用が一番安定してるかと。 設定が終わったら、php-fpmを再起動
sudo systemctl restart php7.2-fpm
あとはnginxの設定をする(webのディレクトリは/var/www配下に任意のディレクトリを置く) web用のホームディレクトリを作成
sudo mkdir /var/www/ #/var/wwwを作成
sudo mkdir /var/www/html
sudo chown -R nginx:nginx /var/www
改めて、web設定
sudo vi /etc/nginx/conf.d/default.conf
あくまでも参考例です
server {
listen 80;
listen [::]:80;#ipv6
server_name 自分のドメイン;
root /var/www/html;
index index.html index.htm index.php;
# Let's Encrypt設定用
location /.well-known/acme-challenge/ { allow all; }
#httpsへのリダイレクト
location / { return 301 https://$host$request_uri; }
location ~ /.ht { deny all; #.htから始まるファイルのアクセス禁止 }
location = /robots.txt { access_log off; log_not_found off; } #robots.txtへの404エラーを記録しない
location = /favicon.ico { access_log off; log_not_found off; } #favicon.icoへの404エラーを記録しない }
ssl設定
sudo vi /etc/nginx/conf.d/default_ssl.conf
あくまで参考例です
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;#ipv6
server_name 自分のドメイン;
root /var/www/html;
ssl_protocols TLSv1.2;#TLS1.2のみ
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/nginx/dhparam.pem;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_ecdh_curve X25519:secp521r1:secp384r1;
ssl_certificate /etc/letsencrypt/live/自分のドメイン/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/自分のドメイン/privkey.pem;
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/letsencrypt/live/自分のドメイン/fullchain.pem;
resolver 133.242.0.3 133.242.0.4 valid=30s; #サーバに設定してるDNSのIPを入れる
resolver_timeout 10s;
ssl_session_tickets on;
ssl_session_ticket_key /etc/nginx/ticket.key;
#charset koi8-r;
access_log /var/log/nginx/host.access.log main;
# Useful for Let's Encrypt
location /.well-known/acme-challenge/ { allow all; }
location / {
index index.html index.htm index.php;
try_files $uri $uri/ /index.php?$args;
}
rewrite /wp-admin$ $scheme://$host$uri/ permanent;
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires 24h;
log_not_found off;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/run/php/php7.2-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
location ~ /\.ht {
deny all;
}
location = /robots.txt { access_log off; log_not_found off; }
location = /favicon.ico { access_log off; log_not_found off; }
}
DH鍵交換に使用するパラメータファイルの生成
sudo openssl dhparam -out /etc/nginx/dhparam.pem 2048
TLS Session Ticketsを有効にするため、48バイトのランダムデータの鍵ファイル生成
sudo openssl rand 48 > /etc/nginx/ticket.key
Let’s Encrypt導入
sudo apt-get install cartbot
nginxを止める
sudo systemctl stop nginx
鍵の生成
ertbot certonly --standalone -d 自分のドメイン
画面の指示通りメールアドレスの入力やライセンスの同意、広告メールの選択をする
nginxの起動
sudo systemctl start nginx
鍵の更新ができるか確認
certbot certonly --webroot --must-staple --staple-ocsp -d 自分のドメイン -w /var/www/html/
選択が出るので2のRenewで
鍵の自動更新スクリプトを作成
sudo vi /etc/cron.daily/letsencrypt-renew
ファイルの中身
#!/usr/bin/env bash
certbot renew
systemctl reload nginx
実行権限をつけて設定を読み込む
sudp chmod +x /etc/cron.daily/letsencrypt-renew
sudo systemctl restart cron
maria db
maria dbも公式からDLします。以下URLを参考に
https://downloads.mariadb.org/mariadb/repositories/#mirror=yamagata-university&distro=Ubuntu&distro_release=bionic–ubuntu_bionic&version=10.3
sudo apt-get install software-properties-common sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
sudo add-apt-repository 'deb [arch=amd64,arm64,ppc64el] http://ftp.yz.yamagata-u.ac.jp/pub/dbms/mariadb/repo/10.3/ubuntu bionic main'
リポジトリ登録が済んだら実際にインストールしましょう
sudo apt-get update
sudo apt-get install mariadb-server
インストール後は初期設定を
sudo mysql_secure_installation
あとは、レンタルサーバー同様にWordpressをインストール
http://wpdocs.osdn.jp/WordPress_のインストール
enjoy!