Thứ ba, 17/03/2015 | 00:00 GMT+7

Cách triển khai ứng dụng Python Web2py với uWSGI và Nginx trên Ubuntu 14.04

Khuôn khổ web2py là một công cụ mạnh mẽ và dễ sử dụng để nhanh chóng phát triển các ứng dụng web Python đầy đủ tính năng. Với web2py, bạn có thể dễ dàng phát triển và quản lý các ứng dụng của bạn thông qua việc sử dụng giao diện user web quản trị.

Trong hướng dẫn này, ta sẽ trình bày cách triển khai ứng dụng web2py trên Ubuntu 14.04. Ta sẽ sử dụng server ứng dụng uWSGI để giao tiếp với ứng dụng với nhiều quy trình công nhân. Trước uWSGI, ta sẽ cài đặt Nginx trong cấu hình Reverse Proxy để xử lý các kết nối client thực tế. Đây là một chiến lược triển khai mạnh mẽ hơn nhiều so với việc sử dụng web server 2py hoặc uWSGI một mình.

Yêu cầu và Mục tiêu

Để hoàn thành hướng dẫn này, bạn nên có version server Ubuntu 14.04 mới với user không phải root có quyền sudo cấu hình . Bạn có thể tìm hiểu cách cài đặt điều này bằng cách chạy qua hướng dẫn cài đặt server ban đầu của ta .

Ta sẽ download khuôn khổ web2py và thử nghiệm nó đảm bảo môi trường ứng dụng mặc định hoạt động chính xác. Sau đó, ta sẽ download và cài đặt containers ứng dụng uWSGI để làm giao diện giữa các yêu cầu và mã Python web2py. Ta sẽ cài đặt Nginx trước điều này để nó có thể xử lý các kết nối client và yêu cầu proxy tới uWSGI. Ta sẽ cấu hình từng thành phần của ta để bắt đầu khi server khởi động để giảm thiểu nhu cầu can thiệp quản trị.

Download khung web2py

Bước đầu tiên của ta sẽ là download khuôn khổ web2py thực tế. Điều này được duy trì trong repository lưu trữ git trên GitHub, vì vậy cách tốt nhất để download là sử dụng chính git .

Ta có thể download và cài đặt git từ repository mặc định của Ubuntu bằng lệnh :

sudo apt-get update sudo apt-get install git 

Khi git được cài đặt, ta có thể sao chép repository vào folder chính của user . Ta có thể đặt tên ứng dụng bất cứ điều gì ta muốn. Trong ví dụ của ta , ta đang sử dụng tên myapp để đơn giản hóa. Ta cần thêm cờ --recursive vì lớp trừu tượng database được xử lý như module con git của riêng nó:

git clone --recursive https://github.com/web2py/web2py.git ~/myapp 

Khung web2py sẽ được download một folder có tên là myapp trong folder chính của bạn.

Ta có thể kiểm tra ứng dụng mặc định bằng cách chuyển vào folder :

cd ~/myapp 

Giao diện quản trị phải được bảo mật bằng SSL, vì vậy ta có thể tạo một certificate tự ký đơn giản để kiểm tra điều này. Tạo khóa server và certificate bằng lệnh :

openssl req -x509 -new -newkey rsa:4096 -days 3652 -nodes -keyout myapp.key -out myapp.crt 

Bạn sẽ phải điền một số thông tin cho certificate mà bạn đang tạo. Phần duy nhất thực sự quan trọng trong trường hợp này là trường Common Name , trường này sẽ tham chiếu đến domain hoặc địa chỉ IP của server của bạn:

. . .  Country Name (2 letter code) [AU]:US State or Province Name (full name) [Some-State]:New York Locality Name (eg, city) []:New York City Organization Name (eg, company) [Internet Widgits Pty Ltd]:DigitalOcean Organizational Unit Name (eg, section) []: Common Name (e.g. server FQDN or YOUR name) []:server_domain_or_IP Email Address []:admin@email.com 

Khi bạn hoàn tất, khóa SSL và certificate sẽ nằm trong folder ứng dụng của bạn. Chúng sẽ được gọi là myapp .keymyapp .crt tương ứng.

Sau khi hoàn tất, ta có thể khởi động giao diện web web2py để kiểm tra. Để làm điều này, ta có thể gõ:

python web2py.py -k myapp.key -c myapp.crt -i 0.0.0.0 -p 8000 

Bạn cần chọn password cho giao diện quản trị.

