HomeLập trìnhPythonCách tạo máy...

Cách tạo máy chủ Django chạy uWSGI, NGINX và PostgreSQL trên AWS EC2 với Python 3.6


bởi Sumeet Kumar

1*RoxYjB7zefsqzjUMLLaprQ

Mỗi lần khởi động một máy chủ và chạy cho một dự án mới có thể tốn nhiều thời gian hoặc khó khăn đối với các nhà phát triển mới. Vì vậy, tôi nghĩ rằng tôi sẽ viết một hướng dẫn từng bước sẽ giúp quá trình triển khai dễ dàng hơn.

Nếu bạn không có tâm trạng để đọc, bạn có thể sao chép, dán từng bước như được mô tả (thay thế các giá trị) và khởi động máy chủ của bạn?

điều kiện tiên quyết:

  1. Phiên bản Amazon Linux EC2 được thiết lập và chạy với cặp khóa được liên kết (ssh truy cập vào nó).
  2. Cổng 22, 80 phải được mở cho trường hợp này.
  3. ứng dụng Django mà bạn muốn triển khai.
  4. Cài đặt cơ sở dữ liệu được định cấu hình để sử dụng PostgreSQL.
  5. yêu cầu.txt có trong ứng dụng của bạn, có danh sách phụ thuộc để cài đặt.
  6. Kho lưu trữ Git cho ứng dụng Django của bạn.

SSH & cập nhật phiên bản Ubuntu

Bạn cần ssh vào phiên bản EC2 của mình, vì vậy hãy đảm bảo rằng bạn có cổng 22 mở phiên bản của bạn và sau đó thực hiện cập nhật/nâng cấp.

ssh -i path-to-your-key.pem [email protected]

sudo apt-get update && sudo apt-get upgrade -y

Cài đặt Python3.6.x trên AWS EC2 (ubuntu 16.04)

Chúng tôi sẽ tải về tar.xz tập tin từ trang web chính thức và cài đặt nó theo cách thủ công. Trước đó, chúng ta cần cài đặt một số phụ thuộc cần thiết.

Xây dựng và cài đặt các phụ thuộc

sudo apt install build-essential checkinstall

sudo apt install libreadline-gplv2-dev libncursesw5-dev libssl-dev libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev libffi-dev

Tải xuống và cài đặt thủ công phiên bản Python cần thiết

cd /opt && sudo wget https://www.python.org/ftp/python/3.6.6/Python-3.6.6.tar.xz

sudo tar -xvf Python-3.6.6.tar.xz

cd Python-3.6.6/

sudo ./configure

sudo make && sudo make install

Xóa tệp đã tải xuống

sudo rm -rf Python-3.6.6.tar.xz

Kiểm tra phiên bản Python

python3 -V
> Python 3.6.6

Thiết lập người dùng Ubuntu cho ứng dụng của chúng tôi

Bản thân Django là một khuôn khổ rất an toàn, tôi đồng ý. Nhưng các ứng dụng web vẫn dễ bị tổn thương. Bạn nên chạy ứng dụng của mình với tư cách là người dùng hệ thống với các đặc quyền hạn chế có quyền truy cập hạn chế vào tài nguyên trên máy chủ của bạn. Vì vậy, trong phần này, chúng ta sẽ thêm một nhóm quyền và người dùng mới vào phiên bản EC2 của mình.

Thêm nhóm hệ thống Ubuntu ‘tên nhóm’ [webapps in my case] và chỉ định một người dùng ‘tên người dùng’ [bunny in my case] đến nhóm này

sudo groupadd --system webapps
sudo useradd --system --gid webapps --shell /bin/bash --home /webapps/project_name bunny

Lưu ý: Tôi giả sử “Tên dự án” là tên mà bạn có thể đã sử dụng trong “dự án khởi động django-admin tôi>”

Đọc thêm  Python split() – Ví dụ tách chuỗi

Tạo một thư mục để lưu trữ ứng dụng của bạn

Tạo một thư mục để lưu trữ ứng dụng của bạn trong /webapps/project_name/. Thay đổi chủ sở hữu của thư mục đó thành chú thỏ người dùng ứng dụng của bạn:

sudo mkdir -p /webapps/project_name/

sudo chown bunny /webapps/project_name/

Cho phép người dùng nhóm khác truy cập hạn chế vào thư mục ứng dụng

sudo chown -R bunny:users /webapps/project_name

sudo chmod -R g+w /webapps/project_name

