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

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

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 CentOS 7. Ta sẽ sử dụng server ứng dụng uWSGI để giao tiếp với ứng dụng có 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 phải có version server CentOS 7 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 CentOS mặc định bằng lệnh :

sudo yum 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ũng cần một trình biên dịch để xây dựng file binary thực tế. Để có được pip , ta sẽ phải sử dụng kho EPEL, nơi chứa các gói bổ sung.

Ta có thể kích hoạt kho EPEL bằng lệnh :

sudo yum install epel-release 

Sau đó, ta có thể cài đặt các gói ta cần bằng lệnh

sudo yum install python-devel python-pip gcc 

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.

Thay vì sử dụng cổng mạng, vì tất cả các thành phần đều hoạt động trên một server duy nhất, ta có thể sử dụng socket Unix. Điều này an toàn hơn và mang lại hiệu suất tốt hơn. Ổ cắm này sẽ không sử dụng HTTP mà thay vào đó sẽ triển khai giao thức uwsgi của uwsgi , đây là một giao thức binary nhanh được thiết kế để giao tiếp với các server khác. Nginx có thể ủy quyền tự nhiên bằng giao thức uwsgi , vì vậy đây là lựa chọn tốt nhất của ta .

Ta cần đặt user sẽ chạy các quy trình thành user của chính ta , vì ta sở hữu các file . Ta cũng sẽ sửa đổi các quyền và quyền sở hữu của socket vì ta sẽ cấp cho web server quyền ghi. Bản thân socket sẽ được đặt trong folder /run/uwsgi ( ta sẽ tạo folder này trong một chút) nơi cả uWSGI và Nginx đều có thể truy cập. Ta sẽ đặt tùy chọn chân không để file socket sẽ tự động được dọn dẹp khi dịch vụ bị dừng:

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

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

Tạo file đơn vị hệ thống cho 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 đơn vị Systemd.

Ta sẽ tạo file đơn vị trong folder /etc/systemd/system nơi lưu giữ file đơn vị do user tạo. Ta sẽ gọi file của ta là uwsgi.service :

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

Bắt đầu với phần [Unit] , được sử dụng để chỉ định metadata . Ta chỉ cần đặt một mô tả về dịch vụ của ta ở đây:

[Unit] Description=uWSGI Emperor service 

Tiếp theo, ta sẽ mở phần [Dịch vụ]. Ta sẽ sử dụng lệnh ExecStartPre để cài đặt các phần ta cần để chạy server của bạn . Điều này sẽ đảm bảo folder / run / uwsgi được tạo và user bình thường của ta sở hữu nó với group Nginx là chủ sở hữu group . Cả mkdir với cờ -p và lệnh chown đều trả về thành công ngay cả khi chúng đã tồn tại. Đây là những gì ta muốn.

Đối với lệnh bắt đầu thực tế, được chỉ định bởi chỉ thị ExecStart, ta sẽ trỏ đến file thực thi uwsgi. Ta sẽ yêu cầu nó chạy ở “Chế độ hoàng đế”, cho phép nó quản lý nhiều ứng dụng bằng các file mà nó tìm thấy trong / etc / uwsgi / sites. Ta cũng sẽ thêm các phần cần thiết để Systemd quản lý chính xác quy trình. Chúng được lấy từ tài liệu uWSGI ở đây :

[Unit] Description=uWSGI Emperor service  [Service] ExecStartPre=/usr/bin/bash -c 'mkdir -p /run/uwsgi; chown user:nginx /run/uwsgi' ExecStart=/usr/bin/uwsgi --emperor /etc/uwsgi/sites Restart=always KillSignal=SIGQUIT Type=notify NotifyAccess=all 

Bây giờ, tất cả những gì ta cần làm là thêm phần [Cài đặt]. Điều này cho phép ta chỉ định khi nào dịch vụ sẽ được tự động khởi động. Ta sẽ gắn dịch vụ của bạn với trạng thái hệ thống nhiều user . Khi nào hệ thống được cài đặt cho nhiều user (điều kiện hoạt động bình thường), dịch vụ của ta sẽ được kích hoạt:

