UKey's Labo

Raspberry PI/RasbianにnginxとPHP7をインストール(+Let’s Encryptでhttps化)

動作環境

環境 バージョン
Raspberry Pi Raspberry Pi Zero WH
Raspbian Raspbian GNU/Linux 9.6 (stretch)

nginxインストール

updateupgradeは場合によっては10分程度かかります。

sudo apt update
sudo apt upgrade
sudo apt dist-upgrade
# nginxのインストール
sudo apt -y install nginx

# nginxユーザの作成
sudo useradd --shell /sbin/nologin nginx

PHP7.0のインストール

sudo apt -y install install php7.0-fpm php7.0-dev

nginxの設定

sudo vim /etc/nginx/sites-available/default

以下の箇所を修正する

    #location ~ \.php$ {
    #   include snippets/fastcgi-php.conf;
    #
    #   # With php-fpm (or other unix sockets):
    #   fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
    #   # With php-cgi (or other tcp sockets):
    #   fastcgi_pass 127.0.0.1:9000;
    #}

#コメントを削除、修正

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        # With php-fpm (or other unix sockets):
        fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
        # With php-cgi (or other tcp sockets):
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

phpの設定

sudo vim /etc/php/7.0/fpm/php-fpm.conf
# コメントを外して有効化
;daemonize = yes
↓
daemonize = yes
sudo vim /etc/php/7.0/fpm/pool.d/www.conf
# userをnginxに変更
user = www-data
↓
user = nginx

# groupをnginxに変更
group = www-data
↓
group = nginx

# パスを修正
listen = /run/php/php7.0-fpm.sock
↓
listen = /var/run/php/php7.0-fpm.sock

# listen.ownerをnginxに変更
listen.owner = www-data
↓
listen.owner = nginx

# listen.groupをnginxに変更
listen.group = www-data
↓
listen.group = nginx

# listen.modeのコメントを外して、一部変更
;listen.mode = 0660
↓
listen.mode = 0666

再起動

# php再起動
sudo systemctl restart php7.0-fpm

# nginx再起動
sudo systemctl restart nginx

phpの動作確認

index.phpを作成する。

# ドキュメントルートに移動
cd /var/www/html

# index.phpを作成する
sudo vim index.php
<?php
    phpinfo();

ブラウザを開き、http://[raspbianのIPアドレス]/index.phpにアクセスして、

以下のページが表示されれば、PHP7.0の設定成功。

502 bad gatewayで接続に失敗した場合

該当ページにブラウザからアクセスしたら、502 bad gatewayが出てしまいました。
ログを確認してみると、php7.0-fpm.sockの権限が足りないようでしたので、以下を実行したところ、動作しました。

sudo chmod 666 /var/run/php/php7.0-fpm.sock

Let’s Encryptのインストール

SSL接続できるようにして、セキュリティを高めます。

ここで丸二日ばかりつまづきました。

以下、しばらく失敗談なので、不快な方は読み飛ばしてください(苦笑)

まず、raspbianのバージョンをチェック。

lsb_release -a

次に、certbotにアクセスして、自分の環境のcertbotを確認します。

「Software」“nginx”「System」“Debian”の中から、raspbianのバージョンに合っているものを選択します。

lsb_release -aで調べると、Raspbian 9.6 Stretchだったので、Debian 9を選択してインストール作業を進めてましたが、以下のコマンドを実行する段階で壁にぶち当たりました。

sudo certbot --nginx

Illegal Instruction

sudo certbot --nginxを実行すると、Illegal Instructionと表示され、先に進めません。

調べに調べて、海外のサイトとかも見て回って、いろいろ試しましたが解決できず。。。

そして、ふと思ったのです。

もしかして、そもそも入れるパッケージ間違えてる???

インストールする対象となるOSはDebian 9ではなく、Debian(Other)

まずここが間違いでした。

Debian 9 (Stretch)を選択しては駄目でした。

とりあえず、間違ってインストールしたパッケージを削除します。

sudo apt-get purge python-certbot-nginx -t stretch-backport

そして、改めて「System」に*Debian (Other)を選択して、certbotをインストールしていきます。

サイトに記載されている通り進めていきます。

wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto

ここまで来たら、ルータのポートが開放されているか確認しましょう。

開放していない場合は、SSLのポートを開放します。

以前、別記事でも記載しましたが、僕の家のモデムはPR-400MIです。

参考になる方がどれほどいらっしゃるかわかりませんが(苦)

PR-400MIの管理画面をブラウザで開いて、詳細設定 > 静的IPマスカレード設定と進みます。

ここでSSLのポートである、443を開放します。

その後はまたraspbianに戻って、以下を実行します。

sudo ./path/to/certbot-auto --nginx

僕の場合は処理がここで10分ばかり止まり、コネクションが切れたのかいろいろ不安になりましたが。

Installing Python packages...

その後、対話式で設定していきます。

Enter email address (used for urgent renewal and security notices) (Enter 'c' to cancel):

メールアドレスを入力します。

僕はgmailのアドレスを入力しました。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(A)gree/(C)ancel: A

同意を求められるので、Aを入力してエンター

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

newsメール送るけど?と聞かれるので、任意のほうを入力してエンター

No names were found in your configuration files. Please enter in your domain
name(s) (comma and/or space separated)  (Enter 'c' to cancel):

ドメインの入力を求められるので、ドメインを入力してエンター

僕は外部インターネットからのsshでno-ipを利用しているので、そちらで設定したドメインを入力しました。

no-ipについてはこちらを参照してください。

ちなみに僕はこの時点でポートを開放していなかったので、「接続できませんでした。」とエラーが発生して終了してしまいました。

その場合は、必要な作業を実施して、再度以下コマンドを実行すると、ドメイン入力から再開してくれます。

sudo ./path/to/certbot-auto --nginx

HTTPSで接続が成功すると、以下が表示されます。

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel):

HTTPをHTTPSにリダイレクトするか聞かれます。任意のほうを選択して、1 or 2を入力後、エンター

僕はリダイレクトまでしなくていいので、1を選択しました。

以上で完了です。

実際にhttpsで接続できるか確認しておきましょう。