Raspberry PiでWebサーバを構築し自作アプリを使う

# 目的
レンタルサーバ、固定IPなどの有料サービスを使用せず、自宅にWebサーバを構築し、下記の機能を実装する。
・家計簿登録Webアプリケーション
・TOEICや資格の勉強用Webアプリケーション
・ゲームアプリケーション

# 機器の準備
## Raspberry Pi 3
WebサーバはRaspberry Pi 3を使用して構築する。Raspberry Piは本体価格が安価である上、消費電力が低いため常時起動に向いている。

## 外付けハードディスク
500GBの外付けハードディスクをデータベース用のストレージとして使用する。

## サーバ外観
Raspberry Pi3(右)に外付けハードディスク(左)を接続。
<img src="https://qiita-image-store.s3.amazonaws.com/0/152991/a34b1ebb-9732-2fd0-f5fc-2258f56be1f0.jpeg" width=80%>

## 無線ルータ
特に限定はしないが、ここでは次のものを使用している。
http://buffalo.jp/product/wireless-lan/ap/wcr-1166ds/

# 無償サービスの利用
Dynamic DNSを利用して動的IPであってもURLによるWebページアクセスが可能となるようにする。またSSL/TLS利用のため、無料サーバ証明書発行サービスを利用する。

## myDNSでドメインの作成
自宅サーバのグローバルIPアドレスの名前解決をするためのサービスである。ドメインを作成するとURLによるwebアクセスが可能になる。
https://nw.myds.me/synology/setup-domain/

## Let's Encryptにドメイン登録
サーバ証明書発行のサービスである。作成したドメインを登録することでSSL/TLSを利用したHTTPSでのweb閲覧が可能になる。インストール時にHTTPSのリダイレクト設定をしておく。HTTPでアクセスしてもHTTPSで接続されるようになる。
https://letsencrypt.org

```text:/home/pi/letsencrypt/certbot-auto実行時メッセージ抜粋
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): 2

```

# ルータの設定
## ポートフォワーディング設定
自宅内に設置したWebサーバへ外部からアクセスする場合、アクセス要求はルータのインターネット側インターフェースに割り当てられたグローバルIPに対し、ポート80(HTTP)もしくは443(HTTPS)で届くことになる。このアクセス要求をLAN内のRaspberry Piに転送しなくてはならない。そこでポートフォワーディングの設定を行う。ルータの設定画面でポート変換のメニューから、Internet側のポート443をIPアドレス192.168.11.19のポート443へ、Internet側のポート80をIPアドレス192.168.11.19のポート80へ変換するよう設定する。
<img src="https://qiita-image-store.s3.amazonaws.com/0/152991/bd3e2aa9-ff2c-804c-1ce6-b1a02baa0ac9.jpeg" width=80%>

## DMZ設定
任意の設定。DMZ(DeMilitarized Zone)はルータ管理画面でサーバのアドレスを指定することで設定できる。外部ネットワークと内部ネットワークに加えてサーバ配置用の新たなネットワーク区域を設けるものであり、DMZ内の機器には内外の両方のネットワークからアクセス可能だが、DMZ内から内部ネットワークに向けて接続を試みることはできない。これにより外部からの攻撃でDMZ内のサーバに侵入されたとしても、内部ネットワークへ被害が及ばない。
![ma_zu02.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152991/2e27e0e0-0a03-06a9-d7f8-0cebab7cb7fa.gif)

# Raspberry Piの設定
## OSインストール
raspberry pi専用OSであるraspbianをインストールする。
https://qiita.com/westvirginia/items/edc3b56da7be58419d70

## raspi-configの設定
raspberry piのパスワード変更やファイルシステム拡張などの設定をする。
http://igarashi-systems.com/sample/translation/raspberry-pi/configuration/raspi-config.html

## LAN設定
/etc/network/interfacesに下記を追記する。
ここではWi-Fiを使い、IPアドレスは192.168.11.19に固定している。

