Cách cung cấp các ứng dụng Flask với uWSGI và Nginx trên CentOS 7
Trong hướng dẫn này, ta sẽ cài đặt một ứng dụng Python đơn giản bằng cách sử dụng micro-framework Flask trên CentOS 7. Phần lớn bài viết này sẽ nói về cách cài đặt server ứng dụng uWSGI để chạy ứng dụng và Nginx để hoạt động như một front end Reverse Proxy .Yêu cầu
 Trước khi bắt đầu theo hướng dẫn này, bạn nên cấu hình một  user  không phải root trên  server   của bạn .  User  này cần có  quyền  sudo để có thể thực hiện các chức năng quản trị. Để tìm hiểu cách  cài đặt  điều này, hãy làm theo hướng dẫn  cài đặt   server  ban đầu của  ta .
Để tìm hiểu thêm về uWSGI, server ứng dụng của ta và đặc tả WSGI, bạn có thể đọc phần được liên kết của hướng dẫn này . Hiểu được các khái niệm này sẽ giúp hướng dẫn này dễ thực hiện hơn.
Khi đã sẵn sàng để tiếp tục, hãy đọc tiếp.
Cài đặt các thành phần từ các kho CentOS và EPEL
Bước đầu tiên của ta sẽ là cài đặt tất cả các phần mà ta cần từ repository . Ta cần thêm kho EPEL, chứa một số gói bổ sung, để cài đặt một số thành phần ta cần.
Bạn có thể bật repo EPEL bằng lệnh :
sudo yum install epel-release Sau khi quyền truy cập vào kho EPEL được  cấu hình  trên hệ thống của  ta ,  ta  có thể bắt đầu cài đặt các gói  ta  cần.  Ta  sẽ cài đặt pip , trình quản lý gói Python, để cài đặt và quản lý các thành phần Python của  ta .  Ta  cũng sẽ nhận được một trình biên dịch và các file  phát triển Python cần thiết để xây dựng uWSGI.  Ta  cũng sẽ cài đặt Nginx ngay bây giờ.
Bạn có thể cài đặt tất cả các thành phần này bằng lệnh :
sudo yum install python-pip python-devel gcc nginx Tạo môi trường ảo Python
Tiếp theo, ta sẽ cài đặt một môi trường ảo để cô lập ứng dụng Flask của ta với các file Python khác trên hệ thống.
 Bắt đầu bằng cách cài đặt gói virtualenv bằng pip :
sudo pip install virtualenv Bây giờ, ta có thể tạo một folder mẹ cho dự án Flask của bạn . Di chuyển vào folder sau khi bạn tạo:
mkdir ~/myproject cd ~/myproject Ta có thể tạo một môi trường ảo để lưu trữ các yêu cầu Python của dự án Flask của ta bằng lệnh :
virtualenv myprojectenv Điều này sẽ cài đặt một bản sao local  của Python và pip vào một folder  gọi là myprojectenv trong folder  dự án của bạn.
Trước khi cài đặt các ứng dụng trong môi trường ảo, ta cần kích hoạt nó. Bạn có thể thực hiện bằng cách gõ:
source myprojectenv/bin/activate  Dấu nhắc  của bạn sẽ thay đổi để cho biết rằng bạn hiện đang hoạt động trong môi trường ảo. Nó sẽ trông giống như thế này ( myprojectenv ) user @ host :~/ myproject $ .
Cài đặt ứng dụng flask
Đến đây bạn đang ở trong môi trường ảo của bạn , ta có thể cài đặt Flask và uWSGI và bắt đầu thiết kế ứng dụng của ta :
Cài đặt Flask và uWSGI
  Ta  có thể sử dụng version  local  của pip để cài đặt Flask và uWSGI. Nhập các lệnh sau để nhận hai thành phần này:
pip install uwsgi flask Tạo ứng dụng mẫu
Bây giờ ta đã có sẵn Flask, ta có thể tạo một ứng dụng đơn giản. Bình là một micro-framework . Nó không bao gồm nhiều công cụ mà các khung công tác đầy đủ tính năng hơn có thể có và chủ yếu tồn tại dưới dạng module mà bạn có thể nhập vào các dự án của bạn để hỗ trợ bạn khởi tạo ứng dụng web.
 Mặc dù ứng dụng của bạn có thể phức tạp hơn, nhưng  ta  sẽ tạo ứng dụng Flask  của bạn  trong một file  duy nhất, file  này  ta  sẽ gọi là myproject.py :
nano ~/myproject/myproject.py Trong file  này,  ta  sẽ đặt mã ứng dụng  của bạn . Về cơ bản,  ta  cần nhập bình và khởi tạo đối tượng Flask.  Ta  có thể sử dụng điều này để xác định các chức năng sẽ được chạy khi một tuyến đường cụ thể được yêu cầu.  Ta  sẽ gọi ứng dụng Flask của  ta  trong các mã application để tái tạo các ví dụ bạn muốn tìm trong đặc tả WSGI:
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') Về cơ bản, điều này xác định nội dung sẽ hiển thị khi domain root được truy cập. Lưu file khi bạn hoàn tất.
Bạn có thể kiểm tra ứng dụng Flask của bạn bằng lệnh :
python myproject.py Truy cập domain  hoặc địa chỉ IP của  server  của bạn, sau đó là số cổng được chỉ định trong  kết quả  của terminal  (rất có thể :5000 ) trong  trình duyệt web . Bạn sẽ thấy  thông tin như  thế này: 
Khi bạn hoàn tất, nhấn CTRL-C trong cửa sổ terminal của bạn một vài lần để dừng server phát triển Flask.
Tạo điểm vào WSGI
Tiếp theo, ta sẽ tạo một file sẽ đóng role là điểm nhập cho ứng dụng của ta . Điều này sẽ cho server uWSGI của ta biết cách tương tác với ứng dụng.
  Ta  sẽ gọi file  là wsgi.py :
nano ~/myproject/wsgi.py Tệp cực kỳ đơn giản, ta có thể chỉ cần nhập version Flask từ ứng dụng của bạn và sau đó chạy nó:
from myproject import application  if __name__ == "__main__":     application.run() Lưu file khi bạn hoàn tất.
Cấu hình uWSGI
Đơn của ta bây giờ đã được viết và điểm vào của ta đã được cài đặt . Bây giờ ta có thể chuyển sang uWSGI.
Đang kiểm tra phục vụ uWSGI
Điều đầu tiên ta sẽ làm là kiểm tra đảm bảo rằng uWSGI có thể phục vụ ứng dụng của ta .
  Ta  có thể làm điều này bằng cách chỉ cần chuyển cho nó tên của điểm vào của  ta .  Ta  cũng sẽ chỉ định socket để nó sẽ được khởi động trên giao diện có sẵn công khai và giao thức để nó sẽ sử dụng HTTP thay vì giao thức binary  uwsgi :
uwsgi --socket 0.0.0.0:8000 --protocol=http -w wsgi Nếu bạn truy cập vào domain  hoặc địa chỉ IP của  server  với :8000 nối vào cuối trong trình duyệt web  của bạn , bạn sẽ thấy một trang giống như sau: 
Khi bạn đã xác nhận nó hoạt động bình thường, hãy nhấn CTRL-C trong cửa sổ dòng lệnh của bạn.
Bây giờ ta đã hoàn tất với môi trường ảo của bạn , vì vậy ta có thể hủy kích hoạt nó:
deactivate Mọi hoạt động bây giờ sẽ được thực hiện với môi trường Python của hệ thống.
Tạo file cấu hình uWSGI
Ta đã kiểm tra rằng uWSGI có thể phục vụ ứng dụng của ta , nhưng ta muốn một thứ gì đó mạnh mẽ hơn để sử dụng lâu dài. Ta có thể tạo file cấu hình uWSGI với các tùy chọn mà ta muốn.
 Hãy đặt nó trong folder  dự án của  ta  và gọi nó là myproject.ini :
nano ~/myproject/myproject.ini Bên trong,  ta  sẽ bắt đầu với tiêu đề [uwsgi] để uWSGI biết để áp dụng các cài đặt.  Ta  sẽ chỉ định module  bằng cách tham chiếu đến file  wsgi.py của  ta , trừ phần mở rộng:
[uwsgi] module = wsgi Tiếp theo, ta sẽ yêu cầu uWSGI khởi động ở chế độ chính và tạo ra năm quy trình công nhân để phục vụ các yêu cầu thực tế:
[uwsgi] module = wsgi  master = true processes = 5 Khi  ta  thử nghiệm,  ta  đã để lộ uWSGI trên một cổng mạng. Tuy nhiên,  ta  sẽ sử dụng Nginx để xử lý các kết nối client  thực tế, sau đó sẽ chuyển các yêu cầu đến uWSGI. Vì các thành phần này đang hoạt động trên cùng một máy tính nên  socket  Unix được ưu tiên hơn vì nó an toàn hơn và nhanh hơn.  Ta  sẽ gọi socket myproject.sock và đặt nó vào folder  này.
Ta cũng sẽ phải thay đổi các quyền trên socket. Sau này, ta sẽ cấp cho group Nginx quyền sở hữu quy trình uWSGI, vì vậy ta cần đảm bảo chủ sở hữu group của socket có thể đọc thông tin từ nó và ghi vào nó. Ta cũng sẽ dọn dẹp socket khi quá trình dừng lại bằng cách thêm tùy chọn "chân không":
[uwsgi] module = wsgi  master = true processes = 5  socket = myproject.sock chmod-socket = 660 vacuum = true Điều cuối cùng  ta  cần làm là đặt tùy chọn die-on-term . Điều này là cần thiết vì hệ thống Upstart init và uWSGI có các ý tưởng khác nhau về ý nghĩa của các tín hiệu quy trình khác nhau. Cài đặt này sẽ căn chỉnh hai thành phần hệ thống, thực hiện hành vi mong đợi:
[uwsgi] module = wsgi  master = true processes = 5  socket = myproject.sock chmod-socket = 660 vacuum = true  die-on-term = true Bạn có thể nhận thấy rằng  ta  đã không chỉ định một giao thức như  ta  đã làm từ dòng lệnh. Đó là vì theo mặc định, uWSGI nói bằng giao thức uwsgi , một giao thức binary  nhanh được thiết kế để giao tiếp với các  server  khác. Nginx có thể nói giao thức này một cách tự nhiên, vì vậy tốt hơn là sử dụng nó hơn là buộc giao tiếp bằng HTTP.
Khi bạn hoàn tất, hãy lưu file .
Tạo file đơn vị hệ thống
Phần tiếp theo ta cần quan tâm là file đơn vị dịch vụ Systemd. Tạo file đơn vị Systemd sẽ cho phép hệ thống init của CentOS tự động khởi động uWSGI và phục vụ ứng dụng Flask của ta khi nào server khởi động.
 Tạo một file  đơn vị kết thúc bằng .service trong folder  /etc/systemd/system để bắt đầu:
