エックスサーバーVPSにiOSのAPNsプッシュ通知のためのサーバーを構築する

広告:超オススメUnity Asset
  広告:超オススメUnity Asset

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初期状態から地道に構築。

この記事がめちゃわかりやすいので、そのままやった中からコマンドだけ羅列してMEMOしときます。

【Ubuntu編】エックスサーバーVPS(Xserver VPS)でWEBサイトを公開する方法 こちらのページでは、エックスサーバーVPS(Xserver VPS)を利用したサーバーにWEBサイトの公

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アドレスで確認

01

sudo /usr/sbin/a2enmod rewrite
sudo service apache2 restart

ドメイン

  • Xserverでドメインを取得
  • ネームサーバー設定でドメイン適用先サービスをXserverVPSに
    02
    03
  • DNS設定でドメインの追加

他社でドメインを取得している場合

例)MuuMuuDotainの場合、「取得したドメインで使用する ※上級者向け」のネームサーバ設定で以下の通り設定。(SSL設定時までに浸透するまで1日くらい開ける)

Xserver VPSのネームサーバーを設定する方法記載しています。

パケットフィルタ設定

  • 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. というエラーになる模様。

まずは、ドメインの割り当て(fuga.com*.fuga.comの両方)がそのサーバーやインスタンスに行われているかを確認。エックスサーバー以外では、サブドメインなしの方は「@」を入れることで設定するところもあったりします。

また設定が正しくても浸透するまで時間が経っていない可能性も。

sudo systemctl status certbot.timer

● certbot.timer - Run certbot twice daily
・・・

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? y
  • Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 2(STRONG)
  • Remove anonymous users? y
  • Disallow root login remotely? y
  • Remove test database and access to it? y
  • Reload 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.
・・・

新しいユーザーを作成する場合

MySQLは、データの整理および取得に使用される強力なデータベース管理システムです。このチュートリアルでは、新しいMySQLユーザーを作成し、適切な権限を付与する方法について説明します。
CREATE USER 'newhoge'@'localhost' IDENTIFIED BY '大文字小文字英数記号で';
GRANT ALL PRIVILEGES ON * . * TO 'newhoge'@'localhost';
FLUSH PRIVILEGES;

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()確認

Pdo mysql

 

おまけ: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

背景インターンで案件のレビューをすることになったが、PHPのソースレビューでコーディング規約とソースを見比べながら細かな部分を見つけ出すのはかなり骨の折れる作業だと思った。そんなとき、自分が受け…
sudo apt install php-cli php-mbstring git unzip
A Dependency Manager for PHP
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]? ENTER
Composer 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

 

とりあえず、以上。なんかあったら追記していきます。