```text:/etc/network/interfaces
iface wlan0 inet manual
    address 192.168.11.19
    netmask 255.255.255.0
    gateway 192.168.11.1
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
    dns-nameservers 192.168.1.1

```

```text:/etc/wpa_supplicant/wpa_supplicant.conf
country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
	ssid="ネットワーク名"
	psk="パスワード"
	scan_ssid=1        
}
```

## Apache2のインストール
次のコマンド実行でApache2をインストールする。

```text
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install apache2
```

## PHPの設定
phpのインストールと有効化の設定をする。
https://qiita.com/miyamotok0105/items/851a5e27629bfd1e3226

## mysqlのインストール
mysqlサーバとphpからmysqlへアクセスするためのパッケージをインストールする。

```text
sudo apt-get install mysql-server　
sudo apt-get install php5-mysql
```
※現在はmariaDBに代替されている。
PHPの関数も変換が必要。
https://gray-code.com/php/using-mysql-and-mariadb-by-php/

## SSL/TLSの設定
サーバ証明書と秘密鍵の有効化設定をする。
http://itemy.net/?p=1052

## プライベート認証局の設定
インターネットからのアクセスと同様に、LAN内でもURLを使い、SSL/TLSを利用するためには、LAN内にDNSサーバとサーバ認証局が必要である。そこでOpenSSLを利用してプライベート認証局を設置する。ドメインの設定欄でwebサーバのURLを記入しておく。
http://dreamerdream.hateblo.jp/entry/2016/01/04/000000

## myDNSへ定期的にIP更新通知する設定
固定IPを使わずに、動的IPのままでインターネットからWebサーバにアクセスするために必要な工程となる。cronに次のように記述することで自身のグローバルIPを定期的にmyDNSサービスに通知し、Aレコードを更新する。これによりグローバルIPが変更されても、作成したFQDNと新しいグローバルIPを対応させることができ、固定IPと同等の機能を構築できる。

```text
00 00 * * * wget --http-user=(アカウント) --http-passwd=(パスワード) http://www.mydns.jp/login.html
```

## サーバ証明書を定期的に更新する設定
Let's Encryptで発行されるサーバ証明書の有効期限は3ヶ月である。cronに次のように記載することで、定期的にサーバ証明書を更新する。

```text
00 02 * * * /home/(ユーザ)/letsencrypt/certbot-auto renew --webroot -w /var/www/html -d (URL) 
```

## メールサーバの設定
アプリの機能の一部としてメールサーバを使用するため設定する。
https://www.sbprojects.net/projects/raspberrypi/exim4.php
https://stackoverflow.com/questions/35130119/linux-configuration-ssmtp-cannot-open-smtp-gmail-com587

## その他ツール類インストール
その他アプリの機能の一部として使用するものをインストールする。

```text
sudo apt-get install expect
sudo apt-get install etherwake
```
## CGIの設定
CGIを有効化する。

```text
sudo ln -s /etc/apache2/mods-available/cgi.load/etc/apache2/mods-enabled/cgi.load
```
CGI設定ファイルの219行目のコメントアウトをはずす。

```text:/etc/apache2/mods-available/mime.conf
AddHandler cgi-script .cgi
```
apache2設定ファイルの28行目のコメントアウトをはずす。

```text:/etc/apache2/sites-available/000-default.conf　　
Include conf-available/serve-cgi-bin.conf
```
apache2を再起動する。

```text
sudo service apache2 restart
```
/usr/lib/cgi-bin配下に.cgiの拡張子で置いたファイルはスクリプトとして実行されるようになる。


## ブラウザ経由でのスクリプト実行権限の設定
ブラウザからサーバにアクセスした場合、ユーザ名はwww-dataとなる。sudoでコマンドを実行するスクリプトをCGIから呼び出した場合、パスワードを問われることでCGIが止まってしまう。そこでパスワード入力が不用となるよう設定する。

```text:/etc/sudoers
www-data ALL=(ALL) NOPASSWD:ALL
```