[Unit] Description=uWSGI Emperor service  [Service] ExecStartPre=/usr/bin/bash -c 'mkdir -p /run/uwsgi; chown user:nginx /run/uwsgi' ExecStart=/usr/bin/uwsgi --emperor /etc/uwsgi/sites Restart=always KillSignal=SIGQUIT Type=notify NotifyAccess=all  [Install] WantedBy=multi-user.target 

Khi bạn hoàn thành việc này, hãy lưu file .

Ta sẽ không thể bắt đầu dịch vụ thành công tại thời điểm này vì nó phụ thuộc vào user nginx có sẵn. Ta sẽ phải đợi để bắt đầu dịch vụ uWSGI cho đến sau khi Nginx được cài đặt.

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 . Bạn có thể download bằng yum bằng lệnh :

sudo yum 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ẽ chỉnh sửa file cấu hình Nginx chính:

sudo nano /etc/nginx/nginx.conf 

Ứ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;     server_name             server_domain_or_IP;     root                    /usr/share/nginx/html;      include /etc/nginx/default.d/*.conf;      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;     server_name             server_domain_or_IP;     root                    /usr/share/nginx/html;      include /etc/nginx/default.d/*.conf;      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 , nhưng bên trong dấu ngoặc đóng http {} chặn http {} , hãy chặn một server {} . Ta sẽ sử dụng điều này để cấu hình kết nối SSL.

Bắt đầu với những điều cơ bản. Khối server này sẽ lắng nghe các kết nối trên cổng 443, cổng SSL mặc định. Ta sẽ đặt domain hoặc địa chỉ IP của server , giống như ta đã làm cho khối server cổng 80. Để bắt đầu cấu hình SSL thực tế, ta sẽ chỉ định rằng SSL sẽ được bật cho khối này và ta sẽ chỉ ra đường dẫn đến certificate SSL và khóa sẽ được sử dụng để mã hóa kết nối. Ta sẽ di chuyển các file đến đó trong giây lát:

http {     . . .     server {         listen 80;         . . .     }     server {         listen 443;         server_name server_domain_or_IP;          ssl on;         ssl_certificate /etc/nginx/ssl/myapp.crt;         ssl_certificate_key /etc/nginx/ssl/myapp.key;     } } 

Ta sẽ tiếp tục với một chút bản soạn sẵn SSL dùng để cài đặt các giao thức và mật mã được chấp nhận. Sau đó, ta có thể cài đặt cùng một location / {} khối mà ta đã cấu hình trong khối server cổng 80:

http {     . . .     server {         listen 80;         . . .     }     server {         listen 443;         server_name server_domain_or_IP;          ssl on;         ssl_certificate /etc/nginx/ssl/myapp.crt;         ssl_certificate_key /etc/nginx/ssl/myapp.key;          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:/run/uwsgi/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 

User nginx phải có quyền truy cập vào folder ứng dụng của ta để nó có thể trực tiếp phân phát các file tĩnh khi cần thiết. 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 để điều này hoạt động.

Thêm user nginx vào group của bạn bằng lệnh vào. Thay thế tên user của bạn cho user trong lệnh dưới đây:

sudo usermod -a -G user nginx 

Bây giờ, ta sẽ cấp cho group user của ta quyền thực thi trên folder của ta , điều này sẽ cho phép quá trình Nginx nhập và truy cập nội dung bên trong:

chmod 710 /home/user 

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à bắt đầu Nginx:

sudo service nginx start 

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ị.

Nếu mọi thứ suôn sẻ, bạn có thể kích hoạt Nginx và uWSGI để bắt đầu khi server khởi động bằng lệnh :

sudo systemctl enable nginx sudo systemctl enable uwsgi 

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 ứng dụng Python Web2py với uWSGI và Nginx trên Ubuntu 14.04
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