Bây giờ, bạn có thể truy cập ứng dụng của bạn trong trình duyệt web bằng cách chuyển đến:

https://server_domain_or_IP:8000 

Đảm bảo rằng bạn sử dụng https thay vì http trong địa chỉ trên. Bạn sẽ được cảnh báo rằng trình duyệt của bạn không nhận dạng được certificate SSL:

cảnh báo SSL web2py

Điều này được mong đợi vì ta đã ký certificate của riêng mình. Nhấp vào liên kết “Nâng cao” hoặc bất kỳ liên kết nào khác mà trình duyệt của bạn cung cấp cho bạn và sau đó tiếp tục đến trang web theo kế hoạch. Bạn sẽ thấy giao diện web2py:

ứng dụng chào mừng web2py

Bằng cách nhấp vào nút “Giao diện quản trị” ở ngoài cùng bên phải, bạn có thể nhập password bạn đã chọn khi chạy server và truy cập trang web quản trị:

giao diện quản trị web2py

Điều này cho phép bạn truy cập vào mã thực tế đang chạy các ứng dụng của bạn, cho phép bạn chỉnh sửa và tinh chỉnh các file từ chính giao diện.

Khi bạn hoàn tất việc quan sát xung quanh, hãy nhập lại CTRL-C trong cửa sổ dòng lệnh của bạn. Ta đã thử nghiệm ứng dụng của bạn và chứng minh rằng nó có thể được truy cập trên web khi server phát triển web2py đang chạy.

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

Bây giờ ta đã có ứng dụng web2py hoạt động, ta có thể cấu hình uWSGI. uWSGI là một server ứng dụng có thể giao tiếp với các ứng dụng qua giao diện tiêu chuẩn được gọi là WSGI. Để tìm hiểu thêm về điều này, hãy đọc phần này trong hướng dẫn của ta về cách cài đặt uWSGI và Nginx trên Ubuntu 14.04.

Cài đặt uWSGI

Không giống như hướng dẫn được liên kết ở trên, trong hướng dẫn này, ta sẽ cài đặt uWSGI trên phạm vi global . Trước khi có thể cài đặt uWSGI, ta cần cài đặt pip , trình quản lý gói Python và các file phát triển Python mà uWSGI dựa vào. Ta có thể cài đặt chúng trực tiếp từ kho của Ubuntu:

sudo apt-get install python-pip python-dev 

Bây giờ ta có thể cài đặt uWSGI trên phạm vi global với pip bằng lệnh :

sudo pip install uwsgi 

Server chứa ứng dụng uWSGI giao diện với các ứng dụng Python bằng cách sử dụng đặc tả giao diện WSGI. Khuôn khổ web2py bao gồm một file được thiết kế để cung cấp giao diện này trong folder handlers của nó. Để sử dụng file , ta cần di chuyển nó ra khỏi folder và vào folder chính của dự án:

mv ~/myapp/handlers/wsgihandler.py ~/myapp 

Với trình xử lý WSGI trong folder dự án chính, ta có thể kiểm tra xem uWSGI có thể phục vụ ứng dụng hay không bằng lệnh :

uwsgi --http :8000 --chdir ~/myapp -w wsgihandler:application 

Thao tác này sẽ khởi động lại ứng dụng trên cổng 8000. Lần này, vì ta không sử dụng certificate và khóa SSL nên nó sẽ được phân phát qua HTTP thuần túy thay vì HTTPS. Bạn có thể kiểm tra lại điều này trong trình duyệt của bạn bằng giao thức http . Bạn sẽ không thể kiểm tra giao diện quản trị vì web2py vô hiệu hóa tính năng này khi không có mã hóa.

Khi bạn hoàn tất, hãy nhập CTRL-C trong cửa sổ terminal của bạn để dừng server .

Tạo file cấu hình uWSGI

Bây giờ ta biết rằng uWSGI có thể phục vụ ứng dụng, ta có thể tạo file cấu hình uWSGI với thông tin ứng dụng của ta .

Tạo một folder tại /etc/uwsgi/sites để lưu trữ các cấu hình của ta và sau đó chuyển vào folder đó:

sudo mkdir -p /etc/uwsgi/sites cd /etc/uwsgi/sites 

Ta sẽ gọi file cấu hình của ta là myapp.ini :

sudo nano myapp.ini 