## ブラウザ経由でのsshの設定
ブラウザ経由でサーバから別サーバにsshログインする際、参照される設定ファイルは/var/www/.sshに配置しなければならない。デフォルトでは初回ログイン時は警告が表示され、expectによるログインが止まってしまう。そこで警告を抑止する。

```text
sudo mkdir -p /var/www/.ssh
```
ssh設定ファイルを作成し次のように記載する。

```text:/var/www/.ssh/config
Host *
StrictHostKeyChecking no
```

## セッションタイムアウト時間の延長
セッションタイムアウトの時間はデフォルトでは24分となっている。それではすぐに再ログインが必要になってしまうので、時間を延長する。ここでは1日(86400秒)を設定する。

```text:/etc/php5/apache2/php.ini
session.gc_maxlifetime = 86400
```

## 外付けハードディスクをマウント
外付けハードディスクにmysqlのデータ蓄積用ディレクトリを割り当てる。まずハードディスクをフォーマットし、/mntにマウントする。/var/lib/mysql以下のファイルを権限ごと/mntにコピーし、ハードディスクを/var/lib/mysqlにマウントしなおす。

``` text
sudo mkfs -t ext4 /dev/sdb1
sudo mount /dev/sdb1 /mnt
sudo cp -arf /var/lib/mysql/* /mnt/.
sudo umount /mnt
sudo mount /dev/sdb1 /var/lib/mysql
sudo systemctl restart mysql.service
```
## mysqlにハードディスクをオートマウントする

```text
sudo apt-get install autofs
sudo systemctl enable autofs
```
blkid /dev/sda1で調べたuuidを/etc/fstabに書き込む

```text:fstab記載例
UUID=1054819d-202a-4cf9-8817-adc947a325f5 /var/lib/mysql ext4 defaults 0 0
```
その後設定を反映する。

```text
sudo mount -a
```

## データベースの作成
mySQLでデータベースを作成する。