Bây giờ bạn có thể chuyển sang người dùng của mình

sudo su - bunny

// your console will switch to something like this
[email protected]:~$

Để chuyển về sudo người dùng, chỉ cần làm ctrl+d và nó sẽ giết thiết bị đầu cuối của người dùng.

Cài đặt và cấu hình PostgresSQL

Cài đặt PostgreSQL & tạo cơ sở dữ liệu

sudo apt install postgresql postgresql-contrib

sudo su - postgres

[email protected]:~$ psql

postgres=# CREATE DATABASE database_name;

Thay đổi mật khẩu mặc định cho postgres khi ở psql phần cuối

postgres=# \password

Triển khai ứng dụng Django trên phiên bản EC2 qua Git trong môi trường ảo

Việc triển khai ứng dụng của bạn bằng môi trường ảo cho phép ứng dụng của bạn và các yêu cầu của nó được xử lý riêng biệt. Bạn nên cách ly ứng dụng của mình.

Sử dụng khái niệm môi trường rất hữu ích khi bạn đang triển khai nhiều ứng dụng Django trên một phiên bản duy nhất để tách biệt chúng và các thành phần phụ thuộc của chúng với nhau.

Chúng tôi sẽ tạo một môi trường ảo trong người dùng hệ thống của chúng tôi (con thỏ) danh mục. Trước đó, chúng tôi sẽ cài đặt git như một sudo người dùng.

Cài đặt Git và kéo mã của bạn từ git repo

sudo apt-get install git

sudo su - bunny

// change to your repo https or ssh link
[email protected]:~$ git remote add origin 

[email protected]:<user>/<user-repo>.git

[email protected]:~$ git pull origin <branch_name>

Lưu ý rằng chúng tôi chưa sao chép bản repo hoàn chỉnh của mình ở đây. Thay vào đó, chúng tôi đặt liên kết git theo cách thủ công và chỉ kéo nhánh mà chúng tôi muốn triển khai cho phiên bản này. Bạn có thể có một phiên bản khác cho ứng dụng web sẵn sàng phát triển, beta hoặc sản xuất tương ứng với từng nhánh trên git.

Tạo môi trường ảo bằng Python3.6 trong thư mục hiện tại

[email protected]:~$ python3.6 -m venv .
[email protected]:~$ source bin/activate
(project_name)[email protected]:~$ pip install -r requirements.txt

Tại thời điểm này, chúng tôi đã thiết lập thành công dự án của mình. Bây giờ chúng ta cần chạy một số quản lý.py chỉ huy. Điều này sẽ yêu cầu chúng tôi đang ở trong thư mục chứa Manage.py của chúng tôi hoặc mỗi khi chúng tôi cần đưa ra một đường dẫn đến nó:

(project_name)[email protected]:~$ python <path-to->manage.py migrate

(project_name)[email protected]:~$ python <path-to->manage.py createsuperuser

(project_name)[email protected]:~$ python <path-to->manage.py collectstatic

Ghi chú: collectstatic lệnh yêu cầu cấu hình STATIC được thiết lập đúng cách. Tuy nhiên, chúng tôi không thảo luận về điều đó ở đây vì nó không nằm trong phạm vi của hướng dẫn này.

(project_name)[email protected]:~$ python <path-to->manage.py runserver 0.0.0.0:8000

Điều này sẽ khởi động máy chủ phát triển trên cổng 8000. Giả sử cổng 8000 cũng mở cho phiên bản của bạn, bạn có thể truy cập vào tên miền hoặc địa chỉ IP của máy chủ, sau đó nhập 8000 trong trình duyệt của bạn.

http://your_server_domain_or_public_IP:8000
http://your_server_domain_or_public_IP:8000/admin

Lưu ý: Đừng quên thêm tên miền hoặc IP của bạn vào ALLOWED_HOST trong settings.py của bạn

Thiết lập Máy chủ ứng dụng uWSGI

Bây giờ chúng tôi đã thiết lập dự án của mình và sẵn sàng hoạt động, chúng tôi có thể định cấu hình uWSGI để phân phát ứng dụng của mình lên web thay vì máy chủ phát triển nhẹ do Django cung cấp.

Nếu bạn đang nghĩ đến việc chạy lệnh máy chủ trên màn hình, hãy bỏ nó. Máy chủ dành cho nhà phát triển với Django rất nhẹ, không an toàn cao và không thể mở rộng.

Bạn có thể cài đặt uWSGI trong virtualenv hoặc trên toàn cầu và định cấu hình nó cho phù hợp.

