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