iOSアプリにPHPからプッシュ通知(APNs)したいため、XserverのVPSにPHPが動作するサーバーを立ち上げる手順MEMO。(iOSにPHPからプッシュ通知をするのには「おまけ:cURL」部分が重要な部分です)
スペックは
- Ubuntu 22.04
- vCPU 3コア
- メモリ 2GB
- NVMe SSD 50GB
メモリは1GB以下だとSSL設定時にエラーでセットアップできないので、最低でも1GB以上で。
追記:後からDigitalOceanでも同様のセットアップを試みましたが、ドメインやDNSの画面が異なるものの、ほぼ同じ手順でセットアップできました。ただし、上記のメモリやCPUのスペックとコストを考えるとエックスサーバーVPSの方がコストパフォーマンスは良いと思われます。
以下、VPS初期状態から地道に構築。
- Apacheインストール
- ドメイン
- パケットフィルタ設定
- DNS
- バーチャルホスト設定
- SSL
- PHP
- MySQL
- FTP
- おまけ:MySQL Driver
- おまけ:cURL
- おまけ:サブドメイン
- おまけ:Composer
- おまけ:CakePhp4
- おまけ:CakePhp5
- おまけ:bcmath
この記事がめちゃわかりやすいので、そのままやった中からコマンドだけ羅列してMEMOしときます。
Apacheインストール
sudo apt-get -y update
sudo apt info apache2
Package: apache2
Version: 2.4.52-1ubuntu4.7
・・・
sudo apt-get install -y apache2
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
・・・
sudo apache2ctl -v
Server version: Apache/2.4.52 (Ubuntu)
Server built: 2023-10-26T13:44:44
sudo systemctl start apache2
ブラウザでIPアドレスで確認
sudo /usr/sbin/a2enmod rewrite
sudo service apache2 restart
ドメイン
- Xserverでドメインを取得
- ネームサーバー設定でドメイン適用先サービスをXserverVPSに
- DNS設定でドメインの追加
他社でドメインを取得している場合
例)MuuMuuDotainの場合、「取得したドメインで使用する ※上級者向け」のネームサーバ設定で以下の通り設定。(SSL設定時までに浸透するまで1日くらい開ける)
パケットフィルタ設定
- Web 追加
- SSH 追加
- MySQL 追加
DNS
- 種別Aをhoge.comとwww.hoge.comで追加。
バーチャルホスト設定
sudo useradd hoge
sudo passwd hoge
sudo mkdir -p /home/hoge/www/fuga.com
sudo chown -R hoge /home/hoge/www/fuga.com
sudo chmod 755 /home/hoge
sudo vi /etc/apache2/sites-available/fuga.com.conf
<VirtualHost *:80> ServerName fuga.com ServerAlias www.fuga.com DocumentRoot /home/hoge/www/fuga.com CustomLog /var/log/apache2/fuga.com-access_log combined ErrorLog /var/log/apache2/fuga.com-error_log <Directory /> AllowOverride All Require all granted </Directory> </VirtualHost>
cd /etc/apache2/sites-available/
sudo a2ensite fuga.com.conf
cd /etc/apache2/sites-enabled/
ls
000-default.conf fuga.com.conf
sudo apache2ctl configtest
Syntax OK
sudo a2dissite 000-default.conf
Site 000-default disabled.
sudo systemctl restart apache2
SSL
sudo apt-get install -y certbot python3-certbot-apache
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
sudo certbot --apache
- メアド
- (Y)es
- (N)o
- そのままEnter
・・・
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
* Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
* Donating to EFF: https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
外部でドメインを取得して設定が間違っている場合など、ここでSome challenges have failed.
というエラーになる模様。
【注意】5回失敗しないように!1時間に5回失敗すると1週間もロックされてしまう模様。wwwありとwwwなしで別物として取り扱われるため、うまくいってなくて何度も試したい時は、交互にやるとか工夫が必要。ロックがかかったとしても、最後のチャンスとして、wwwありとなしを同時にリクエストすることでもう一度チャンスはある模様。その場合こんな感じ→ sudo certbot certonly --webroot -w /home/ubuntu/www/hoge.com -d hoge.com -d www.hoge.com
まずは、ドメインの割り当て(fuga.com
と*.fuga.com
の両方)がそのサーバーやインスタンスに行われているかを確認。エックスサーバー以外では、サブドメインなしの方は「@
」を入れることで設定するところもあったりします。
また設定が正しくても浸透するまで時間が経っていない可能性も。
sudo systemctl status certbot.timer
● certbot.timer - Run certbot twice daily
・・・
SSL自動更新
90日で期限が切れるようなので、CRONで毎月期限が近いものを自動更新。
を参考に crontab -e
で以下を追加。
00 04 01 * * certbot renew && systemctl restart apache2
SSL(certs)の残り期限を確認するコマンド
sudo certbot certificates
でそれぞれのドメインに設定されている残り期限が(VALID: 80 days)のように表示されます。
Expiry Date: 2024-12-21 21:13:56+00:00 (VALID: 80 days)
PHP
sudo apt show php
Package: php
Version: 2:8.1+92ubuntu1
・・・
sudo apt-get install -y php
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
・・・
sudo php -v
PHP 8.1.2-1ubuntu2.14 (cli) (built: Aug 18 2023 11:41:11) (NTS)
Copyright (c) The PHP Group
MySQL
sudo apt-get install -y mysql-server mysql-client
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
・・・
sudo mysql --version
mysql Ver 8.0.35-0ubuntu0.22.04.1 for Linux on x86_64 ((Ubuntu))
sudo mysql_secure_installation
この時点で以下のエラーが出たらメモリ不足かも。Xserver VPSの最低プランでは大丈夫。その他でもっと低いスペックの場合可能性あり。
Error: Can’t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock’ (2)
このエラーが出ずに先に進めたら、以下の通り。
Would you like to setup VALIDATE PASSWORD component?
yPlease enter 0 = LOW, 1 = MEDIUM and 2 = STRONG:
2(STRONG)Remove anonymous users?
yDisallow root login remotely?
yRemove test database and access to it?
yReload privilege tables now?
y
パスワード設定がスキップされた模様
Skipping password set for root as authentication with auth_socket is used by default.
If you would like to use password authentication instead, this can be done with the “ALTER_USER” command.
See https://dev.mysql.com/doc/refman/8.0/en/alter-user.html#alter-user-password-management for more information.
mysql -u root
もし ERROR 1698 (28000): Access denied for user 'root'@'localhost'
と言われたら、sudo mysql -u root
で。
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password by '大文字小文字英数記号で';
exit;
mysql -u root -p
上記で設定したパスワード
Welcome to the MySQL monitor.
・・・
新しいユーザーを作成する場合
CREATE USER 'newhoge'@'localhost' IDENTIFIED BY '大文字小文字英数記号で';
GRANT ALL PRIVILEGES ON * . * TO 'newhoge'@'localhost';
FLUSH PRIVILEGES;
MySQLを日本時刻にする
インストール直後、MySQLはサーバー自体のタイムゾーンに基づいて日時と時刻を処理する形になっていると思います。これを確認するには、mysql -u root -p
でパスワードを入力し、以下のSQLを実行し、
SHOW VARIABLES LIKE 'time_zone';
time_zone | SYSTEM |
と表示されたなら、MSQLはサーバーのタイムゾーンを参照しています。システムのタイムゾーンを確認するには、 date
とコマンドを打ち、出力された時刻に「UTC」とついていたら、「Coordinated Universal Time:協定世界時」です。日本のタイムゾーンに変更するには、
sudo timedatectl set-timezone Asia/Tokyo
を実行します。これでタイムゾーンは変更されますが、MySQLの処理に反映させるためには、
sudo systemctl restart mysql
を実行し、状態を確認するには、
sudo systemctl status mysql
を実行します。
FTP
sudo apt-get install -y vsftpd
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
・・・
sudo vsftpd -v
vsftpd: version 3.0.5
sudo vi /etc/vsftpd.conf
- listen=YES
- listen_ipv6=NO
- anonymous_enable=NO
- write_enable=YES
- local_umask=022
- dirmessage_enable=NO
- ascii_upload_enable=YES
- ascii_download_enable=YES
- chroot_local_user=YES
- chroot_list_enable=YES
- chroot_list_file=/etc/vsftpd.chroot_list
- allow_writeable_chroot=YES
- ls_recurse_enable=YES
- force_dot_files=YES
:wq
sudo systemctl restart vsftpd
sudo vi /etc/vsftpd.chroot_list
hoge
(ホームディレクトリより上位へアクセスできるユーザー)だけ書いて
:wq
おまけ:MySQL Driver
おおよそこれで仕上がったもののPDO Driverがないらしい。。
phpinfo()でPDO driversがno valueになる
PDOのMySQLドライバは、本体のインストールに含まれていない模様。参考↓
php -m
pcre
PDO
Phar
apt search php8.1 | grep php8.1
php8.1-mysql/jammy-updates,jammy-security 8.1.2-1ubuntu2.14 amd64
sudo apt install php8.1-mysql
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
・・・
php -m
pcre
PDO
pdo_mysql ←
Phar
以下をphp.iniに追記(この追記不要かも。インストール後、apache再起動で認識された。)
phpinfo()でphp.iniの場所を確認
cd /etc/php/8.1/apache2
vi php.ini
extension=pdo_mysql extension=pdo_mysql.so
apache再起動
sudo service apache2 restart
phpinfo()確認
おまけ:cURL
ls /usr/lib/php/20210902 | grep curl
※ ↑php以下のディレクトリの存在を先に確認
apt search php8.1 | grep php8.1
php8.1-curl/jammy-updates,jammy-security 8.1.2-1ubuntu2.14 amd64
sudo apt install php8.1-curl
この拡張モジュールをインストールしていないとPHPからcurl_init()をする際に以下のエラーが出て呼べません。
Call to undefined function curl_init()
おまけ:サブドメイン
- api.hoge.comを種別Aで追加。
sudo mkdir -p /home/hoge/www/api.fuga.com
sudo chown -R hoge /home/hoge/www/api.fuga.com
sudo vi /etc/apache2/sites-available/api.fuga.com.conf
<VirtualHost *:80> ServerName api.fuga.com DocumentRoot /home/hoge/www/api.fuga.com CustomLog /var/log/apache2/api.fuga.com-access_log combined ErrorLog /var/log/apache2/api.fuga.com-error_log <Directory /> AllowOverride All Require all granted </Directory> </VirtualHost>
cd /etc/apache2/sites-available/
sudo a2ensite api.fuga.com.conf
sudo certbot --apache
でapi.fuga.comを選択してSSL
sudo systemctl restart apache2
おまけ:Composer
sudo apt install php-cli php-mbstring git unzip
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" php -r "if (hash_file('sha384', 'composer-setup.php') === 'e21205b207c3ff031906575712edab6f13eb0b361f2085f1f1237b7126d785e826a450292b6cfd1d64d92e6563bbde02') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" php composer-setup.php php -r "unlink('composer-setup.php');"
sudo mv ./composer.phar $(dirname $(which php))/composer && chmod +x "$_"
composer --version
Continue as root/super user [yes]?
ENTERComposer version 2.6.6 2023-12-08 18:32:26
おまけ:CakePhp4
sudo apt-get install php-intl
sudo apt-get install php-xml
sudo apt-get install php-sqlite3
composer create-project --prefer-dist cakephp/app:"4.*" my_app_name
app.php
'Error' => [ 'errorLevel' => E_ALL & ~E_USER_DEPRECATED, //追加 'skipLog' => [], 'log' => true, 'trace' => true, 'ignoredDeprecationPaths' => [ // 非推奨警告を無効にする(例 ROOT . DS . 'templates' . DS . 'Pages' . DS . 'home.php', // 他に無視したいファイルがあれば追加 ], ],
'DebugKit.safeTld' => ['club', 'local'],
cssが反映されてない場合
vi /etc/apache2/apache2.conf
<Directory "/var/www/html"> Options FollowSymLinks AllowOverride All </Directory>
おまけ:CakePhp5
composer create-project --prefer-dist cakephp/app:~5.0 my_app_name
Warning: You should set `zend.assertions` to `1` in your php.ini for your development environment. in /home/hoge/www/api.fuga.com/vendor/cakephp/cakephp/src/Core/Configure.php on line 104
php.iniにて`zend.assertions` to `1`に
phpinfo()でphp.iniの場所を確認
cd /etc/php/8.1/apache2
vi php.ini
zend.assertions = 1
apache再起動
sudo service apache2 restart
おまけ:bcmath
GA4(composer require google/analytics-data
)を使う際、
Call to undefined function Google\Protobuf\Internal\bccomp()
のエラーが出たので、php8.1-bcmathを入れておく。
apt search php8.1 | grep php8.1
php8.1-bcmath/jammy-updates,jammy-security 8.1.2-1ubuntu2.18 amd64
sudo apt install php8.1-bcmath
とりあえず、以上。なんかあったら追記していきます。
東京造形大学卒業後、マクロメディア(現アドビ)に入社。QAやテクニカルサポートマネージャーとしてFlash、DreamweaverなどのWeb製品を担当。独立後、2007年に虫カゴデザインスタジオ株式会社を設立。2021年東京三鷹を拠点に。最近は、Unity, Unity Netcode for GameObjects, CakePHP, Laravel, ZBrush, Modo, Adobe Substance 3D, Adobe Firefly, Xcode, Apple Vision Pro, Firebaseにフォーカスしています。モバイルアプリ開発情報を主としたブログ「MUSHIKAGO APPS MEMO」の中の人。