```text:service
user
+----------+--------------+------+-----+---------+-------+
| Field    | Type         | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| userID   | int(11)      | YES  |     | 0       |       |
| username | varchar(20)  | YES  | UNI | NULL    |       |
| passwd   | varchar(255) | YES  |     | NULL    |       |
+----------+--------------+------+-----+---------+-------+

servicelist
+-----------+--------------+------+-----+---------+-------+
| Field     | Type         | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| username  | varchar(200) | YES  | UNI | NULL    |       |
| serviceid | int(11)      | YES  |     | NULL    |       |
+-----------+--------------+------+-----+---------+-------+
```
```text:hhab
goals
+--------+-----------+------+-----+---------+-------+
| Field  | Type      | Null | Key | Default | Extra |
+--------+-----------+------+-----+---------+-------+
| userID | char(100) | YES  |     | NULL    |       |
| goal   | int(11)   | YES  |     | NULL    |       |
+--------+-----------+------+-----+---------+-------+

useruse
+--------+-----------+------+-----+---------+-------+
| Field  | Type      | Null | Key | Default | Extra |
+--------+-----------+------+-----+---------+-------+
| userID | char(100) | YES  |     | NULL    |       |
| time   | datetime  | YES  |     | NULL    |       |
| money  | int(11)   | YES  |     | NULL    |       |
| item   | char(100) | YES  |     | NULL    |       |
| class  | int(11)   | YES  |     | NULL    |       |
+--------+-----------+------+-----+---------+-------+
```
```text:english
qlist
+--------+--------------+------+-----+---------+----------------+
| Field  | Type         | Null | Key | Default | Extra          |
+--------+--------------+------+-----+---------+----------------+
| qID    | int(11)      | NO   | MUL | NULL    | auto_increment |
| qname  | varchar(200) | YES  |     | NULL    |                |
| answer | varchar(300) | YES  |     | NULL    |                |
| flag   | int(11)      | YES  |     | NULL    |                |
+--------+--------------+------+-----+---------+----------------+

user_qlist
+--------------+--------------+------+-----+---------+-------+
| Field        | Type         | Null | Key | Default | Extra |
+--------------+--------------+------+-----+---------+-------+
| username     | varchar(200) | YES  |     | NULL    |       |
| qID          | int(11)      | YES  |     | NULL    |       |
| answerrepeat | int(11)      | YES  |     | NULL    |       |
| useranswer   | varchar(300) | YES  |     | NULL    |       |
| answerdate   | datetime     | YES  |     | NULL    |       |
+--------------+--------------+------+-----+---------+-------+

wordlist
+----------+---------------+------+-----+---------+-------+
| Field    | Type          | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| word     | varchar(200)  | YES  |     | NULL    |       |
| ex       | varchar(2000) | YES  |     | NULL    |       |
| username | varchar(20)   | YES  |     | NULL    |       |
| count    | int(11)       | YES  |     | NULL    |       |
| memo     | varchar(1000) | YES  |     | NULL    |       |
+----------+---------------+------+-----+---------+-------+
```
```text:shikaku
wordlist
+-------+---------------+------+-----+---------+----------------+
| Field | Type          | Null | Key | Default | Extra          |
+-------+---------------+------+-----+---------+----------------+
| id    | int(11)       | NO   | MUL | NULL    | auto_increment |
| word  | varchar(200)  | YES  |     | NULL    |                |
| ex    | varchar(2000) | YES  |     | NULL    |                |
| fig   | varchar(300)  | YES  |     | NULL    |                |
+-------+---------------+------+-----+---------+----------------+
```
```text:shogi
ban
+--------+-----------+------+-----+---------+-------+
| Field  | Type      | Null | Key | Default | Extra |
+--------+-----------+------+-----+---------+-------+
| id     | int(11)   | YES  |     | NULL    |       |
| banmen | char(200) | YES  |     | NULL    |       |
| oki    | char(200) | YES  |     | NULL    |       |
| teban  | int(11)   | YES  |     | NULL    |       |
+--------+-----------+------+-----+---------+-------+

chat
+-------+-----------+------+-----+---------+-------+
| Field | Type      | Null | Key | Default | Extra |
+-------+-----------+------+-----+---------+-------+
| id    | int(11)   | YES  |     | NULL    |       |
| name  | char(20)  | YES  |     | NULL    |       |
| msg   | char(200) | YES  |     | NULL    |       |
+-------+-----------+------+-----+---------+-------+

heya
+-------+-----------+------+-----+---------+-------+
| Field | Type      | Null | Key | Default | Extra |
+-------+-----------+------+-----+---------+-------+
| id    | int(11)   | YES  |     | NULL    |       |
| sente | char(200) | YES  |     | NULL    |       |
| gote  | char(200) | YES  |     | NULL    |       |
+-------+-----------+------+-----+---------+-------+

highlight
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | YES  |     | NULL    |       |
| ban   | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+

kifu
+--------+-----------+------+-----+---------+-------+
| Field  | Type      | Null | Key | Default | Extra |
+--------+-----------+------+-----+---------+-------+
| id     | int(11)   | YES  |     | NULL    |       |
| banmen | char(200) | YES  |     | NULL    |       |
| oki    | char(200) | YES  |     | NULL    |       |
+--------+-----------+------+-----+---------+-------+

resign
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | YES  |     | NULL    |       |
| teban | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
```

## コードの作成

### ユーザ登録・認証
https://github.com/jun6231jp/myservice/tree/top/top
ユーザ認証画面からログイン。新規ユーザ登録はsign upから。ユーザが登録するとユーザ名が管理者にメールで通知され、管理者がユーザにアクセス権限を与える。
<img src="https://qiita-image-store.s3.amazonaws.com/0/152991/1499a894-fbbd-9a81-aae1-6046026f267e.jpeg" width=50%>

管理者用の権限コントロールアプリ画面。
https://github.com/jun6231jp/myservice/tree/top/control
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152991/f8da1012-acf6-79a6-e63f-f709a43d1808.jpeg" width=50%>
登録ユーザーごとに使用可能なアプリケーションをチェックボックスで選択する。
<img src="https://qiita-image-store.s3.amazonaws.com/0/152991/9c75bb24-12a4-4fcb-aa99-538a95afa095.jpeg" width=50%>