Trong hướng dẫn này, chúng tôi sẽ cài đặt uWSGI trong virtualenv. Trước khi có thể cài đặt uWSGI, chúng tôi cần các tệp phát triển Python mà phần mềm dựa vào.

Cài đặt uWSGI cùng với các phụ thuộc của nó

sudo apt-get install python3-dev
sudo su - bunny
[email protected]:~$ source bin/activate
(project_name)[email protected]:~$ pip install uwsgi

Hãy chạy máy chủ bằng uWSGI. Lệnh này làm điều tương tự một quản lý.py máy chủ sẽ làm. Bạn cần thay thế các giá trị tương ứng để kiểm tra thành công bằng lệnh này.

(project_name)[email protected]:~$ uwsgi --http :8000 --home <path-to-virtualenv> --chdir <path-to-manage.py-dir> -w <project-name>.wsgi

Tạo tệp cấu hình uWSGI

Chạy uWSGI từ dòng lệnh chỉ hữu ích để thử nghiệm. Để triển khai thực tế, chúng tôi sẽ tạo một .ban đầu tập tin ở đâu đó trong thư mục người dùng hệ thống của chúng tôi. Tệp này sẽ chứa tất cả cấu hình để xử lý tải yêu cầu lớn và có thể được điều chỉnh cho phù hợp.

Đọc thêm  Cách hợp nhất từ ​​điển trong Python

Ở phần sau của hướng dẫn này, chúng ta sẽ chạy uWSGI phía sau NGINX. NGINX tương thích cao với uWSGI và có hỗ trợ tích hợp để tương tác với uWSGI.

Tạo một thư mục conf trong thư mục người dùng hệ thống của bạn, nơi bạn sẽ lưu trữ uwsgi.ini

(project_name)[email protected]:~$ mkdir conf
(project_name)[email protected]:~$ cd conf
(project_name)[email protected]:~$ nano uwsgi.ini

Sao chép mã bên dưới từ ý chính và lưu mã. Tôi nghĩ rằng các nhận xét là đủ giải thích cho từng tùy chọn.

GHI CHÚ: updateMe được coi là tên dự án của bạn. Nó giống với tên bạn đã đặt ở trên khi tạo thư mục người dùng hệ thống, vì vậy hãy cập nhật cho phù hợp.

[uwsgi]

# telling user to execute file
uid = bunny

# telling group to execute file
gid = webapps

# name of project you during "django-admin startproject <name>"
project_name = updateMe

# building base path to where project directory is present [In my case this dir is also where my virtual env is]
base_dir = /webapps/%(project_name)

# set PYTHONHOME/virtualenv or setting where my virtual enviroment is
virtualenv = %(base_dir)

# changig current directory to project directory where manage.py is present
chdir = %(base_dir)/src/

# loading wsgi module
module =  %(project_name).wsgi:application

# enabling master process with n numer of child process
master = true
processes = 4

# enabling multithreading and assigning threads per process
# enable-threads  = true
# threads = 2

# Enable post buffering past N bytes. save to disk all HTTP bodies larger than the limit $
post-buffering = 204800

# Serialize accept() usage (if possibie).
thunder-lock = True


# Bind to the specified socket using default uwsgi protocol.
uwsgi-socket = %(base_dir)/run/uwsgi.sock

# set the UNIX sockets’ permissions to access
chmod-socket = 666

# Set internal sockets timeout in seconds.
socket-timeout = 300

# Set the maximum time (in seconds) a worker can take to reload/shutdown.
reload-mercy = 8

# Reload a worker if its address space usage is higher than the specified value (in megabytes).
reload-on-as = 512

# respawn processes taking more than 50 seconds
harakiri = 50

# respawn processes after serving 5000 requests
max-requests = 5000

# clear environment on exit
vacuum = true

# When enabled (set to True), only uWSGI internal messages and errors are logged.
disable-logging = True

# path to where uwsgi logs will be saved
logto = %(base_dir)/log/uwsgi.log

# maximum size of log file 20MB
log-maxsize = 20971520

# Set logfile name after rotation.
log-backupname = %(base_dir)/log/old-uwsgi.log

# Reload uWSGI if the specified file or directory is modified/touched.
touch-reload = %(base_dir)/src/

# Set the number of cores (CPUs) to allocate to each worker process.
# cpu-affinity = 1

# Reload workers after this many seconds. Disabled by default.
max-worker-lifetime = 300