Trong file cấu hình, ta cần bắt đầu bằng tiêu đề [uwsgi] trong đó tất cả các lệnh cấu hình của ta sẽ được đặt. Sau tiêu đề, ta sẽ chỉ ra đường dẫn folder của ứng dụng của ta và yêu cầu module thực thi. Đây sẽ là thông tin giống như ta đã sử dụng trên dòng lệnh trước đó. Bạn không cần phải sửa đổi dòng module :

[uwsgi] chdir = /home/user/myapp module = wsgihandler:application 

Tiếp theo, ta cần xác định rằng ta muốn uWSGI hoạt động ở chế độ chính. Ta muốn tạo ra năm quy trình công nhân:

[uwsgi] chdir = /home/user/myapp module = wsgihandler:application  master = true processes = 5 

Tiếp theo, ta cần chỉ định cách ta muốn uWSGI nhận kết nối. Trong thử nghiệm của ta đối với server uWSGI, ta đã chấp nhận các kết nối HTTP bình thường. Tuy nhiên, vì ta sẽ cấu hình Nginx làm Reverse Proxy trước uWSGI, ta có các tùy chọn khác. Nginx có thể ủy quyền bằng giao thức uwsgi , một giao thức binary nhanh do uWSGI thiết kế để giao tiếp với các server khác. Ta sẽ giao tiếp bằng cách sử dụng giao thức này, đây là giao thức mặc định nếu ta không chỉ định một giao thức khác.

Vì ta đang giao tiếp với Nginx bằng giao thức uwsgi , ta không cần cổng mạng. Thay vào đó, ta sẽ sử dụng một socket Unix, an toàn hơn và nhanh hơn. Ta sẽ đặt nó trong folder ứng dụng của ta . Ta cần sửa đổi các quyền để group có thể đọc và ghi vào socket. Trong giây lát, ta sẽ cấp cho group tiến trình Nginx quyền sở hữu socket để uWSGI và Nginx có thể giao tiếp thông qua socket:

[uwsgi] chdir = /home/user/myapp module = wsgihandler:application  master = true processes = 5  socket = /home/user/myapp/myapp.sock chmod-socket = 660 vacuum = true 

Chỉ thị vacuum ở trên sẽ dọn dẹp file socket khi quá trình uWSGI kết thúc.

Tệp cấu hình uWSGI của ta hiện đã hoàn tất. Lưu và đóng file .

Tạo file khởi động uWSGI

Ta đã tạo file cấu hình cho uWSGI, nhưng ta vẫn chưa cài đặt server ứng dụng của bạn để tự động khởi động khi server khởi động . Để triển khai chức năng này, ta có thể tạo một file Khởi động đơn giản. Ta sẽ yêu cầu nó chạy uWSGI ở “Chế độ hoàng đế”, cho phép server ứng dụng đọc bất kỳ số lượng cấu hình nào và khởi động server cho từng cấu hình.

Tạo một file trong folder /etc/init nơi quá trình Upstart tìm kiếm các file cấu hình của nó:

sudo nano /etc/init/uwsgi.conf 

Ta sẽ bắt đầu bằng cách cung cấp cho file dịch vụ của ta một mô tả và chỉ ra các cấp chạy mà ta muốn tự động khởi động nó. Các cấp độ chạy nhiều regular user là 2, 3, 4 và 5. Ta sẽ yêu cầu Khởi động lại dịch vụ khi server chuyển sang các cấp chạy khác (như trong khi tắt máy, khởi động lại hoặc chế độ một user ):

description "uWSGI application server in Emperor mode"  start on runlevel [2345] stop on runlevel [!2345] 

Tiếp theo, ta cần chỉ định user và group để chạy quy trình. Ta sẽ sử dụng account user bình thường của bạn vì nó sở hữu tất cả các file dự án của ta . Đối với group của ta , ta cần cho phép quyền sở hữu www-data group, là group mà Nginx điều hành. Điều này sẽ cho phép web server tự do giao tiếp với uWSGI vì cấu hình uWSGI của ta đã cấp cho group socket các quyền đọc và ghi.

Sau đó, ta chỉ cần chỉ định lệnh chạy để khởi động uWSGI. Ta chỉ cần sử dụng cờ --emperor và chuyển nó vào folder chứa file cấu hình của ta :

description "uWSGI application server in Emperor mode"  start on runlevel [2345] stop on runlevel [!2345]  setuid user setgid www-data  exec /usr/local/bin/uwsgi --emperor /etc/uwsgi/sites 

