仮想化ソフトを使ってMac環境にLinuxを入れて動的サーバーを立てる

# 備忘録自分の学習用
## 学習の目的
- 動的コンテンツのWebサーバーを建てること
- Webサーバーがどのように動いているのかを学ぶ
## 学習の流れ
### 1. サーバー構築作業
    - ローカルマシンに仮想環境(UTM)を導入
    - 仮想環境にLinux（ubuntu）を導入
    - Linux補助ツール導入
    - nginx導入とphpファイル読み込み設定
    - PHPとPHP-fpmインストール
    - PHPファイルの作成と導入
    - systmctlのnginxを再起動
### 2. 実装中に出てきた不明点をまとめて調べる
        
        
## UTM導入
- [UTM](https://mac.getutm.app/)は[QEMU](https://e-words.jp/w/QEMU.html)というオープンソースのマシンエミュレーターをベースとした仮想化ソフトウェア。macOS上でx86/x64用のアプリケーションを実行することが可能。
- マシンに直接OSを入れるわけではないので、ローカル環境が汚れないという利点で使用。
## Ubuntu導入
- [Ubuntuの公式サイト](https://ubuntu.com/download/server/arm)からUbuntuをダウンロード。（ダウンロードはarm64版）
- [Ubuntuの導入方法はこちらの記事を参照](https://tryota.hatenablog.com/entry/2021/01/29/Ubuntu_Server_20.04_%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)
## Ubuntu補助ツール導入
- Ubuntuのパッケージ管理システムを最新化
    - ```sudo apt-get update && apt-get -y upgrade```
- UbuntuGUI導入
    - ```sudo apt-get -y install ubuntu-desktop```を叩く
## nginx導入と読み込みファイルの設定
- nginxパッケージを検索する
    - ```apt search nginx``` 
- nginxをインストールする
    - ```apt install nginx```
- nginxの設定
    - HTMLの配置場所
        - ```cd /var/www/html```
    - なぜ/var/www/htmlにあるファイルを参照するのか
        - nginx.confの中で以下を読み込んでいる
        >include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
    - site-enebledを確認する
        - ```root /var/www/html```でhtml配置場所を参照
        -  ```# Add index.php to the list if you are using PHP```の場所で記載したファイルを左から優先して読み込んでいく
    -  sites-enabled/defaultファイルにindex.phpを読み込むよう記載
        -  ```index index.php index.html index.htm index.nginx-debian.html;```
-  PHPインストール
    -  最新のPHP8.3をインストール
        -  ```sudo apt install -y php8.3```
        -  ```php -v```コマンドを叩きphpが導入されていることを確認
    -  PHP-FPMをインストール
        -  ```sudo apt install php-fpm```
        -  ```sudo systemctl start php8.3-fpm```サービス自動起動
-  PHPファイル作成
    - ```cd /var/www/html```でディレクトリ移動
    - ```sudo touch index.php```入力
    - ```sudo vim index.php```入力し、以下phpinfoを貼り付け
        - ```<?php phpinfo(); ?>```
- nginxの読み込み設定をPHPに変更する
    - nginxの```sites-enabled/default```を以下のように更新

```
 # pass PHP scripts to FastCGI server
        #
        location ~ \.php$ {
                include snippets/fastcgi-php.conf;

        #       # With php-fpm (or other unix sockets):
                fastcgi_pass unix:/run/php/php8.3-fpm.sock;
        #       # With php-cgi (or other tcp sockets):
                #fastcgi_pass 127.0.0.1:9000;
        }
```

- nginxのコードを更新したので、裏で動いているsystmctlのnginxを再起動
    - ```sudo systemctl restart nginx```  
            

### web確認
終わり。
![スクリーンショット 2024-09-17 21.25.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487318/445eb877-62fe-360b-3f67-43367242a0ed.png)

### 備考
- [aptコマンドについて](https://atmarkit.itmedia.co.jp/ait/articles/1708/31/news017.html)
- [manコマンドについて](https://atmarkit.itmedia.co.jp/ait/articles/1702/16/news016.html)

---
# 実装中に出てきた不明点をまとめて調べる

## NGINXとApachの違い・用途・一般的にどちらを使うか

### NGINXが誕生した経緯
- 今まではApachが人気で利用されていたが、「C10K問題」が懸念された
- [C10K問題](https://ja.wikipedia.org/wiki/C10K%E5%95%8F%E9%A1%8C)：同時接続するクライアントが多すぎるとソフトウェア上の問題によりサーバーがパンクしてしまうこと
- **「C10K問題」を回避するため、Apachに変わるNGINXが開発された**

### NGINXとApachを比較
**処理**
- Apache：１リクエストに対して１プロセスが処理
- NGINX ：1プロセスで複数のリクエストを処理

**処理能力**
・ApacheよりもNGINXの方が1.2倍～1.5倍ほど高い

**同時接続数**
- NGINXはApacheの10～100倍

**メモリ消費量**
- マルチプロセス(Apache)：リクエストの量に応じてメモリが消費される
- シングルスレッド(NGINX)：同時処理数が増えてもそれほどメモリ使用量は変わらない
- 同時処理数が少ない場合には両者にあまり違いはない

### Apachの強みと弱み
|メリット|デメリット|
|:--:|:--:|
|簡単に機能拡張できる|メモリを大量に消費する|
|信頼性・安定性が高い|同時処理数が多くなると耐えられない|
|開発者向け技術情報を入手しやすい|-|
|重い処理が得意|-|

### NGINXの強みと弱み
|メリット|デメリット|
|:--:|:--:|
|速くて高負荷に強い|CPUリソースがたくさん必要な処理は不向き|
|リバースプロキシやロードバランサの機能がある|Nginx単体で完結させるのは難しい|
|柔軟にカスタマイズ可能|-|
|-|機能が少ない|
|-|ソースコードが複雑|

### 結局ApacheとNginxどっちがいいのか？

|Apach|NGINX|
|:--:|:--:|
|少量の同時接続数で重い処理を担当|大量の同時接続数や軽い静的コンテンツを担当|

### どちらも利用するケース
- NGINXには大量の同時接続数で重たい処理の場合はNGINXを[リバースプロキシサーバー](https://wa3.i-3-i.info/word1755.html)として利用して、動的コンテンツはApacheに処理させるという相互の利用も効果的

<br/>

- [NGINXとApachを比較メリット・デメリット・どちらを使えばいいいのか](https://www.geekly.co.jp/column/cat-technology/1903_096/)
---
### systemctlとsystemdとは何か


**systemctlについて**
- systemdを操作するためのコマンド
- systemctl [start stop restart enable disable] サービス名

**systemdについて**
- バックグラウンドで動作するサービスやプロセスなどの起動状態を管理するデーモン
- systemdはすべてのプロセスの親プロセス
<br>

- [デーモンとは](https://wa3.i-3-i.info/word11000.html)
- [【Linux覚書き】systemdとsystemctlでサービスを管理する](https://qiita.com/nnhkrnk/items/5082485e680606e74982)
---

### www-dataとは何か
```
ウェブサーバーが動くためには誰かの名前を借りて作業をする必要があります。
その役割をしているのが「www-data」という名前のキャラクター（ユーザー）です。

何故そんな名前（ユーザー）が必要か？ 
ウェブサーバーがウェブページを表示したり、ファイルを読み書きしたりするときに、普通の人の代わりに「www-data」が操作します。これにより、悪い人（ハッカー）がウェブサーバーを通じてコンピュータ全体にアクセスするのを防ぐ役割も果たしています。

例えるなら、学校の先生（ウェブサーバー）が教室（ウェブサイト）で授業をするとき、先生個人の名前を使わず、「教務」という名札を使って動き回っているような感じです。

上記ChatGPTより引用
```
- [www-dataとは何か](https://tech-hint.hatenablog.com/entry/2023/02/07/075745#google_vignette)


### PHP-FPMとは何か
- FPM ( FastCGI Process Manager ) は PHP の FastCGI 実装のひとつで、 主に高負荷のサイトで有用な追加機能を用意している
- **Web サーバー 上で PHP ( 動的コンテンツを生成する言語 ) を動作せるための仕組み**
#### CGIとFast CGIの違い

- **CGI**
    - ユーザーから要求がある度に、プロセスの生成と破棄を行うが、
量の要求があればその分だけプロセスの生成と破棄が実施され、この事がパフォーマンスの悪化に繋がっていく
- **Fast CGI**
    - 初回リクエスト時に起動したプロセスをメモリ上へ保持を行い、次回リクエストに対してはそのメモリに保持したプロセスの実行を行い
<br>

- [php-fpmとは](https://www.php.net/manual/ja/install.fpm.php)


### 最後に
- 今回はwebサーバーを立てて、不明点を洗ってそれぞれが何であるかを洗い出した。
- 以下の書籍を読んでweb技術について知見を広げていく。
    - [webを支える技術]()