sudo nano /etc/systemd/system/myproject.service Bên trong,  ta  sẽ bắt đầu với phần [Unit] , được sử dụng để chỉ định metadata  và phần phụ thuộc.  Ta  sẽ đặt mô tả về dịch vụ  của bạn  ở đây và yêu cầu hệ thống init chỉ bắt đầu điều này sau khi đã đạt được mục tiêu mạng:
[Unit] Description=uWSGI instance to serve myproject After=network.target Tiếp theo,  ta  sẽ mở phần [Service] .  Ta  sẽ chỉ định  user  và  group  mà  ta  muốn quá trình chạy.  Ta  sẽ cấp cho account   regular user  quyền sở hữu quy trình vì nó sở hữu tất cả các file  có liên quan.  Ta  sẽ cấp quyền sở hữu  group   user  Nginx để nó có thể giao tiếp dễ dàng với các quy trình uWSGI.
 Sau đó,  ta  sẽ vạch ra folder  làm việc và đặt biến môi trường PATH để hệ thống init biết vị trí của các file  thực thi cho quá trình của  ta  (trong môi trường ảo của  ta ). Sau đó,  ta  sẽ chỉ định lệnh để bắt đầu dịch vụ. Systemd yêu cầu  ta  cung cấp đường dẫn đầy đủ đến file  thực thi uWSGI, được cài đặt trong môi trường ảo của  ta .  Ta  sẽ chuyển tên của file  cấu hình .ini mà  ta  đã tạo trong folder  dự án của  ta :
[Unit] Description=uWSGI instance to serve myproject After=network.target  [Service] User=user Group=nginx WorkingDirectory=/home/user/myproject Environment="PATH=/home/user/myproject/myprojectenv/bin" ExecStart=/home/user/myproject/myprojectenv/bin/uwsgi --ini myproject.ini Cuối cùng,  ta  sẽ thêm phần [Install] . Điều này sẽ cho Systemd biết những gì để liên kết dịch vụ này nếu  ta  cho phép nó  khởi động khi server khởi động .  Ta  muốn dịch vụ này bắt đầu khi hệ thống nhiều  regular user  được  cài đặt  và chạy:
[Unit] Description=uWSGI instance to serve myproject After=network.target  [Service] User=user Group=nginx WorkingDirectory=/home/user/myproject Environment="PATH=/home/user/myproject/myprojectenv/bin" ExecStart=/home/user/myproject/myprojectenv/bin/uwsgi --ini myproject.ini  [Install] WantedBy=multi-user.target Như vậy, file dịch vụ Systemd của ta đã hoàn tất. Lưu và đóng nó ngay bây giờ.
Bây giờ ta có thể bắt đầu dịch vụ uWSGI mà ta đã tạo và kích hoạt nó để nó bắt đầu khi server khởi động :
sudo systemctl start myproject sudo systemctl enable myproject Cấu hình Nginx cho các yêu cầu proxy
  Server  ứng dụng uWSGI của  ta  bây giờ sẽ hoạt động và đang chờ các yêu cầu trên file  socket trong folder  dự án.  Ta  cần  cấu hình  Nginx để chuyển các yêu cầu web đến socket đó bằng giao thức uwsgi .
