Help us understand the problem. What is going on with this article?

Ubuntu 18.04にNginx、PHP 7.4、MySQL 5.7をインストールする

目的

ローカル環境で開発していたLaravelのプロジェクトをVPSに乗せるための準備です。

OSバージョン

$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.4 LTS"

Nginxのインストール

$ sudo apt update
$ sudo apt install nginx

インストールが完了して、ブラウザ上からホスト名でアクセスすると以下のページが表示されると思います。

nginx画面.png

セキュリティ設定

ufwによるファイアウォール設定

Ubuntu 18.04ではファイアウォールパッケージとしてufw(Uncomplicated Firewall)がインストールされています。

SSH(22)とHTTP(80)、HTTPS(443)のNginxへの接続を許可します。

$ sudo ufw allow 'Nginx HTTP'
$ sudo ufw allow 'Nginx HTTPS'
$ sudo ufw enable

ufwコマンドに関しては下記の記事が大変参考になりました。
ufwコマンドの使い方 https://qiita.com/hana_shin/items/a630871dce209cff04f3

fail2banでアクセス制限設定

ufwと一緒にサーバへの攻撃をモニターして、保護してくれるfail2banも導入します。
こちらはインストールして、サービスを起動するだけでOKです。

$ sudo apt install fail2ban
$ sudo service fail2ban start

Nginxの設定

nginx.conf

Nginxの設定ファイルであるnginx.confを修正します。

$ sudo vim /etc/nginx/nginx.conf
  • userをwww-dataからsshのログインユーザに変更します
  • server_tokenのコメントアウトを外します
  • 必要があればclient_max_body_sizeを追加します
    これはnginxがPOSTの最大サイズを設定するための項目です(デフォルトは1MB)

fastcgi_params

NginxでPHPを動かすためにはfastcgi_paramsも修正します。
fastcgi_paramsを開いて、末尾に下記を追加します。

$ sudo vim /etc/nginx/fastcgi_params
↓追加します
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
↑追加します

追加したら構文チェックのために下記を実行します
問題なければNginxを再起動します

$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
$ sudo service nginx restart

PHP 7.4 のインストール

Ubuntu18.04でPHP 7.4をインストールするにはondrej/phpレポジトリを追加する必要があります

$ sudo apt install software-properties-common
$ sudo add-apt-repository ppa:ondrej/php

追加できたら一度リポジトリ一覧を更新し、モジュールと一緒にPHP 7.4をインストールします

$ sudo apt update
$ sudo apt install php7.4-fpm php7.4-common php7.4-mysql php7.4-xml php7.4-xmlrpc php7.4-curl php7.4-gd php7.4-imagick php7.4-cli php7.4-dev php7.4-imap php7.4-mbstring php7.4-opcache php7.4-soap php7.4-zip unzip -y

php 7.4およびモジュールが正しくインストールされているか下記コマンドで確認します

$ php -v
$ php-fpm7.4 -v
$ php -m

www.confを開いて、userとgroupを`www-data`からsshのログインユーザに変更します

$ sudo vim /etc/php/7.4/fpm/pool.d/www.conf
user = username 
group = username 
listen.owner = username 
listen.group = username

変更できたらphp-fpmの構文チェック、再起動を行います

$ sudo php-fpm7.4 -t
$ sudo service php7.4-fpm restart

NginxでPHPを実行する

sites-available/default

sites-available/defaultを開いて、下記のように修正します。

indexにindex.phpを追加します

index index.php index.html index.htm index.nginx-debian.html;

location ~ .php$ {の記述があれば閉じ括弧も含めてコメントアウトを外します
なければ追加してください

location ~ \.php$ {
}

括弧内に# fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;のような記述があれば以下のように書き換えてコメントアウトを外します

fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;

最後に括弧内にinclude fastcgi_params;を追加します

設定例

index index.php index.html index.htm index.nginx-debian.html;

...略...

location ~ \.php$ {
       include snippets/fastcgi-php.conf;

       # With php-fpm (or other unix sockets):
       fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
       # With php-cgi (or other tcp sockets):
#      fastcgi_pass 127.0.0.1:9000;
       include fastcgi_params;
}

/var/www/htmlにindex.phpを作成します。

<?php
phpinfo();

ここまでできたらnginxを再起動させてブラウザ上からホスト名でアクセスします。

$ sudo nginx -t
$ sudo service nginx restart

phpinfo.png

親の顔より見た(?)画面が表示されましたね!

MySQL 5.7 のインストール

aptコマンドでインストールします。

$ sudo apt install mysql-server

次のコマンドでMySQLのセキュリティ設定を行います。

$ sudo mysql_secure_installation

設定方法は下記URLが参考になります。
https://weblabo.oscasierra.net/mysql-57-init-setup/

rootパスワードが設定できたらDBとユーザを作成します。
※'DATABASE_NAME'、'YOUR_NAME'、'YOUR_PASSWORD'には任意の値を適宜書き換えてください

$ mysql -u root -p
mysql> CREATE DATABASE 'DATABASE_NAME';
mysql> CREATE USER 'YOUR_NAME'@'localhost' IDENTIFIED BY 'YOUR_PASSWORD';
mysql> GRANT ALL PRIVILEGES ON DATABASE_NAME.* TO 'your_name'@'localhost';

作成できたら 設定したユーザとパスワードでMySQLサーバにアクセスできるか確認しましょう。

mysql> exit;
$ mysql -u 'YOUR_NAME' -p

最後に、index.phpを以下のように変更し、PHPでMySQL接続確認を行います。

<?php
    define('DB_HOST', 'localhost');
    define('DB_USER', 'YOUR_NAME');
    define('DB_PASSWORD', 'YOUR_PASSWORD');
    define('DB_NAME', 'DATABASE_NAME');

    // エラー表示設定:通知系以外全て表示    
    error_reporting(E_ALL & ~E_NOTICE);

    try {
        $dbh = new PDO('mysql:'.DB_NAME.';'.DB_HOST, DB_USER, DB_PASSWORD);
        print('接続しました。');
    }
    catch(PDOException $e){
        print('ERROR:'.$e->getMessage());
        exit;
    }

以下の画面が表示されたら、ミドルウェアのセットアップ完了です。お疲れ様でした:clap:

接続確認.png

参考ページ:
https://www.cloudbooklet.com/install-php-7-4-on-ubuntu/
https://stackoverflow.com/questions/25591040/nginx-serves-php-files-as-downloads-instead-of-executing-them
https://teratail.com/questions/137445

kshiva1126
都内でプログラマ3年目として働いています。 業務で使用している言語はPHPとたまにJSです。 勉強の中で気づいたことや共有したいことを書いていこうと思っています。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした