Mempersiapkan server untuk menerbitkan aplikasi web dengan Python

Selamat siang, Habrovsk!

Ada waktu luang, dan ada keinginan untuk membuat aplikasi web kecil. Ada ide (untuk menerima data dari sensor cuaca, simpan dalam database dan kemudian lakukan sesuatu yang menarik), server gratis juga. Tutorial tentang pengaturan tampaknya sama juga ... Tetapi pada saat penulisan, tidak ada satupun yang berfungsi sepenuhnya ditemukan. Jika Anda juga ingin menggunakan aplikasi pada server CentOS 7.4 menggunakan python3. * Bundle, uwsgi dan nginx, selamat datang di cat.

Jadi, apa yang seharusnya dan apa yang tidak akan dibahas dalam artikel ini:

  1. Server fisik atau virtual yang menjalankan CentOS 7.4 (kinerja tidak dijamin untuk sistem operasi dan versi lain).
  2. Akses ke server dengan hak superuser * jika server virtual, maka diasumsikan ada kemampuan dan kemampuan untuk terhubung melalui SSH).

Setelah terhubung sebagai pengguna root, langkah pertama adalah membuat pengguna baru dengan hak administrator (ini tidak perlu, tetapi setidaknya nada yang baik):

adduser developer
passwd developer

Di sini Anda perlu memasukkan dan mengonfirmasi kata sandi pengguna

usermod -aG wheel developer

Tambahkan pengguna ke grup administrator lokal

su - developer

Beralih ke pengguna yang baru dibuat.

Sekarang siapkan lingkungan:

sudo yum install -y epel-release
sudo yum install -y python3 python3-pip python3-devel nginx gcc
sudo yum update -y python36 python2
sudo yum groupinstall -y "Development Tools" "Development Libraries"
sudo yum install -y python3-devel python36-virtualenv

Saya ingin menarik perhatian pada garis kedua dari belakang - "Alat Pengembangan" dan "Perpustakaan Pengembangan" diperlukan untuk peluncuran yang benar dari lingkungan virtual. Kami menggunakan bendera sehingga tim memenuhi tanpa meminta konfirmasi.

Sekarang Anda dapat mulai membuat direktori kerja:

sudo mkdir /opt/myproject && cd /opt/myproject
sudo chown -R developer /opt/
python3 -m venv myprojectenv
source myprojectenv/bin/activate

pip3 install --upgrade pip
pip3 install uwsgi flask

Sekarang kami

vi /opt/myproject/wsgi.pyakan menyiapkan titik masuk untuk aplikasi web: (selanjutnya saya akan menggunakan editor vi, namun ini masalah selera)

