フラスコプロジェクトのCentOS展開方法

最近、pythonを学び、flaskを使って個人的なブログプログラムを実装しました。終了したらサーバーにデプロイしたいと思います。私は初心者だったので、ずっとつまずいて、ようやく基本的にやり遂げました。インターネット上の情報は初心者にはあまり親しみがなく、断片的であるため、将来の参考に役立つ自分の記録として整理し、私のような初心者の手助けをしたいと思っています。

前提

  1. サーバーがあります(そうでないと面倒になります)、高品質の外国のvpsの推奨事項を参照して購入できます
  2. 個人のドメイン名があります(もちろん、IPアクセスを直接使用することもできますが、少し奇妙ですよね?GoDaddyにアクセスしてドメイン名を購入できます。

**1. git **をインストールします

githubまたはBitbucketを選択できます。もちろん、独自のgitサーバーを構築することもできますが、必要ではないと思います。主にプライベートライブラリが無料であるため、Bitbucketを選択します。

sudo yum install git

フォローアップはローカル開発と同じです。sshキーとクローンコードを構成します。展開されません。プロジェクトディレクトリは/ home / www /の下に配置することをお勧めします。

2. ** [ Mysql **](https://cloud.tencent.com/product/cdb?from=10680)をインストールします

MySQLYUMソースを追加します

$wget 'https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm'
$sudo rpm -Uvh mysql57-community-release-el7-11.noarch.rpm
$yum repolist all | grep mysql

mysql-connectors-community/x86_64 MySQL Connectors Community         36
mysql-tools-community/x86_64   MySQL Tools Community            47
mysql57-community/x86_64     MySQL 5.7 Community Server         187

最新バージョンをインストールする

$sudo yum install mysql-community-server

MySQLサービスを開始します

$sudo service mysqld start 
$sudo systemctl start mysqld #CentOS 7
$sudo systemctl status mysqld
● mysqld.service - MySQL Community Server
 Loaded:loaded(/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
 Active:active(running) since Sat 2017-05-2712:56:26 CST; 15s ago
 Process:2482 ExecStartPost=/usr/bin/mysql-systemd-start post(code=exited, status=0/SUCCESS)
 Process:2421 ExecStartPre=/usr/bin/mysql-systemd-start pre(code=exited, status=0/SUCCESS)
 Main PID:2481(mysqld_safe)
 CGroup:/system.slice/mysqld.service
  ├─2481/bin/sh /usr/bin/mysqld_safe --basedir=/usr
  └─2647/usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/...

すでに実行されています

パスワードを変更する

$ mysql -uroot -p 

ここにパスワードを入力する必要があります。Mysqlをインストールすると、デフォルトのパスワードが生成されます。grep "temporary password" /var/log/mysqld.logコマンドを使用すると、最後の引用符の後の文字列がrootのデフォルトのパスワードになります。

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPassword';

コードを変更

/etc/my.cnfでデフォルトのエンコーディングを設定します

[ client]default-character-set= utf8

[ mysqld]default-storage-engine = INNODB

character-set-server = utf8

collation-server = utf8_general_ci #大文字と小文字を区別しません

collation-server = utf8_bin #大文字と小文字を区別

collation-server = utf8_unicode_ci #utf8より_general_ciはより正確です

データベースを作成する

mysql> CREATE DATABASE <datebasename> CHARACTER SET utf8;

**3. python3 pip3 **をインストールします

CentOS7はデフォルトでPython2をインストールします。Python3を使用する必要がある場合は、Pythonソースコードを手動でダウンロードし、コンパイルしてインストールできます。

Python3をインストールする

sudo mkdir /usr/local/python3 #インストールディレクトリを作成します
$ wget --no-check-certificate https://www.python.org/ftp/python/3.6.2/Python-3.6.2.tgz #Pythonソースファイルをダウンロードする
# 注:wgetがhttpsを取得したら、次を追加します。--no-check-certifica
$ tar -xzvf Python-3.6.2.tgz #パッケージを解凍します
$ cd Python-3.6.2 #解凍したディレクトリに入る
sudo ./configure --prefix=/usr/local/python3 #作成したディレクトリを指定します
sudo make
sudo make install #コンパイルしてインストール

./configure、configureの実行時にエラーが報告される場合があります。エラー:$ PATHに受け入れ可能なCコンパイラが見つかりません。これは、適切なコンパイラがインストールされていないためです。インストールするだけです。

sudo yum install gcc-c ++(sudo yum install gcc-c ++を使用すると、gccおよびその他の依存パッケージが自動的にインストール/アップグレードされます。)

共存する2つのバージョンを構成する

python3のソフトリンクを作成します。

$ sudo ln -s /usr/local/python3/bin/python3 /usr/bin/python3

このように、pythonコマンドを使用してPython 2を使用し、python3を使用してPython3を使用できます。

**pip **をインストールします

$ sudo yum -y install epel-release #最初にepel拡張ソースをインストールします
$ sudo yum -y install python-pip #pythonをインストールします-pip
$ sudo yum clean all #キャッシュの消去

この方法でインストールできるのはpip2のみのようです。Python3のpipをインストールする場合は、次のソースコードからインストールできます。

# ソースコードをダウンロードする
$ wget --no-check-certificate https://github.com/pypa/pip/archive/9.0.1.tar.gz

$ tar -zvxf 9.0.1.tar.gz  #ファイルを解凍する

$ cd pip-9.0.1

$ python3 setup.py install #Python3でインストール

リンクを作成します。

$ sudo ln -s /usr/local/python3/bin/pip /usr/bin/pip3

アップグレードピップ

$ pip install --upgrade pip

4. gunicornをインストールします

Gunicorn(Unicorn)は、効率的なPython WSGIサーバーであり、通常、wsgiアプリケーション(WSGIアプリケーションの記述仕様に従うために独自に記述)またはwsgiフレームワーク(Django、Pasterなど)を実行するために使用されます。これは、JavaのTomcatと同等です。 。 WSGIはそのようなプロトコルです:それはPythonプログラムとユーザーリクエストの間のインターフェースです。 WSGIサーバーの役割は、ユーザーの要求を受け入れて分析し、対応するpythonオブジェクトを呼び出して要求の処理を完了し、対応する結果を返すことです。簡単に言うと、gunicornはHTTPの基盤となる実装をカプセル化します。gunicornを介してサービスを開始し、ユーザーの要求とサービスをgunicornを介して送信します。

仮想環境を作成する

cd /home/www/blog
mkdir venv
python3 -m venv venv

仮想環境をアクティブ化します。

source venv/bin/activate

次に、requirements.txtファイルに従って依存パッケージをインストールします。

pip3 install -r requirements.txt

gunicornをインストールします

pip3 install gunicorn

プロジェクトのルートディレクトリにwsgi.pyファイルを作成します

from app import create_app

application =create_app('production')if __name__ =='__main__':
 application.run()

manage.pyからサービスを開始することはなくなり、開発中にのみ使用されます

サービスを開始します。

gunicorn -w 4-b 127.0.0.1:8000 wsgi:application

**5. Nginx **をインストールします

nginxは高性能のWebサーバーです。通常、フロントエンドでリバースプロキシサーバーとして使用されます。いわゆるフォワードとリバース(リバース)は単なる英語の翻訳です。プロキシサービスとは、ローカルエリアネットワークからプロキシサーバーを介してリクエストが送信され、インターネット上のサーバーに到達することです。このプロセスのプロキシはフォワードプロキシです。インターネットからのリクエストの場合は、まずプロキシサーバーに入り、LAN上のターゲットサーバーに転送します。このとき、プロキシサーバーはリバースプロキシ(比較的フォワード)です。

フォワードプロキシ:{クライアント-"プロキシサーバー}-"サーバー

リバースプロキシ:クライアント— "{プロキシサーバー—"サーバー}

{} ローカルエリアネットワークを表します

Nginxは順方向と逆方向の両方を実行できます。

$ yum -y install nginx

nginxサービスを開始します

$ service nginx start

nginxサービスを停止します

$ service nginx stop

nginxサービスを再起動します

$ service nginx restart

グレースフルリスタート

nginxの構成が変更されたため、最初に閉じたり開いたりせずに再読み込みできます

$ nginx -s reload

起動後、ブラウザにサーバーのIPアドレスを入力すると、次のように表示されます。

ここでyumはnginxをインストールし、完了します

構成を追加する

nginxの構成ファイルは次のとおりです。/etc/nginx/nginx.conf

server {
 listen 80;
 server_name adisonhyh.com;

 location /{
  proxy_pass http://127.0.0.1:8000;
  proxy_set_header Host $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}}
  1. httpのデフォルトのポート番号80を聞く
  2. server_name:個人のWebサイトのドメイン名
  3. リクエストをマシンのポート8000(サービスを開始するためにgunicornによって指定されたポート)にプロキシし、proxy_set_headerを左にコピーします

gunicornとnginxの関係:

Gunicornは個別にサービスを提供できますが、実稼働環境では通常提供しません。まず、静的リソース(jscssimg)は多くの要求リソースを使用します。また、gunicornの場合、静的リソース要求でリソースを浪費するのではなく、実際のビジネス要求と処理にもっと注意を払う必要があります。さらに、gunicornだけを実行する方法はありません。 [Load Balancing](https://cloud.tencent.com/product/clb?from=10680)への複数のプロセスと複数のポートを開始します。

nginxの役割は、上記の問題を補うことです。まず、フロントエンドサーバーとして、すべての静的ファイルリクエストを処理できます。このとき、gunicornはバックエンドサーバーとして使用されます。nginxは動的リクエストをバックエンドサーバーに転送するため、複数のgunicornプロセスを開始できます。 nginxにロードバランシングを実行させて、リクエストを複数のgunicornプロセスに転送し、サーバーの処理効率と処理能力を向上させます。最後に、nginxは、セキュリティ関連、認証関連、およびその他の多くのプロセスを構成することもできます。これにより、Webサイトをビジネスの作成に集中させ、転送ルールやその他のビジネスに関係のないものをnginxに任せることができます。
設定後、ローカルブラウザを開き、ドメイン名を入力すると、アクセスできるようになります。

6. supervisor

プロセスを常に実行する必要がある場合、プロセスがさまざまな理由で中断された場合、プロセスは自動的に再起動します。スーパーバイザーを選択することをお勧めします。スーパーバイザー管理プロセスは、これらの管理対象プロセスをfork / execを介してスーパーバイザーの子プロセスとして開始するため、管理対象プロセスの実行可能ファイルのパスをスーパーバイザーの構成ファイルに追加するだけで済みます。このとき、管理対象プロセスはスーパーバイザーの子プロセスとみなされ、子プロセスに異常端末がある場合、親プロセスは子プロセスの異常端末の情報を正確に取得できます。構成ファイルでautostart = trueを設定することにより、異常中断を実現できます。子プロセスの自動再起動。

スーパーバイザーをインストールする

$ pip install supervisor
$ echo_supervisord_conf > supervisor.conf  #スーパーバイザーのデフォルト構成ファイルを生成する
$ vim supervisor.conf            #スーパーバイザー構成ファイルを変更し、gunicornプロセス管理を追加します

ブログsupervisor.conf構成ファイルの最後に追加します(私の作業パスはwww / home / blog /であることに注意してください)

[ program:blog]
command=/home/www/blog/venv/bin/gunicorn -w4 -b0.0.0.0:8000 wsgi:application  ;スーパーバイザー開始コマンド
directory=/home/www/blog                         ;プロジェクトフォルダパス
startsecs=0;始まる時間
stopwaitsecs=0;終了待ち時間
autostart=false;自動的に開始するかどうか
autorestart=false;自動的に再起動するかどうか
stdout_logfile=/home/www/blog/logs/gunicorn.log              ;ログ
stderr_logfile=/home/www/blog/logs/gunicorn.err              ;エラーログ

supervsiorを使用してgunicornを開始します

$ sudo supervisord -c supervisor.conf 
$ sudo supervisorctl start blog

設定したアドレスをブラウザのアドレスバーに入力して、ウェブサイトにアクセスします。

7. fabric

最後のステップでは、ファブリックを使用してリモート操作と展開を実装します。 FabricはPythonのMakefilesに似たツールですが、リモートサーバーでコマンドを実行できます。

ファブリックをインストールする

pip install fabric

ブログディレクトリに新しいfabfile.pyファイルを作成します

import os
from fabric.api import local, env, run, cd, sudo, prefix, settings, execute, task, put
from fabric.contrib.files import exists
from contextlib import contextmanager

env.hosts =['204.152.201.69']
env.user ='root'
env.password ='****'#パスワード
env.group ="root"

DEPLOY_DIR ='/home/www/blog'
VENV_DIR = os.path.join(DEPLOY_DIR,'venv')
VENV_PATH = os.path.join(VENV_DIR,'bin/activate')

@ contextmanager
def source_virtualenv():withprefix("source {}".format(VENV_PATH)):yield

def update():withcd('/home/www/blog/'):sudo('git pull')

def restart():withcd(DEPLOY_DIR):if not exists(VENV_DIR):run("virtualenv {}".format(VENV_DIR))withsettings(warn_only=True):withsource_virtualenv():run("pip install -r {}/requirements.txt".format(DEPLOY_DIR))withsettings(warn_only=True):
   stop_result =sudo("supervisorctl -c {}/supervisor.conf stop all".format(DEPLOY_DIR))if not stop_result.failed:
   kill_result =sudo("pkill supervisor")if not kill_result:sudo("supervisord -c {}/supervisor.conf".format(DEPLOY_DIR))sudo("supervisorctl -c {}/supervisor.conf reload".format(DEPLOY_DIR))sudo("supervisorctl -c {}/supervisor.conf status".format(DEPLOY_DIR))sudo("supervisorctl -c {}/supervisor.conf start all".format(DEPLOY_DIR))

@ task
def deploy():execute(update)execute(restart)

これで、コードが更新された場合、ローカルで直接リモート展開を実行できます

fab deploy

以上が本稿の内容ですので、皆様のご勉強に役立てていただければ幸いです。

Recommended Posts

フラスコプロジェクトのCentOS展開方法
linux(centos)プロジェクトの展開フェーズに関連するコマンドの概要
Centos6.5のインストールとKVMの展開
Centos7でのCeph展開の簡潔な要約
Centos-6.5LNMP環境のインストールと展開
Centos7のインストールとgitlabサーバーの展開
国内ソースのCentOS8yum / dnf構成方法
Centos7のインストールとAirflowの展開の詳細
CentOS展開ハーバー
静的IPを設定するCentOSメソッドの概要
CentOS8でのApollo構成センターの分散展開
Cobblerを使用して、CentOS / Ubuntuのバッチ展開を自動化します
Centos8(最小インストール)Python3.8 + pipメソッドチュートリアルの新規インストール
CentOS8のグラフィカルインストール
ubuntu環境展開プロジェクト
DockerCentOSのインストール方法
CentOS7環境でのKubernetes(k8s)クラスターの迅速な展開
CentOS7.6サーバー展開VNC
CentOSでの脆弱性スキャンおよび分析ソフトウェアNessusの展開
CentOS8システムにKernel5.xカーネルバージョンをインストールする詳細な方法
Centos8のOpenStackUssuriの最小限の展開とインストールの詳細なチュートリアル
[CentOS環境の展開] CentOSでのJava7 / Java8の展開
Centos7.4デプロイメント構成Elasticsearch5.6クラスター
TomcatをインストールするCentos7.6メソッド-8.5.39
Oracle11gのCentos7サイレントインストール
CentOS8.0ネットワーク構成の実装
Centos7.2展開vncサービスレコード
DockerのCentOS環境インストール
パラメータを渡すPythonメソッド
Cephの迅速な展開(Centos7 + Jewel)
CentOS8でのElasticStackの使用:Elasticsearch / Kibana7.8の展開と認証の構成