Alibaba Cloud サーバーを申請し、データのアップロードとダウンロードをサポートする HTTP サーバーをパブリック ネットワーク上に構築します

1 はじめに

        独自のクラウド サーバーを使用してできることはたくさんあります。Alibaba Cloud サーバーは間違いなく中国で最高です。

        Alibaba Cloud サーバーは、さまざまなインターネット アプリケーションの構築と実行に使用でき、安定した高パフォーマンスのサービスを提供します。

        Alibaba Cloud サーバーの用途には次の側面が含まれますが、これらに限定されません。

  1. Web サイトのホスティング: Web サイトのファイルとデータベースを Alibaba Cloud サーバーに展開して、安定したネットワーク環境と高性能のサーバー リソースを提供し、Web サイトの正常な動作を保証できます。

  2. アプリケーションの導入: 電子商取引システム、ERP システム、CRM システムなどのさまざまなアプリケーションやサービスを Alibaba Cloud サーバーに導入して、安定した信頼性の高い動作環境を提供できます。

  3. データ ストレージ: データは Alibaba Cloud サーバーに保存され、クラウド ストレージ サービスを通じてバックアップおよび管理され、データのセキュリティと信頼性が確保されます。

  4. データベース サービス: Alibaba Cloud が提供する RDS (Relational Database Service)、MongoDB、Redis などのデータベース サービスを使用して、高性能でスケーラブルなデータベース サービスを提供できます。

  5. 仮想化: Alibaba Cloud が提供する仮想マシン サービスを使用して、仮想マシン上でアプリケーションを実行し、リソースの分離と柔軟な展開を実現できます。

  6. クラウド ストレージ: Alibaba Cloud が提供する OSS (Object Storage Service) などのクラウド ストレージ サービスを使用して、ファイルをクラウドに保存し、可用性と信頼性の高いストレージ サービスを提供できます。

  7. セキュリティ保護: DDoS 保護、Web アプリケーション ファイアウォール (WAF) など、Alibaba Cloud が提供するセキュリティ保護サービスを使用して、サーバーやアプリケーションをネットワーク攻撃から保護できます。

2. Alibaba Cloudサーバーを申請する

2.1 ログインと登録

Alibaba Cloudの公式Webサイトを開き、右上の「ログイン/登録」をクリックし、Alipayを使用してコードをスキャンしてログインします

ホームページでクラウドサーバーEC2を選択し、開くと「製品トライアルサービス」が表示されますので、個人利用版をクリックするとすぐにご利用いただけます。すべての初心者は、Alipay の 3 か月間無料トライアルを楽しむことができます。

インスタンスの作成ページで、インスタンスの仕様、オペレーティング システム、ネットワーク タイプ、ストレージなどの要件に応じてインスタンス構成を選択します。

 セキュリティグループを設定します。通常は「受信方向」を設定します。SSH でログインする場合は、ポート 22 を開く必要があります。HTTP サーバーを構築する場合は、ポート 80 または 443 を開く必要があります。

「リモート接続」をクリックします。Alibaba Cloud には 3 つのリモート接続方法が用意されています。

「Workbench経由でリモートログインするためのパスワード」を設定しますが、この時点では直接ログインすることはできません。

最初のログインでは VNC リモート コントロールを選択する必要があります。VNC リモート コントロールは、インスタンスが起動しているとき、またはインスタンスは実行中だがオペレーティング システムがまだ実行されていないときにインスタンスにログインするのに適しています。

プロンプトに従って VNC リモート コントロールのパスワードを設定し、正常にログインします。ログイン後、ネットワーク構成を確認し、eth0 ネットワーク カードにインスタンスのプライベート IP アドレスがあることを確認します。