def application(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/html')])
    return ["<h1 style='color:blue'>Testing Success!</h1>"]

Kode ini setelah peluncuran akan memungkinkan kami untuk memastikan bahwa semua langkah yang diambil sebelumnya berhasil. Untuk menguji, jalankan layanan:

uwsgi --socket 0.0.0.0:8080 --protocol=http -w wsgi

Dengan koneksi ljcnegt atau rdp fisik, hasilnya dapat diperiksa di browser di 0.0.0.0:8080. Dengan koneksi SSH, buka sesi baru dan uji dengan curl:

curl -v 0.0.0.0:8080

Bendera -v memungkinkan Anda untuk melihat hasil penuh.

Setelah pengujian selesai, Anda harus menghentikan layanan dengan menekan CTRL + C (jika tidak, Anda harus mencari proses dan membunuhnya dengan kill. Ini juga merupakan jalan keluar, tetapi jelas kurang nyaman).

Sekarang Anda dapat membuat aplikasi web utama:

vi /opt/myproject/myproject.py

from flask import Flask
application = Flask(__name__)

@application.route("/")
def hello():
   return "<h1 style='color:blue'>Hello There!</h1>"

if __name__ == "__main__":
   application.run(host='0.0.0.0')

Proses pengujian sangat mirip dengan yang sebelumnya - kami meluncurkan aplikasi menggunakan perintah python3 /opt/myproject/myproject.pydan periksa. Hasilnya harus sama.

Sekarang edit titik masuk sehingga ketika dipanggil, aplikasi kita mulai:

vi /opt/myproject/wsgi.py

from myproject import application

if __name__ == "__main__":
   application.run()

Sekarang yang paling sulit dan menarik. Saatnya membuat layanan dari aplikasi ini yang akan bekerja secara otomatis dan di latar belakang.

Pertama, persiapkan file-in untuk uwsgi:

vi /opt/myproject/myproject.ini

[uwsgi]
wsgi-file = myproject/wsgi.py

master = true
processes = 2

uid = developer
socket = /tmp/uwsgi/myproject.sock
chown-socket = nginx:nginx
chmod-socket = 666
vacuum = true

die-on-term = true

Di sini saya ingin memperhatikan baris-baris berikut:

  1. socket = /tmp/uwsgi/myproject.sock - untuk mempercepat layanan Anda harus menggunakan unix-socket, dan agar nginx dapat terhubung, buatlah di folder sementara / tmp / uwsgi
  2. chown-socket = nginx: nginx akan mentransfer hak penggunaan socket ke pengguna nginx
  3. chmod-socket = 666 - melayani tujuan yang sama dengan yang sebelumnya. Manual dan tip yang berbeda memiliki nilai parameter yang berbeda - 664, 665, 777 - tetapi telah ditetapkan secara eksperimental bahwa 666 adalah yang berfungsi minimal.

Sekarang Anda dapat melanjutkan langsung ke pembuatan layanan:

sudo vi /etc/systemd/system/myproject.service

[Unit]
Description=uWSGI instance to serve myproject app
After=network.target

[Service]
ExecStartPre=-/usr/bin/bash -c 'mkdir -p /tmp/uwsgi chown nginx:nginx /tmp/uwsgi'
ExecStart=/usr/bin/bash -c 'cd /opt/myproject; source myprojectenv/bin/activate; uwsgi --ini myproject.ini'
ExecStartPost=/usr/bin/bash -c 'setenforce 0'
PrivateTmp=false
[Install]
WantedBy=multi-user.target

Semua baris menarik ada di blok Layanan:

  1. ExecStartPre adalah perintah yang akan dijalankan oleh manajer sistem sebelum memulai layanan.

    - / usr / bin / bash -c mengumumkan awal dari urutan perintah berikutnya, dan 'mkdir -p / tmp / uwsgi chown nginx: nginx / tmp / uwsgi' membuat folder sementara untuk soket dan mentransfer hak kepada pengguna nginx.
  2. ExecStart adalah perintah yang memulai layanan secara langsung, dan di dalamnya kita secara berurutan pergi ke direktori yang berfungsi, mengaktifkan lingkungan virtual dan memulai server-uwsgi dari file ini.
  3. ExecStartPost - perintah yang berjalan setelah layanan dimulai. Dalam kasus kami, diperlukan permintaan transfer yang benar dari server nginx ke server uwsgi.
  4. PrivateTmp = false adalah parameter yang membuat folder sementara yang dibuat terlihat oleh proses lain.

Sekarang jalankan layanan:

systemctl start myproject
systemctl status myproject
systemctl enable myproject

Perintah terakhir akan membuatnya autostart setelah server reboot.

Dan brengsek terakhir - kita akan mengkonfigurasi server nginx dan membuat aplikasi web kita tersedia untuk jaringan eksternal. Log karyanya selalu dapat dilihat menggunakan perintah

journalctl -u  myproject

sudo vi /usr/lib/systemd/system/nginx.service

Temukan blok [Layanan] dan tambahkan PrivateTmp = false di akhir.

Setelah itu, reboot daemon dengan perintah. systemctl daemon-reload

Sekarang kita lanjutkan langsung ke konfigurasi server:

vi /etc/nginx/nginx.conf

http {
    . . .

    include /etc/nginx/conf.d/*.conf;

    server {
        listen 80 default_server;

        . . .

Temukan blok http dan tambahkan server baru:

server {
    listen 80;
    server_name server_domain_or_IP;

    location / {
        include uwsgi_params;
        uwsgi_pass unix:/tmp/uwsgi/myproject.sock;
    }
}

Sekarang tinggal menghidupkan server dan mengedit aturan di firewall:

systemctl start nginx
systemctl enable nginx

firewall-cmd --zone=public --permanent --add-service=http
firewall-cmd --zone=public --permanent --add-service=https

firewall-cmd --reload

Sekarang, ketika mengakses server dengan nama domain atau alamat IP-nya, kami akan menerima tanggapan dari aplikasi Flask kami.

Semoga materi ini bermanfaat.

All Articles