Thao tác này sẽ khởi động một server ứng dụng uWSGI để xử lý trang web2py của ta . Chế độ Emperor cho phép ta dễ dàng thêm các file cấu hình trong folder này cho các dự án khác. Chúng sẽ được xử lý tự động.

Bây giờ ta đã hoàn thành với tập lệnh Khởi động của ta . Lưu và đóng file . Đến đây, ta không thể khởi động dịch vụ uWSGI vì ta chưa cài đặt Nginx. Điều này nghĩa là group mà ta yêu cầu tập lệnh của ta đang chạy vẫn chưa khả dụng.

Cài đặt và cấu hình Nginx làm Reverse Proxy

Với uWSGI được cấu hình và sẵn sàng hoạt động, giờ đây ta có thể cài đặt và cấu hình Nginx làm Reverse Proxy của ta . Điều này có thể được download từ repository mặc định của Ubuntu:

sudo apt-get install nginx 

Khi Nginx được cài đặt, ta có thể tiếp tục và sửa đổi cấu hình khối server . Ta sẽ sử dụng khối server mặc định làm cơ sở, vì nó có hầu hết những gì ta cần:

sudo nano /etc/nginx/sites-available/default 

Ứng dụng web2py phát hiện xem bạn đang kết nối bằng HTTP thuần túy hay bằng mã hóa SSL. Do đó, file của ta sẽ thực sự chứa một khối server cho mỗi khối. Ta sẽ bắt đầu với khối server được cấu hình để hoạt động trên cổng 80.

Thay đổi server_name để tham chiếu đến domain hoặc địa chỉ IP nơi có thể truy cập trang web . Sau đó, ta sẽ tạo một khối location {} sẽ trùng với các yêu cầu về nội dung tĩnh. Về cơ bản, ta muốn sử dụng biểu thức chính quy để so khớp các yêu cầu kết thúc bằng /static/ với thành phần đường dẫn trước. Ta muốn ánh xạ các yêu cầu này tới folder applications trong dự án web2py của ta . Đảm bảo bạn tham chiếu folder chính và tên ứng dụng của user :

