サーバの構築

サーバの構築手順

Nginx (CGI)

必要なパッケージのインストール

##### ※注意 - Python 3.12 以降では `cgi` `cgitb` モジュールが削除されています **古い** CGIスクリプトは動作しないため、 **環境変数** と **stdin** を使ったフォーム処理に書き換える必要があります。 → **代替モジュール** [`libcgipy`](https://pypi.org/project/libcgipy/) を作成しました

ターミナル
sudo apt install nginx fcgiwrap
pip install libcgipy    # Pythonスクリプトを動かす場合

設定ファイルの編集

ターミナル
sudo nano /etc/nginx/sites-available/[Project Name]

エディタ
server {
    listen 80;
    server_name radicon.lan;

    location /cgi-bin/ {
        gzip off;
        alias [path]/cgi-bin/;
        fastcgi_pass unix:/run/fcgiwrap.socket;
        include /etc/nginx/fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $request_filename;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

設定の変更

ターミナル
sudo ln -s /etc/nginx/sites-available/[Project Name] /etc/nginx/sites-enabled/
sudo rm /etc/nginx/sites-enabled/default
sudo nginx -t # テスト

起動

 親ディレクトリにも実行権限o+xを与えること
 子ディレクトリには-Rオプションで一括権限付与

ターミナル
sudo systemctl restart nginx

Djangoを利用したWebサーバの構築 (nginx)

プロジェクトの作成 (Windows用)

バッチファイル (.bat)
@echo off
if "%1" == "" (
    set /p projectName="プロジェクト名を入力 : "
) else (
    set projectName=%1
)
django-admin startproject %projectName%
echo 作成完了
pause > nul

アプリの設定

ターミナル
cd [Project Name]

バッチファイル (.bat)
@echo off

if "%1" == "" (
    goto help

) else if "%~1" == "/?" (
    goto help

) else if "%~1" == "-help" (
    goto help

) else if "%~1" == "-app" (
    if "%2" == "" (
        echo アプリ作成
        set /p appName="アプリ名 : "
    ) else (
        set appName=%2
    )
    setlocal enabledelayedexpansion
    python manage.py startapp !appName!
    echo 完了しました
    pause > nul
    exit /b

) else if "%~1" == "-mig" (
    if "%2" == "" (
        echo マイグレーション
        set /p appName="アプリ名 : "
    ) else (
        set appName=%2
    )
    setlocal enabledelayedexpansion
    python manage.py makemigrations !appName!
    python manage.py migrate
    echo 完了しました
    pause > nul
    exit /b

) else if "%~1" == "-run" (
    python manage.py runserver
    pause>nul
    exit /b

) else if "%~1" == "-col" (
    python manage.py collectstatic
    pause>nul
    exit /b

) else if "%~1" == "--create-admin" (
    python manage.py createsuperuser
    pause>nul
    exit /b

) else (
    echo 引数が違います
    goto help
)

:help
    echo %~0
    echo [/?]             : help
    echo [-app] [appName] : 指定したアプリを作成
    echo [-mig] [appName] : 指定したアプリのマイグレーションを実行
    echo [-run]           : ローカルサーバ立ち上げ
    echo [-col]           : staticファイルを集める
    echo [--create-admin] : 管理者登録
    cmd
    exit /b

必要なパッケージのインストール

ターミナル
sudo apt install nginx
pip install uwsgi # テスト環境用
sudo pip install django djangorestframework django-bootstrap5 uwsgi --break-system-packages # 実環境にインストール

設定ファイルの編集

ターミナル
nano [path]/[Project Name]/[Project Name]_uwsgi.ini

エディタ
[uwsgi]
socket = /tmp/[Project Name].sock
chmod-socket = 666

chdir = [path]/[Project Name]

module = [Project Name].wsgi

processes = 4
threads = 2

uid = www-data
gid = www-data

pidfile = /tmp/[Project Name].pid
logto = /var/log/uwsgi/[Project Name].log
daemonize = /var/log/uwsgi/[Project Name].log

ターミナル
uwsgi --ini [path]/[Project Name]/[Project Name]_uwsgi.ini # テスト

ターミナル
sudo nano /etc/nginx/sites-available/[Project Name]

エディタ
##
# You should look at the following URL's in order to grasp a solid understanding
# of Nginx configuration files in order to fully unleash the power of Nginx.
# https://www.nginx.com/resources/wiki/start/
# https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/
# https://wiki.debian.org/Nginx/DirectoryStructure
#
# In most cases, administrators will remove this file from sites-enabled/ and
# leave it as reference inside of sites-available where it will continue to be
# updated by the nginx packaging team.
#
# This file will automatically load configuration files provided by other
# applications, such as Drupal or Wordpress. These applications will be made
# available underneath a path with that package name, such as /drupal8.
#
# Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples.
##

# Default server configuration
#

server {
    listen 80 default_server;

    # ワイルドカード (ホスト名がマッチしないすべて)
    server_name _;

    # 接続を即時切断
    return 444;
}

server {
    listen 443 ssl default_server;

    ssl_certificate [path]/server.crt;
    ssl_certificate_key [path]/server.key;

    # ワイルドカード (ホスト名がマッチしないすべて)
    server_name _;

    # 接続を即時切断
    return 444;
}

server {
    listen 80;
    # root /var/www/html;

    server_name raspi5.lan;

    # 静的ファイル
    location /static/ {
        alias [path]/[Project Name]/static/;
    }

    # すべての動的リクエストをuWSGIに転送
    location / {
        include uwsgi_params;
        uwsgi_pass unix:///tmp/[Project Name].sock; # uWSGI設定ファイルで指定したソケットのパス
    }

    error_log /var/log/nginx/[Project Name]_error.log;
    access_log /var/log/nginx/[Project Name]_access.log;
}

server {
    listen 443 ssl;

    ssl_certificate [path]/server.crt;
    ssl_certificate_key [path]/server.key;

    # root /var/www/html;

    server_name raspi5.lan;

    # 静的ファイル
    location /static/ {
        alias [path]/[Project Name]/static/;
    }

    # すべての動的リクエストをuWSGIに転送
    location / {
        include uwsgi_params;
        uwsgi_pass unix:///tmp/[Project Name].sock; # uWSGI設定ファイルで指定したソケットのパス
    }

    error_log /var/log/nginx/[Project Name]_error.log;
    access_log /var/log/nginx/[Project Name]_access.log;

}

設定の変更

ターミナル
sudo ln -s /etc/nginx/sites-available/[Project Name] /etc/nginx/sites-enabled/
sudo rm /etc/nginx/sites-enabled/default
sudo nginx -t # テスト

起動

 親ディレクトリにも実行権限o+xを与えること
 子ディレクトリには-Rオプションで一括権限付与

ターミナル
sudo systemctl restart nginx

自動起動

ターミナル
sudo nano /etc/systemd/system/[Project Name].service

エディタ
[Unit]
Description=uWSGI instance to serve [Project Name]
After=network.target

[Service]
User=www-data
Group=www-data
WorkingDirectory=[path]/[Project Name] 
ExecStart=uwsgi --ini [path]/[Project Name]/[Project Name]_uwsgi.ini
Restart=always

[Install]
WantedBy=multi-user.target

ターミナル
sudo systemctl daemon-reload
sudo systemctl restart [Project Name].service
sudo systemctl enable [Project Name].service

HTTP

HTTPメソッド

| メソッド名 | 内容 | CRUD特性 | 一般的なデータの置き場所 | 冪等 | | --- | --- | --- | --- | --- | | GET | リソースの取得 | Read | リクエスト行(クエリ文字列) | ○ | | POST | リソースの新規作成・データの送信 | Create | メッセージボディ | × | | HEAD | リソースヘッダ情報のみ取得 | - | リクエスト行(クエリ文字列) | ○ | | PUT | リソースの置換・更新
(存在しなければ作成) | Update | メッセージボディ | ○ | | DELETE | リソースの削除 | Delete | リクエスト行(対象はURLのパスで指定) | ○ |

HTTPステータスコード

| コード番号 | ステータス | 内容 | | --- | --- | --- | | 100 | Continue | リクエストの継続を許可 | | 101 | Switching Protocols | プロトコルの切り替え | | 200 | OK | 正常終了 | | 201 | Created | リソースの作成成功 | | 202 | Accepted | リクエストは受理されたが処理は未完了 | | 204 | No Content | 正常終了(返すボディなし) | | 206 | Partial Content | 範囲指定による部分的な取得成功 | | 301 | Moved Permanently | リソースが恒久的に移動 | | 302 | Found | リソースが一時的に移動 | | 303 | See Other | 別のURIを参照(GETで取得) | | 304 | Not Modified | 前回から更新なし(キャッシュ利用可) | | 307 | Temporary Redirect | 一時的なリダイレクト(メソッド維持) | | 308 | Permanent Redirect | 恒久的なリダイレクト(メソッド維持) | | 400 | Bad Request | リクエストの構文が不正 | | 401 | Unauthorized | 認証が必要 | | 403 | Forbidden | アクセス権限なし | | 404 | Not Found | リソースが存在しない | | 405 | Method Not Allowed | 許可されていないメソッド | | 408 | Request Timeout | リクエストがタイムアウト | | 409 | Conflict | リソースの状態と競合 | | 410 | Gone | リソースが恒久的に削除済み | | 413 | Content Too Large | リクエストボディが大きすぎる | | 415 | Unsupported Media Type | 未対応のメディアタイプ | | 429 | Too Many Requests | リクエスト過多(レート制限) | | 500 | Internal Server Error | サーバー内部エラー | | 501 | Not Implemented | 未実装の機能 | | 502 | Bad Gateway | 上位サーバーから不正な応答 | | 503 | Service Unavailable | サービス一時停止(過負荷・メンテナンス等) | | 504 | Gateway Timeout | 上位サーバーからの応答タイムアウト |

リクエスト行(1行目) + リクエストヘッダ

[method] [URI] HTTP/[プロトコルバージョン]
Authorization: [認証方式] [アクセストークン / BASE64に変換した値]
Referer: [リンク元のURL]
User-Agent: [ブラウザの名称/バージョン情報]
Host: [接続先サーバのURI:ポート番号]
Cookie: [クライアントがサーバに提示するCookie]
Content-Type: [ファイル内容/ファイルの種類]; charset=UTF-8
X-Forwarded-For: [実際の送信元ホストのIPアドレス]
Connection: [ネットワークの接続状態の制御 (keep-alive 等)]
Accept: [クライアントが受信可能なファイルの種類 (MIMEタイプ text/html,application/xml,*/* 等)]
Accept-Language: ja-JP,ja;q=[ja優先度],en-US;q=[en-US優先度],en;q=[en優先度]
Accept-Encoding: [クライアントが対応しているデータの圧縮形式(コンマ区切り)]
Upgrade-Insecure-Requests: [HTTPSへのアップグレード要求]
If-Modified-Since: [キャッシュ検証用日時 (ddd, dd MMM yyyy HH:mm:ss GMT)]
If-None-Match: [キャッシュが最新か検証するためにサーバーへ提示するコンテンツの識別子 (ETag値) ]
Cache-Control: [キャッシュの扱い方 (no-cache(毎回確認) / no-store(キャッシュ禁止) / public / private 等)], max-age=[有効期間秒数], [must-revalidate (期限切れなら絶対に確認 通信不可ならエラーを出す)]

ステータス行(1行目) + レスポンスヘッダ

HTTP/[プロトコルバージョン] [ステータスコード] <ステータスコードの説明(任意文字列可能 HTTP/2以降廃止)>
Date: [レスポンスを生成した日時 (ddd, dd MMM yyyy HH:mm:ss GMT)]
Content-Type: [ファイル内容/ファイルの種類]; charset=UTF-8
Content-Length: [レスポンスボディのサイズ(Byte数)]
Transfer-Encoding: [レスポンスボディの転送方式 (chunked 等)]
Connection: [ネットワークの接続状態の制御 (keep-alive 等)]
Server: [レスポンスを処理したWebサーバーの種類 (nginx 等)]
Location: [リダイレクト先のURI]
X-Frame-Options: [ページを <frame> / <iframe> / <object>等で表示する際の制御 (DENY / SAMEORIGIN 等) クリックジャッキング対策]
X-XSS-Protection: [1 : ブラウザのXSSフィルターの有効化]; mode=[動作指定(block 等)]
X-Content-Type-Options: [nosniff : MIMEタイプの推測禁止&レスポンスヘッダのContent-Type指定を常に優先させる]
ETag: [レスポンス内容を識別するための識別子 (ETag値)]
Cache-Control: [キャッシュの扱い方 (no-cache(毎回確認) / no-store(キャッシュ禁止) / public / private 等)], max-age=[有効期間秒数], [must-revalidate (期限切れなら絶対に確認 通信不可ならエラーを出す)]
Set-Cookie:  [クライアントに保存させるCookie名]=[Cookieの値]; Secure(HTTPSのみCookieを有効); Domain=[サブドメインに共有(省略時 : 発行元サーバーのみ)]; Path=[有効にするパス]; Expires=[Cookieを保持する期限(ddd, dd MMM yyyy HH:mm:ss GMT)]; Max-Age=[有効期間秒数]; HttpOnly(JavaScriptからのアクセスを禁止 XSS対策); SameSite=[Strict / Lax / None (CSRF対策の送信制限)]; [属性]=[値]; [属性];
X-Runtime: [サーバー側でリクエスト処理に要した時間[秒]]
Strict-Transport-Security: max-age=[HTTPS接続を強制する有効期間秒数]
X-Request-Id: [リクエストを一意に識別するためのID]
Content-Security-Policy-Report-Only: [コンテンツセキュリティポリシー違反を監視・報告するための指定 (default-src / script-src / report-uri / report-to 等)]
(空行 : \r\n)
<!DOCTYPE html>
    <html lang="ja">
        <head>

HTML

| 用語 | 説明 | |---|---| | HTML | Webページの構造を記述するマークアップ言語
要素(タグ)によって
  • 見出し
  • 段落
  • リンク
  • フォーム
などを表現する | | CSS | HTML要素の見た目(色・レイアウト・フォント等)
を指定するスタイルシート言語 | | DOM | HTMLやXML文書をツリー構造のオブジェクトとして表現するAPI・仕様
JavaScriptからページの内容や構造を動的に操作できる | | ECMAScript | JavaScriptの言語仕様を定めた標準規格
文法や基本的な機能(変数、関数、クラス等)を規定する | | JavaScript | ECMAScriptを実装したプログラミング言語
ブラウザ上で動作し、DOM操作やイベント処理により動的なWebページを実現する | | TypeScript | JavaScriptに静的型付けの機能を追加した言語
コンパイルによりJavaScriptに変換されて実行される | | JSON | JavaScriptのオブジェクト表記法をベースにしたデータ交換フォーマット
テキストベースで軽量なため、API通信等で広く使われる | | Ajax | ページ全体を再読み込みせずに、JavaScriptから非同期でサーバーとデータをやり取りする手法。 | | XMLHttpRequest (XHR) | JavaScriptから非同期通信を行うための旧来のAPI
Ajaxの実現に用いられてきた | | CORBA
(Common Object Request Broker Architecture) | 異なるプログラミング言語・OS間でオブジェクトを分散連携させるための
ミドルウェア標準規格(ORBを介してリモートオブジェクトを呼び出す) | | SOAP
(Simple Object Access Protocol) | XML形式のメッセージを用いてネットワーク越しに情報交換を行うための
プロトコル
主にHTTP上でWebサービス間の連携に利用されてきた | | WSDL
(Web Services Description Language) | SOAPベースのWebサービスが提供する操作・メッセージ形式・
エンドポイント等をXMLで記述するためのインターフェース定義言語 | | UDDI
(Universal Description, Discovery and Integration) | Webサービスの情報を登録・検索するためのディレクトリサービス(の仕様)
SOAP・WSDLと組み合わせて使われた | | WebDAV
(Web-based Distributed Authoring and Versioning) | HTTPを拡張し、Webサーバー上のファイルの作成・編集・削除・
バージョン管理等を可能にするプロトコル | | Fetch API | ブラウザがサーバーとHTTP通信を行うためのJavaScript標準API
従来のXMLHttpRequestに代わる方式 | | Cookie | サーバーがブラウザに保存させる小さなデータ
セッション管理やログイン状態の保持に利用されるが、盗用により成りすまし等の脅威にもなる | | Session | サーバー側で一連のユーザー操作をひとまとまりとして管理する仕組み
Cookie等にセッションIDを持たせて識別することが多い | | Web Storage
localStorage
sessionStorage | ブラウザ内にキーと値の形式でデータを保存するJavaScript API
Cookieと異なりサーバーへ自動送信されない | | Same-Origin Policy
(SOP) | 異なるオリジン(スキーム・ホスト・ポートの組)間での
リソースアクセスを制限するブラウザの基本的なセキュリティ機構 | | CORS
(Cross-Origin Resource Sharing) | Same-Origin Policyを緩和し、許可されたオリジン間の通信を可能にする仕組み | | HSTS
(HTTP Strict Transport Security) |
  • 一度Webサイトにアクセスすると、サーバーがレスポンスヘッダ(Strict-Transport-Security)で、
    ブラウザに対し指定期間はHTTPSでのみ接続するよう指示する仕組み
  • SSLストリッピング等のHTTPへのダウングレード攻撃や中間者攻撃の防止に有効
| | iframe | 別のHTML文書を現在のページ内に埋め込むためのHTML要素
クリックジャッキング等の攻撃にも利用され得る | | WebSocket | サーバーとブラウザ間で双方向・リアルタイムの通信を行うためのプロトコル・API | | SPA
(Single Page Application) | 初回読み込み後、JavaScriptによる画面遷移・再描画のみで動作するWebアプリケーションの形態 | | SSR
(Server-Side Rendering)

CSR
(Client-Side Rendering) | サーバー側でHTMLを生成する方式と、ブラウザ側のJavaScriptで生成する方式 | | Node.js | ブラウザ外でJavaScriptを実行するためのランタイム環境
サーバーサイド開発等にも用いられる | | npm | JavaScript/Node.jsのパッケージを管理・配布するためのパッケージマネージャー | | Web Components | Custom Elements・Shadow DOM・Templateから成る、再利用可能なUI部品を作成するための標準技術群 |