※管理者権限ではサーバ電源操作アプリも使用できる。外出先からでもスマホ画面操作することで、Raspberry piからLAN内にある自宅PCの起動、シャットダウン、サスペンドが可能。
使用するにはスクリプトの権限と所有者の設定をする必要がある。

```text
sudo chmod 755 /home/user/*sh
sudo chmod 755 /home/user/*exp
sudo chown root:root /home/user/*sh
sudo chown root:root /home/user/*exp
```
スクリプト実行結果を格納する/home/httpd/msgファイルの権限と所有者の設定をする。

```text
sudo mkdir -p /home/httpd
sudo touch /home/httpd/msg
sudo chmod 777 /home/httpd/msg
sudo chown root:root /home/httpd/msg
```
<img src="https://qiita-image-store.s3.amazonaws.com/0/152991/47dc6282-8608-4fb9-4298-3ffe913b66a8.jpeg" width=50%>

さらにVPNを構築することなくブラウザでファイル編集も可能にした。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152991/0d7a4cbd-6299-2a97-bbe5-28647fff06ff.jpeg" width=50%>
一般ユーザでログイン後はポータル画面に移動する。アクセス権限が与えられたアプリのみ画面に表示される。
<img src="https://qiita-image-store.s3.amazonaws.com/0/152991/e9d5de87-a99f-74d2-3d78-abbd592cbda0.jpeg" width=50%>

### 家計簿アプリ
https://github.com/jun6231jp/myservice/tree/top/hhab
何にいくら使ったかを登録する画面。欄をクリックすると過去に入力した項目リストが選択候補として表示される。食費などの家計をポケットマネーで立て替えた場合など、後に精算が必要なものはチェックボックスにチェック。その他、月ごとの目標使用額の設定が可能。
<img src="https://qiita-image-store.s3.amazonaws.com/0/152991/03322315-c18b-6aee-c0dc-e541e3b0c53a.jpeg" width=50%>

使用履歴一覧。本日の使用額、今月の使用額が計算される他、目標額までの残額、チェックボックスでチェックをつけて登録した項目のうち未精算の項目合計額が計算される。
<img src="https://qiita-image-store.s3.amazonaws.com/0/152991/26db8097-b03f-6a9f-134b-fa12ce65e0ff.jpeg" width=50%>

### 英語アプリ
https://github.com/jun6231jp/myservice/tree/top/english

TOEIC学習用アプリのトップ画面。
<img src="https://qiita-image-store.s3.amazonaws.com/0/152991/45168b42-c521-80df-474a-079152e81338.jpeg" width=50%>

英単語検索アプリ画面。意味を調べたい英単語を入力。英単語の意味をWebllioから自動で検索し、英単語帳に登録する。手入力のメモも併せて登録可能。
<img src="https://qiita-image-store.s3.amazonaws.com/0/152991/0e93f669-53f9-7290-ae63-47c78454ac9c.jpeg" width=50%>

英単語帳の画面。
<img src="https://qiita-image-store.s3.amazonaws.com/0/152991/5429e701-4eec-0216-1725-2affb86357d0.jpeg" width=50%>

TOEIC問題選択画面。メニュー右横の数字は学習回数。
<img src="https://qiita-image-store.s3.amazonaws.com/0/152991/c4d511bd-1d19-d2c3-dca1-5b90f8d4b736.jpeg" width=50%>

学習を始める前にTOEIC教材のタイトルと解答を登録しておく。TOEIC registrationのボタンから登録画面に移動する。
<img src="https://qiita-image-store.s3.amazonaws.com/0/152991/47198dec-9835-f0d6-9f90-1f02275472a3.jpeg" width=50%>

登録後、メニュー画面に戻ると登録した問題メニューボタンが現れるのでクリック。教材の模範解答登録画面に移動する。
<img src="https://qiita-image-store.s3.amazonaws.com/0/152991/4aa93b39-cf41-7de6-434e-f5ef10cd821f.jpeg" width=50%>

