growiとnginxを連携させ、ポート番号をブラウザに入力することなくアクセスできるよう設定します。
前提
この作業を行う場合は、サーバ名とIPアドレスが名前解決できることが必須となります。
mkcertのインストール
sudo su -
curl -s https://api.github.com/repos/FiloSottile/mkcert/releases/latest | grep browser_download_url | grep linux-amd64 | cut -d '"' -f 4 | wget -qi - \
&& mv mkcert-v*-linux-amd64 mkcert \
&& chmod a+x mkcert \
&& mv mkcert /usr/local/bin/
exit
mkcert 認証局作成
mkcert -install
mkcert -CAROOT
# 指定通りの場所にあるかを確認します
# このディレクトリにある「rootCA.pem」はブラウザにインポートすることによって「信頼された情報局」であると示すことができます
mkcertでローカル証明書を作成
cd ~
mkcert -key-file [証明書秘密鍵].key.YYYYMM -cert-file [証明書].crt.YYYYMM ドメイン
例
mkcert -key-file corn.wall.key.202204 -cert-file corn.wall.crt.202204 corn.wall penzance.corn.wall "*.corn.wall"
# ワイルドカード証明書も作成できます
openssl x509 -text -noout -in ./corn.wall.crt.202204 |grep DNS
# DNSの蘭に登録した証明書のローカルドメイン名があることを確認します
ローカル証明書を格納
sudo mkdir /etc/certs
sudo cp -pi ./*.crt* /etc/certs/
sudo mkdir /etc/private
sudo cp -pi ./*.key* /etc/private/
ローカル証明書のシンボリックリンク化
mkcertsはあくまでもローカル環境での証明書を作成するツールなので、更新サイクルが3ヶ月程度となっています。
そこで、後のメンテナンスがしやすいようにシンボリックリンクを張ります。
実行例
cd /etc/certs/
ln -s corn.wall.crt.202204 corn.wall.crt
cd /etc/private/
ln -s corn.wall.key.202204 corn.wall.key
nginxインストール
sudo aptitude install nginx
リバースプロキシー化事前設定
sudo mkdir /etc/old
sudo cp -pi /etc/hosts /etc/old/hosts.`date +%Y%m%d`
sudo sed -i 's/127.0.1.1/127.0.0.1/g' /etc/hosts
# Ubuntu系はhost名のローカルアドレスを127.0.1.1と記載するので書き換えます
sudo openssl dhparam -out /etc/nginx/dhparam.pem 2048
# 環境によっては5分以上かかります
sudo mkdir /var/log/nginx/growi
sudo chown www-data:www-data /var/log/nginx/growi
nginx設定ファイル作成
※ コマンド実行の前に[ ]でくくった箇所を自分の環境に置き換えてください。
以下の順番で行うとやりやすいです。
- 以下のコマンド全行(cat - ~ 最下行のEOFまで)をコピーする
- 任意のテキストエディタに貼り付ける
- [ ]でくくった箇所を置き換えて編集する(このとき、[ ] も外します)
- 置き換えて編集したコマンド全行をコピー
- ターミナルに貼り付けて実行する
cat <<- 'EOF' | sudo tee -a /etc/nginx/sites-available/growi.conf
upstream [growiを公開するサブドメイン(e.g. growi)] {
server [growiサーバのIPアドレス]:3000;
}
server {
listen 80;
server_name [公開するWebドメイン(e.g. growi.example.test)];
server_tokens off;
return 301 https://$host$request_uri;
access_log /var/log/nginx/growi/access.log;
error_log /var/log/nginx/growi/error.log warn;
}
server {
listen 443 ssl http2;
server_name [公開するWebドメイン(e.g. growi.example.test)];
server_tokens off;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
ssl_dhparam /etc/nginx/dhparam.pem;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
add_header Strict-Transport-Security 'max-age=63072000';
ssl_certificate [証明書が格納されているディレクトリ/証明書ファイル];
ssl_certificate_key [秘密鍵が格納されているディレクトリ/秘密鍵ファイル];
ssl_stapling on;
ssl_stapling_verify on;
# mkcert以外のきちんとした証明書を用いる時に使うオプションです
access_log /var/log/nginx/growi/ssl_access.log;
error_log /var/log/nginx/growi/ssl_error.log warn;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_max_temp_file_size 10240m;
client_max_body_size 10240m;
proxy_redirect off;
set $proxy_target '[growiを公開するサブドメイン(upstreamの行で設定したもの)]';
location / {
proxy_pass http://$proxy_target;
}
location /socket.io/ {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_cache_bypass $http_upgrade;
proxy_pass http://$proxy_target/socket.io/;
}
}
EOF
コンフィグファイルの有効化
cd /etc/nginx/sites-enabled
sudo unlink default
# nginxの基本設定を無効化します
sudo ln -s /etc/nginx/sites-available/growi.conf growi.conf
# 先ほど作成したコンフィグファイルを有効化します
起動確認
sudo nginx -t
# syntax is ok と test is successful を確認します
sudo systemctl restart nginx
sudo systemctl enable nginx
systemctl status nginx
# (runnning) と enabled を確認します
確認後、
http://[指定したドメイン名]
で、
- Growiのログイン画面が見えること(:3000を付ける必要がないこと)
- SSL通信(httpsにリダイレクトされること)を確認してください