Tôi đang cố gắng làm mọi thứ dễ dàng với những lời giải thích rõ ràng. Kiểm tra chéo đường dẫn, tên thư mục và các đầu vào khác mà bạn bắt buộc phải thay thế.

Chúng tôi cần tạo tệp nhật ký và chạy thư mục nơi tệp ổ cắm của chúng tôi sẽ được tạo, mà chúng tôi vừa đề cập trong uwsgi.ini của mình:

(project_name)[email protected]:~$ mkdir log
(project_name)[email protected]:~$ mkdir run
(project_name)[email protected]:~$ touch log/uwsgi.log

Đảm bảo thay đổi quyền đối với hai quyền này để mọi nhóm hoặc người dùng có thể ghi hoặc thực thi các tệp trong các thư mục này:

$ sudo chmod 777 /webapps/updateMe/run
$ sudo chmod 777 /webapps/updateMe/log

Bây giờ hãy thử chạy máy chủ bằng cách sử dụng uwsgi.ini mà chúng ta vừa tạo.

(project_name)[email protected]:~$ uwsgi --ini /webapps/updateMe/conf/uwsgi.ini

Nếu mọi thứ cho đến bây giờ được thiết lập chính xác, thì nó sẽ chạy. Nếu không, bạn cần quay lại để kiểm tra xem mình có bỏ sót điều gì không (chẳng hạn như đường dẫn/tên dự án, v.v.).

Để kiểm tra bất kỳ nhật ký uswgi nào, bạn có thể con mèo hoặc đuôi uwsgi.log:

(project_name)[email protected]:~$ tail log/uwsgi.log

Tạo tệp đơn vị systemd cho uWSGI

Tại thời điểm này, nếu mọi thứ đều ổn, bạn thậm chí có thể chạy lệnh này trên màn hình và tách nó ra – nhưng một lần nữa, đây không phải là một cách làm tốt. Thay vào đó, chúng tôi sẽ tạo một dịch vụ hệ thống và để hệ thống (Người quản lý dịch vụ của Ubuntu) hãy lo việc đó.

Chuyển về người dùng sudo

$ sudo nano /etc/systemd/system/uwsgi.service

và sao chép mã dán từ ý chính bên dưới. Đừng quên cập nhật và kiểm tra chéo tên/đường dẫn phù hợp với ứng dụng của bạn:

[Unit]
Description=uWSGI instance to serve updateMe project
After=network.target

[Service]
User=bunny
Group=webapps
WorkingDirectory=/webapps/project_name/src
Environment="PATH=/webapps/project_name/bin"
ExecStart=/webapps/project_name/bin/uwsgi --ini /webapps/project_name/conf/uwsgi.ini
Restart=always
KillSignal=SIGQUIT
Type=notify
NotifyAccess=all

[Install]
WantedBy=multi-user.target

Sau khi bạn lưu tệp trên và đóng tệp, bạn có thể chạy các lệnh sau:

Đọc thêm  Danh sách Python Tuple VS – Sự khác biệt là gì?

Tải lại daemon systemctl để tải lại cấu hình trình quản lý systemd và tạo lại toàn bộ cây phụ thuộc

$ sudo systemctl daemon-reload

Kích hoạt dịch vụ uwsgi để bắt đầu khởi động lại hệ thống

$ sudo systemctl enable uwsgi

Bắt đầu dịch vụ uwsgi

$ sudo service uwsgi start

Khởi động lại dịch vụ uwsgi

$ sudo service uwsgi restart

Kiểm tra trạng thái dịch vụ uwsgi

$ sudo service uwsgi status

Hãy hít một hơi thật sâu ở đây nếu mọi thứ diễn ra suôn sẻ. Chúng tôi vừa hoàn thành việc thiết lập phần bận rộn nhất của hướng dẫn này, vì vậy bạn nên tự hào.

Tiếp theo, chúng tôi sẽ thiết lập NGINX, và sau đó chúng tôi sẽ hoàn tất! Tôi biết việc này hơi mất thời gian, nhưng hãy tin tôi – sau khi hoàn thành, bạn sẽ hài lòng như tôi sau khi xuất bản hướng dẫn này.

Thiết lập NGINX trên EC2 cho uWSGI

NGINX là một máy chủ nhẹ và chúng tôi sẽ sử dụng nó làm proxy ngược.

Chúng tôi có thể để uWSGI chạy trực tiếp trên cổng 80, nhưng NGINX có nhiều lợi ích hơn khiến nó trở nên hấp dẫn. NGINX cũng bao gồm hỗ trợ cho uWSGI.