模範解答登録が完了すると背景が白に変わり、TOEIC回答欄画面になる。チェックボックスにチェックをつけて提出すると自動採点される。回答途中でコミットした場合、採点はされず、途中状態が保持される。回答再開した際に、前回中断状態から開始できる。
<img src="https://qiita-image-store.s3.amazonaws.com/0/152991/9cb46c05-57b6-4c18-d525-171f1f9ed71f.jpeg" width=50%>

点数と解いた問題数はグラフ化される。
![577A18A5-E716-441A-B1A5-A33C67B20BFA.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152991/bb0df6c1-8291-6c24-f7a0-d29613d77ac2.jpeg)

### 資格勉強用アプリ
https://github.com/jun6231jp/myservice/tree/top/shikaku

テーブル作成画面でテーブル名を入力する。
すでに他のユーザーが同じテーブル名で作成済みならテーブルを共有することができる。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152991/aaea7c57-76f7-c4d7-3a71-10cda11a41b2.jpeg" width=50%>
テーブル登録画面ではタイトルとその説明を登録する。さらに図をつけたい場合は添付する。
<img src="https://qiita-image-store.s3.amazonaws.com/0/152991/8101f25c-f26a-da79-1e2b-dce97ce759c6.jpeg" width=50%>

登録した単語、説明文、図は表形式で記録される。
<img src="https://qiita-image-store.s3.amazonaws.com/0/152991/f3840935-79fc-5f0d-72ce-afa23d650a9c.jpeg" width=50%>

### ゲームアプリ
https://github.com/jun6231jp/myservice/tree/top/game

オンライン将棋アプリを作成した。
※move.cは/home/user/C/move.outとしてコンパイルする必要あり。ban.phpと同じ階層にshogiというディレクトリを作成し、好きな駒の画像を保存する。

対局室選択画面。マシンスペック、ネットワーク負荷など考慮し3部屋まで。
<img src="https://qiita-image-store.s3.amazonaws.com/0/152991/e9efcffc-f659-b132-253f-ee108edb30ff.jpeg" width=50%>

対局画面。観戦も可能。
<img src="https://qiita-image-store.s3.amazonaws.com/0/152991/04005f74-d74d-0241-98a1-c2c88cb889ff.jpeg" width=70%>

選択した駒は青枠でハイライト、最新手は黒枠でハイライトされる。チャット機能も付けた。
<img src="https://qiita-image-store.s3.amazonaws.com/0/152991/98b0045d-83c3-4f7e-e3c1-605c123c255a.jpeg" width=70%>

棋譜再生画面。対戦者も観戦者も棋譜の閲覧が可能。
<img src="https://qiita-image-store.s3.amazonaws.com/0/152991/43009bbf-7f26-f973-4737-763013105c85.jpeg" width=70%>

さらにマインスイーパを作成した。初期画面が現れるのでリセットボタンからステージの設定をする。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152991/f213cfb4-4a66-a3b2-cacb-26268aeafbb4.jpeg" width=50%>
ステージサイズとボム数を設定する。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152991/84540a0e-7904-c304-f227-aab74d2b564a.jpeg" width=50%>
フラグとオープンを使い分けながらマスをクリックする。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152991/1b0602e2-93bb-dd3f-8ee3-ee3586a17d55.jpeg" width=50%>
## サイトに広告を掲載する
自作サイトに広告を掲載することで、広告収入を得ることも可能。Googleアフィリエイトはドメイン名がサブドメインでは使えない。MyDNSで付与されるドメインはサブドメイン(○○○.○○○.○○のような形式)であるため別のサービスを利用する必要がある。ここでは次のサービスを利用している。

https://www.a8.net/

例としてバナー集を作成した。
![3019DAE2-FB9F-4ABF-ACF8-07A814C61118.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152991/2a5a80e4-f97a-4298-4f02-2967c3f489fa.jpeg)