[root@iZbp1h36cszlkbxbf5gqeeZ ~]# ifconfig
bond0: flags=5123<UP,BROADCAST,MASTER,MULTICAST>  mtu 1500
        ether f2:ac:4a:db:46:4e  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:cc:74:16:f8  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.25.37.106  netmask 255.255.240.0  broadcast 172.25.47.255
        inet6 fe80::216:3eff:fe1e:ab8c  prefixlen 64  scopeid 0x20<link>
        ether 00:16:3e:1e:ab:8c  txqueuelen 1000  (Ethernet)
        RX packets 3870  bytes 3300682 (3.1 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 2692  bytes 411305 (401.6 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

/etc/ssh/sshd_config ファイルの構成を変更する

PermitRootLogin yes
PassworkAuthentication yes

SSH サービスを再起動して有効にします

systemctl restart sshd

これで、「パブリック IP + Workbench リモート ログイン パスワード」を使用してローカル コンピュータに SSH 経由でログインできるようになります。

3. FlaskでHTTPサーバーを構築する

centos 上に新しいディレクトリを作成し、Python-Flask フレームワークを使用して http サーバーを作成します。最もシンプルなアップロードとダウンロード機能を実現します。

3.1 ディレクトリ構造

この HTTP サーバーを構築するには、新しい httpserver ディレクトリを作成します。

httpserver ディレクトリの下に、HTML ファイルを配置するためのテンプレート ディレクトリを作成します。

HTTP サーバーの実行ロジックを記述するための新しい app.py ファイルを作成します。

httpserver ディレクトリの下にアップロード ディレクトリを作成し、アップロードおよびダウンロードしたファイルを配置します。

[root@iZbp1h36cszlkbxbf5g**** httpserver]# ls -ltr
total 4
drwxr-xr-x 2 root root   24 Jul 17 22:14 templates
-rw-r--r-- 1 root root 1455 Jul 17 22:16 app.py
drwxr-xr-x 2 root root   24 Jul 17 22:17 upload
[root@iZbp1h36cszlkbxbf5g**** httpserver]# ls upload
upload.txt
[root@iZbp1h36cszlkbxbf5g**** httpserver]# ls templates
index.html

3.2 コードの記述

app.pyを書きます(chatGPTで与えられたコードを少し変更しています)

from flask import Flask, render_template, request, send_from_directory
import os

app = Flask(__name__)
UPLOAD_FOLDER = 'upload'
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER


@app.route('/', methods=['GET'])
def index():
    files = get_file_list()
    return render_template('index.html', files=files)


@app.route('/upload', methods=['POST'])
def upload_file():
    file = request.files['file']
    filename = file.filename
    save_path = os.path.join(app.config['UPLOAD_FOLDER'], filename)
    file.save(save_path)
    return 'File uploaded successfully.'


@app.route('/upload_data', defaults={'path': ''}, methods=['GET', 'POST'])
# @app.route('/<path:path>')
def upload_data(path):
    if request.method == 'POST':
       print('The upload data is: %s' % request.get_data())
    return 'Received!'


@app.route('/download/<path:filename>', methods=['GET'])
def download_file(filename):
    folder_path = app.config['UPLOAD_FOLDER']
    return send_from_directory(folder_path, filename, as_attachment=True)

# 文件删除
@app.route('/delete/<path:filename>', methods=['GET', 'POST'])
def delete_file(filename):
    file_path = app.config['UPLOAD_FOLDER']
    file_location = os.path.join(file_path, filename)
    if os.path.exists(file_location):
        os.remove(file_location)
        return 'File deleted successfully'
    else:
        return 'File not found'

def get_file_list():
    folder_path = app.config['UPLOAD_FOLDER']
    files = []
    for filename in os.listdir(folder_path):
        if os.path.isfile(os.path.join(folder_path, filename)):
            files.append(filename)
    return files


if __name__ == '__main__':
    if not os.path.exists(app.config['UPLOAD_FOLDER']):
        os.makedirs(app.config['UPLOAD_FOLDER'])
    app.run(host="0.0.0.0", port=80)
   # app.run(debug=True)

Index.html を書きます

<!DOCTYPE html>
<html>
<head>
    <title>File Server</title>
    <style>
        table {
            border-collapse: collapse;
            width: 100%;
        }

        th, td {
            text-align: left;
            padding: 8px;
        }

        tr:nth-child(even) {
            background-color: #f2f2f2;
        }
    </style>
</head>
<body>
    <h1>File Server</h1>
    <h2>Upload File</h2>
    <form action="/upload" method="POST" enctype="multipart/form-data">
        <input type="file" name="file" required><br><br>
        <input type="submit" value="Upload">
    </form>
    <h2>Download Files</h2>
    <table>
        <tr>
            <th>Filename</th>
            <th>Download</th>
            <th>Delete</th>
        </tr>
        {% for file in files %}
        <tr>
            <td>{
   
   { file }}</td>
            <td><a href="/download/{
   
   { file }}">Download</a></td>
            <td><a href="/delete/{
   
   { file }}">Delete</a></td>
        </tr>
        {% endfor %}
    </table>