Nói đủ rồi, hãy cài đặt NGINX trên ví dụ của chúng tôi

$ sudo apt-get install nginx

Bây giờ khi bạn đi đến http://your-public-ip-or-address, bạn sẽ thấy một trang chào mừng Nginx. Điều này là do NGINX đang lắng nghe cổng 80 theo cấu hình mặc định của nó.

NGINX có hai thư mục, trang web có sẵnkích hoạt trang web, mà cần sự chú ý của chúng tôi. trang web có sẵn lưu trữ tất cả các tệp conf cho tất cả các trang web có sẵn trên phiên bản cụ thể đó. kích hoạt trang web lưu trữ liên kết tượng trưng cho từng trang được bật vào thư mục trang có sẵn.

Theo mặc định, chỉ có một tệp conf có tên mặc định có thiết lập cơ bản cho NGINX. Bạn có thể sửa đổi nó hoặc tạo một cái mới. Trong trường hợp của chúng tôi, tôi sẽ xóa nó:

$ sudo rm -rf /etc/nginx/sites-available/default
$ sudo rm -rf /etc/nginx/sites-enabled/default

Hãy tạo ra của chúng tôi nginx-uwsgi.conf tệp để kết nối yêu cầu của trình duyệt với máy chủ uwsgi mà chúng tôi đang chạy trên trang web có sẵn:

$ sudo nano /etc/nginx/sites-available/nginx-uwsgi.conf

và sao chép đoạn mã sau từ ý chính bên dưới:

upstream updateMe_dev {
    server unix:/webapps/updateMe/run/uwsgi.sock;
}

server {
    listen 80;
    server_name your-IP-or-address-here;
    charset utf-8;

    client_max_body_size 128M;

    location /static {
    # exact path to where your static files are located on server 
    # [mostly you won't need this, as you will be using some storage service for same]
        alias /webapps/updateMe/static_local;
    }

    location /media {
    # exact path to where your media files are located on server 
    # [mostly you won't need this, as you will be using some storage service for same]
        alias /webapps/updateMe/media_local;
    }

    location / {
        include uwsgi_params;
        uwsgi_pass updateMe_dev;
        uwsgi_read_timeout 300s;
        uwsgi_send_timeout 300s;
    }

    access_log /webapps/updateMe/log/dev-nginx-access.log;
    error_log /webapps/updateMe/log/dev-nginx-error.log;
}
$ sudo ln -s /etc/nginx/sites-available/nginx-uwsgi.conf /etc/nginx/sites-enabled/nginx-uwsgi.conf

Đó là tất cả, chúng tôi gần như ở đó, sắp kết thúc…

Tải lại daemon systemctl

$ sudo systemctl daemon-reload

Kích hoạt dịch vụ nginx khi khởi động lại hệ thống

$ sudo systemctl enable nginx

Bắt đầu dịch vụ Nginx

$ sudo service nginx start

Kiểm tra Nginx. Nó sẽ trả về OK, Successful như một phần của kết quả.

$ sudo nginx -t

Nếu NGINX không thành công, bạn có thể kiểm tra nhật ký lỗi hoặc nhật ký truy cập cuối cùng của NGINX trên đường dẫn do chúng tôi chỉ định trong tệp conf.

$ tail -f /webapps/updateMe/log/nginx-error.log
$ tail -f /webapps/updateMe/log/nginx-access.log

Khởi động lại dịch vụ Nginx

$ sudo service nginx restart

Kiểm tra trạng thái Dịch vụ Nginx

$ sudo service nginx status

Bây giờ bạn có thể truy cập ứng dụng của mình tại http://your-public-ip-or-address

Vâng, đây là phần cuối của hướng dẫn dài này. Tôi hy vọng bạn có được những gì bạn mong đợi từ nó. Cám ơn mang với tôi.

Tái bút: uWSGI + NGINX + Django có khả năng tùy biến cao để đáp ứng mọi yêu cầu quy mô lớn. Điều đó đang được nói, tối ưu hóa cốt lõi vẫn nằm ở cấp độ ứng dụng. Cách bạn viết mã và sử dụng Django ORM hoặc truy vấn SQL thô, v.v. sẽ giúp bạn nhiều hơn.



Zik.vn – Biên dịch & Biên soạn Lại

spot_img

Create a website from scratch

Just drag and drop elements in a page to get started with Newspaper Theme.

Buy Now ⟶

Bài viết liên quang

DMCA.com Protection Status