Bắt đầu bằng cách mở file cấu hình mặc định của Nginx:
sudo nano /etc/nginx/nginx.conf Mở khối  server  ngay phía trên khối server {} khác đã có trong file :
http {     . . .      include /etc/nginx/conf.d/*.conf;      server {     }      server {         listen 80 default_server;          . . . Ta sẽ đặt tất cả cấu hình cho ứng dụng Flask của ta bên trong khối mới này. Ta sẽ bắt đầu bằng cách chỉ định rằng khối này sẽ lắng nghe trên cổng mặc định 80 và nó sẽ phản hồi với domain hoặc địa chỉ IP của server của ta :
server {     listen 80;     server_name server_domain_or_IP; } Điều duy nhất khác mà  ta  cần thêm là một khối vị trí phù hợp với mọi yêu cầu. Trong khối này,  ta  sẽ bao gồm file  uwsgi_params chỉ định một số thông số uWSGI chung cần được đặt. Sau đó,  ta  sẽ chuyển các yêu cầu đến socket mà  ta  đã xác định bằng cách sử dụng chỉ thị uwsgi_pass :
server {     listen 80;     server_name server_domain_or_IP;      location / {         include uwsgi_params;         uwsgi_pass unix:/home/user/myproject/myproject.sock;     } } Đó thực sự là tất cả những gì ta cần để phục vụ ứng dụng của bạn . Lưu file khi bạn hoàn tất.
  User  nginx phải có quyền truy cập vào folder  ứng dụng của  ta  để truy cập file  socket ở đó. Theo mặc định, CentOS khóa rất hạn chế folder  chính của mỗi  user , vì vậy  ta  sẽ thêm  user  nginx vào  group   user   của bạn  để sau đó  ta  có thể mở các quyền tối thiểu cần thiết để cấp quyền truy cập.
 Bạn có thể thêm  user  nginx vào  group   user   của bạn  bằng lệnh sau. Thay thế tên  user   của bạn  cho user trong lệnh:
sudo usermod -a -G user nginx Bây giờ, ta có thể cấp quyền thực thi cho group user trên folder chính của ta . Điều này sẽ cho phép tiến trình Nginx nhập và truy cập nội dung bên trong:
chmod 710 /home/user Với các quyền được cài đặt , ta có thể kiểm tra file cấu hình Nginx của bạn để tìm lỗi cú pháp:
sudo nginx -t Nếu điều này trả về mà không chỉ ra bất kỳ vấn đề nào, ta có thể bắt đầu và kích hoạt quá trình Nginx để nó tự động bắt đầu khi server khởi động :
sudo systemctl start nginx sudo systemctl enable nginx Bây giờ, bạn có thể truy cập domain hoặc địa chỉ IP của server trong trình duyệt web và xem ứng dụng của bạn:
Kết luận
Trong hướng dẫn này, ta đã tạo một ứng dụng Flask đơn giản trong môi trường ảo Python. Ta tạo một điểm nhập WSGI để bất kỳ server ứng dụng nào hỗ trợ WSGI đều có thể giao tiếp với nó, sau đó cấu hình server ứng dụng uWSGI để cung cấp chức năng này. Sau đó, ta tạo file đơn vị dịch vụ Systemd để tự động chạy server ứng dụng khi khởi động. Ta đã tạo một khối server Nginx chuyển lưu lượng client web đến server ứng dụng, chuyển tiếp các yêu cầu bên ngoài.
Flask là một khung công tác rất đơn giản nhưng cực kỳ linh hoạt nhằm cung cấp cho các ứng dụng của bạn chức năng mà không quá hạn chế về cấu trúc và thiết kế. Bạn có thể sử dụng ngăn xếp chung được mô tả trong hướng dẫn này để phục vụ các ứng dụng flask mà bạn thiết kế.
Các tin liên quan
Cách cung cấp các ứng dụng Flask với Gunicorn và Nginx trên Ubuntu 14.042015-03-20
Cách cung cấp các ứng dụng Flask với uWSGI và Nginx trên Ubuntu 14.04
2015-03-19
Cách thiết lập Django với Postgres, Nginx và Gunicorn trên Ubuntu 14.04
2015-03-18
Cách thiết lập Django với Postgres, Nginx và Gunicorn trên CentOS 7
2015-03-18
Cách thiết lập uWSGI và Nginx để cung cấp các ứng dụng Python trên CentOS 7
2015-03-13
Cách cung cấp các ứng dụng Django với uWSGI và Nginx trên CentOS 7
2015-03-13
Cách cung cấp các ứng dụng Django với uWSGI và Nginx trên Ubuntu 14.04
2015-03-11
Cách thiết lập uWSGI và Nginx để cung cấp các ứng dụng Python trên Ubuntu 14.04
2015-03-06
Cách nhắm mục tiêu người dùng của bạn với Nginx Analytics và Thử nghiệm A / B
2015-01-26
Cách cài đặt WordPress với Nginx trên server FreeBSD 10.1
2015-01-14
 