</body>
</html>

3.3 試験記録

コマンドを実行する

python3 app.py
或者
nohup python3 app.py > output.txt &

最初の実行でエラーが発生したため、Flask ライブラリをインストールする必要があります

 pip install Flask==2.0.3

3.3.1 json 形式のデータをローカルで http サーバーに送信するテスト

curl を使用して、ローカル コンピューターに json 形式でデータをアップロードしてみます。

C:\Users\lenovo>curl -X POST -H "Content-Type: application/json" -d '{"key1":"value1","key2":"value2"}' http://121.43.231.**:80/upload_data
Received!

Alibaba Cloud 上の http サーバーがメッセージを受信し、応答を返します。

"受け取った!"。

[root@iZbp1h36cszlkbxbf5g**** httpserver]# python3 app.py
 * Serving Flask app 'app' (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on all addresses.
   WARNING: This is a development server. Do not use it in a production deployment.
 * Running on http://172.25.37.106:80/ (Press CTRL+C to quit)



The upload data is: b"'{key1:value1,key2:value2}'"
117.62.169.192 - - [17/Jul/2023 22:28:57] "POST /upload_data HTTP/1.1" 200 -

3.3.2 ファイルをローカルで http サーバーにアップロードするテスト

アドレスバーにURLを入力してください

http://121.43.231.**/

見られます

 

 「ファイルを選択」をクリックした後、ファイルを選択して「アップロード」をクリックすると、ファイルがhttpサーバーのアップロードディレクトリにアップロードされます。

コマンド ラインを使用してファイルをローカルにアップロードすることもできます。ローカルの「D:\PIC\POST.png」を http サーバーにアップロードする場合は、次のコマンドを使用できます。

D:\PIC>curl -F "file=@D:\PIC\POST.png" http://121.43.231.**/upload
File uploaded successfully.

3.3.3 http サーバーへのファイルのローカルダウンロードのテスト

ダウンロードの下の「ダウンロード」をクリックしてファイルをダウンロードします。

3.3.4 ファイルを削除するための HTTP サービスエリアのテスト

ファイルを削除するには、「削除」の下の「削除」をクリックします。

4. HTTPサーバーのドメイン名を設定する

昔、AWS でドメイン名を購入しましたが、一度も使用しませんでした。

(AWS の購入には国際クレジット カードが必要です。Alibaba Cloud を通じて購入できます。Alibaba Cloud のドメイン名の購入は明らかに AWS と似ています。Alibaba Cloud のホームページには「ドメイン名」があります。本名が認証されているかどうかを確認し、ID カードの写真をアップロードしてください)ミッション認証に合格して購入)

HTTP サービスのドメイン名を解決するように DNS を構成できるようになりました。

設定手順:

AWS公式サイトに入り、ログインを完了し、「Route 53 ダッシュボード」に入り、「ホストゾーン」をクリックし、独自ドメイン名をクリックし、「レコードの作成」をクリックし、下図に従って設定を行ってください。 「保存」をクリックして、しばらくお待ちください。正常に動作していることがわかります。

 発効したら、通過できます

C:\Users\harry_zhang>curl -X POST -H "Content-Type: application/json" -d '{"key1":"value1","key2":"value2"}' http://xiao********.com/upload_data
Received!

HTTP サーバーにメッセージを送信します。

を通じてもご利用いただけます

http://xiao********.com

HTTPサーバーのページにアクセスします。

5. 最後に

        これは、Alibaba Cloud サーバーを初めて使用したときの記録です。参考までに。

おすすめ

転載: blog.csdn.net/qq_33163046/article/details/131734534
おすすめ