server {     listen 80 default_server;     listen [::]:80 default_server ipv6only=on;      root /usr/share/nginx/html;     index index.html index.htm;      server_name server_domain_or_IP;      location ~* /(\w+)/static/ {         root /home/user/myapp/applications/;     }      . . . 

Sau đó, ta cần điều chỉnh location / {} khối location / {} để chuyển các yêu cầu đến socket uWSGI của ta . Ta chỉ cần bao gồm file tham số uWSGI được đóng gói với Nginx và chuyển các yêu cầu đến socket mà ta đã cấu hình (trong file uWSGI .ini của ta ):

server {     listen 80 default_server;     listen [::]:80 default_server ipv6only=on;      root /usr/share/nginx/html;     index index.html index.htm;      server_name server_domain_or_IP;      location ~* /(\w+)/static/ {         root /home/user/myapp/applications/;     }      location / {         include uwsgi_params;         uwsgi_pass unix:/home/user/myapp/myapp.sock;     } } 

Đây sẽ là tất cả những gì ta cần cho khối server đầu tiên của bạn .

Ở cuối file , có một phần được comment có hầu hết các lệnh cần thiết để cung cấp nội dung với SSL. Bạn có thể xác định khối này vì nó có listen 443; như là chỉ thị đầu tiên. Bỏ ghi chú khối này để bắt đầu cấu hình nó.

Để bắt đầu, hãy thay đổi lại server_name để trùng với domain hoặc địa chỉ IP của server . Sau đó ta có thể nhảy đến ssl_certificatessl_certificate_key chỉ thị. Ta sẽ đặt certificate SSL mà ta đã tạo vào một folder tại /etc/nginx/ssl trong giây lát, vì vậy hãy chỉ định đường dẫn đến các file tại vị trí đó:

server {     listen 443;     server_name server_domain_or_IP;      root html;     index index.html index.htm;      ssl on;     ssl_certificate /etc/nginx/ssl/myapp.crt;     ssl_certificate_key /etc/nginx/ssl/myapp.key;      . . . 

Trong danh sách ssl_protocols , hãy xóa SSLv3, vì đã được phát hiện có các lỗ hổng cố hữu trong chính giao thức.

Sau đó, ta có thể chuyển đến location / {} khối và đặt cùng một thông tin ủy quyền uWSGI mà ta đã làm trong khối server cuối cùng:

server {     listen 443;     server_name server_domain_or_IP;      root html;     index index.html index.htm;      ssl on;     ssl_certificate /etc/nginx/ssl/myapp.crt;     ssl_certificate_key /etc/nginx/ssl/myapp.key;      ssl_session_timeout 5m;      #ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;     ssl_protocols TLSv1 TLSv1.1 TLSv1.2;     ssl_ciphers "HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES";     ssl_prefer_server_ciphers on;      location / {         include uwsgi_params;         uwsgi_pass unix:/home/user/myapp/myapp.sock;     } } 

Đến đây bạn sẽ có hai khối server được cấu hình trong file này. Lưu và đóng nó khi bạn hoàn thành.

Các bước cuối cùng

Tiếp theo, ta cần di chuyển certificate SSL đến folder mà ta đã chỉ định. Tạo folder trước:

sudo mkdir -p /etc/nginx/ssl 

Bây giờ, hãy di chuyển certificate và khóa bạn đã tạo vào folder đó. Nếu bạn có certificate SSL do tổ chức phát hành certificate thương mại ký, bạn có thể thay thế certificate và khóa tương ứng tại đây để tránh cảnh báo certificate SSL không tin cậy cho khách truy cập của bạn:

sudo mv ~/myapp/myapp.crt /etc/nginx/ssl sudo mv ~/myapp/myapp.key /etc/nginx/ssl 

Sửa đổi các quyền để user không phải root không thể truy cập vào folder đó:

sudo chmod 700 /etc/nginx/ssl 

Bây giờ, hãy kiểm tra file cấu hình Nginx của bạn để biết lỗi cú pháp:

sudo nginx -t 

Nếu không có lỗi cú pháp nào được báo cáo, ta có thể tiếp tục và khởi động lại Nginx:

sudo service nginx restart 

Ta cũng có thể bắt đầu dịch vụ uWSGI của bạn :

sudo service uwsgi start 

Điều cuối cùng ta cần làm là sao chép file tham số của ứng dụng để nó được đọc một cách chính xác khi phục vụ các kết nối trên cổng 443. Điều này chứa password mà ta đã cấu hình cho giao diện quản trị. Ta chỉ cần sao chép nó sang một tên mới cho biết cổng 443 thay vì cổng 8000:

cp ~/myapp/parameters_8000.py ~/myapp/parameters_443.py 

Cùng với đó, bạn có thể truy cập vào server của bạn bằng domain hoặc địa chỉ IP của server . Sử dụng https nếu bạn muốn đăng nhập vào giao diện quản trị.

Kết luận

Trong hướng dẫn này, ta đã cài đặt một dự án web2py mẫu để thực hành triển khai. Ta đã cấu hình uWSGI để hoạt động như một giao diện giữa ứng dụng của ta và các yêu cầu của khách hàng. Sau đó, ta cài đặt Nginx trước uWSGI để cho phép kết nối SSL và xử lý hiệu quả các yêu cầu của khách hàng.

Dự án web2py đơn giản hóa việc phát triển các trang web và ứng dụng web bằng cách cung cấp một giao diện web khả thi ngay từ đầu. Bằng cách tận dụng chuỗi công cụ chung được mô tả trong bài viết này, bạn có thể dễ dàng phục vụ các ứng dụng bạn tạo từ một server duy nhất.


Tags:

Các tin liên quan

Cách triển khai các ứng dụng Python Web2py với uWSGI và Nginx trên CentOS 7
2015-03-17
Cách xác thực một ứng dụng Python với Twitter bằng Tweepy trên Ubuntu 14.04
2015-02-04
Cách gửi tin nhắn dựa trên các phím định tuyến bằng thư viện RabbitMQ và Puka Python
2014-02-26
Cách đóng gói và phân phối các ứng dụng Python
2014-01-14
Cách triển khai ứng dụng web WSGI Python dựa trên kim tự tháp
2013-12-30
Cách triển khai ứng dụng WSGI Python bằng server Gunicorn HTTP đằng sau Nginx
2013-12-12
Cách triển khai ứng dụng WSGI Python bằng web server uWSGI với Nginx
2013-12-11
Cách triển khai ứng dụng WSGI Python bằng web server CherryPy đằng sau Nginx
2013-12-10
Cách sử dụng khung kim tự tháp để xây dựng ứng dụng web Python của bạn trên Ubuntu
2013-12-10
Cách thiết lập Python 2.7.6 và 3.3.3 trên CentOS 6.4
2013-12-04