Cách triển khai ứng dụng PHP nâng cao bằng Ansible trên Ubuntu 14.04
Hướng dẫn này là bài thứ hai trong loạt bài về triển khai các ứng dụng PHP bằng Ansible trên Ubuntu 14.04. Hướng dẫn đầu tiên bao gồm các bước cơ bản để triển khai một ứng dụng và là điểm khởi đầu cho các bước được nêu trong hướng dẫn này.Trong hướng dẫn này, ta sẽ đề cập đến việc cài đặt SSH key để hỗ trợ các công cụ triển khai / xuất bản mã, cấu hình firewall hệ thống, cung cấp và cấu hình database (bao gồm cả password !) Và cài đặt bộ lập lịch tác vụ (crons) và các trình duyệt hàng đợi. Mục tiêu ở cuối hướng dẫn này là để bạn có một server ứng dụng PHP hoạt động hoàn toàn với cấu hình nâng cao nói trên.
Giống như hướng dẫn trước, ta sẽ sử dụng framework Laravel làm ứng dụng PHP mẫu của ta . Tuy nhiên, có thể dễ dàng sửa đổi các hướng dẫn này để hỗ trợ các khung và ứng dụng khác nếu bạn đã có.
Yêu cầu
Hướng dẫn này tiếp nối trực tiếp từ phần cuối của hướng dẫn đầu tiên trong loạt bài và tất cả cấu hình và file được tạo cho hướng dẫn đó là bắt buộc. Nếu bạn chưa hoàn thành hướng dẫn đó, vui lòng thực hiện trước khi tiếp tục với hướng dẫn này.
Bước 1 - Chuyển Kho ứng dụng
Trong bước này, ta sẽ cập nhật repository Git thành repository ví dụ tùy chỉnh một chút.
Vì cài đặt Laravel mặc định không yêu cầu các tính năng nâng cao mà ta sẽ cài đặt trong hướng dẫn này, ta sẽ chuyển repository hiện có từ repository tiêu chuẩn sang repository mẫu với một số mã gỡ lỗi được thêm vào, chỉ để hiển thị khi mọi thứ đang hoạt động. . Kho lưu trữ ta sẽ sử dụng được đặt tại https://github.com/do-community/do-ansible-adv-php
.
Nếu bạn chưa làm như vậy, hãy thay đổi folder thành ansible-php
từ hướng dẫn trước.
- cd ~/ansible-php/
Mở playbook hiện có của ta để chỉnh sửa.
- nano php.yml
Tìm và cập nhật tác vụ “Sao chép repository git”, vì vậy nó trông giống như thế này.
- name: Clone git repository git: > dest=/var/www/laravel repo=https://github.com/do-community/do-ansible-adv-php update=yes version=example sudo: yes sudo_user: www-data register: cloned
Lưu và chạy playbook.
- ansible-playbook php.yml --ask-sudo-pass
Khi nó chạy xong, hãy truy cập server của bạn trong trình duyệt web (tức là http:// your_server_ip /
). Bạn sẽ thấy một thông báo cho biết “không thể tìm thấy trình điều khiển” .
Điều này nghĩa là ta đã swap thành công repository mặc định cho repository ví dụ của ta , nhưng ứng dụng không thể kết nối với database . Đây là những gì ta mong đợi sẽ thấy ở đây và ta sẽ cài đặt và cài đặt database sau trong hướng dẫn.
Bước 2 - Cài đặt SSH key để triển khai
Trong bước này, ta sẽ cài đặt các SSH key được dùng cho các tập lệnh triển khai mã ứng dụng.
Mặc dù Ansible rất tuyệt vời để duy trì cấu hình và cài đặt server và ứng dụng, nhưng các công cụ như Envoy và Rocketeer thường được sử dụng để đẩy các thay đổi mã lên server của bạn và chạy các lệnh ứng dụng từ xa. Hầu hết các công cụ này đều yêu cầu kết nối SSH để có thể truy cập trực tiếp vào cài đặt ứng dụng. Trong trường hợp của ta , điều này nghĩa là ta cần cấu hình SSH key cho user www-data
.
Ta cần file public key cho user mà bạn muốn đẩy mã của bạn . Tệp này thường được tìm thấy tại ~/.ssh/id_rsa.pub
. Sao chép file đó vào folder ansible-php
.
- cp ~/.ssh/id_rsa.pub ~/ansible-php/deploykey.pub
Ta có thể sử dụng Ansible authorized_key
module để cài đặt public key của ta trong vòng /var/www/.ssh/authorized_keys
, mà sẽ cho phép các công cụ triển khai để kết nối và truy cập ứng dụng của ta . Cấu hình chỉ cần biết vị trí của khóa, sử dụng tra cứu và user khóa cần được cài đặt ( www-data
trong trường hợp của ta ).
- name: Copy public key into /var/www authorized_key: user=www-data key="{{ lookup('file', 'deploykey.pub') }}"
Ta cũng cần cài đặt shell của user www-data
, để ta có thể đăng nhập. Nếu không, SSH sẽ cho phép kết nối, nhưng sẽ không có shell nào được hiển thị cho user . Điều này có thể được thực hiện bằng cách sử user
module user
và cài đặt shell thành /bin/bash
(hoặc shell bạn muốn ).
- name: Set www-data user shell user: name=www-data shell=/bin/bash
Bây giờ, hãy mở playbook để chỉnh sửa và thêm vào các nhiệm vụ mới.
- nano php.yml
Thêm các việc trên vào playbook php.yml
của bạn; phần cuối của file phải trùng với phần sau. Các phần bổ sung được đánh dấu màu đỏ.
. . . - name: Configure nginx template: src=nginx.conf dest=/etc/nginx/sites-available/default notify: - restart php5-fpm - restart nginx - name: Copy public key into /var/www authorized_key: user=www-data key="{{ lookup('file', 'deploykey.pub') }}" - name: Set www-data user shell user: name=www-data shell=/bin/bash handlers: . . .
Lưu và chạy playbook.
- ansible-playbook php.yml --ask-sudo-pass
Khi Ansible kết thúc, bạn có thể SSH bằng cách sử dụng user www-data
.
- ssh www-data@your_server_ip
Nếu bạn đăng nhập thành công, nó đang hoạt động! Đến đây bạn có thể đăng xuất bằng lệnh logout
hoặc nhấn CTRL + D.
Ta sẽ không cần sử dụng kết nối đó cho bất kỳ bước nào khác trong hướng dẫn này, nhưng nó sẽ hữu ích nếu bạn đang cài đặt các công cụ khác, như đã đề cập ở trên hoặc để gỡ lỗi chung và bảo trì ứng dụng theo yêu cầu.
Bước 3 - Cấu hình firewall
Trong bước này, ta sẽ cấu hình firewall trên server để chỉ cho phép các kết nối HTTP và SSH.
Ubuntu 14.04 đi kèm với UFW ( Tường lửa không phức tạp ) được cài đặt theo mặc định và Ansible hỗ trợ nó với module ufw
. Nó có một số tính năng mạnh mẽ và đã được thiết kế để đơn giản nhất có thể. Nó hoàn toàn phù hợp cho các web server độc lập chỉ cần mở một vài cổng. Trong trường hợp của ta , ta muốn mở cổng 80 (HTTP) và cổng 22 (SSH). Bạn cũng có thể cần cổng 443 cho HTTPS.
Mô-đun ufw
có một số tùy chọn khác nhau thực hiện các việc khác nhau. Các nhiệm vụ khác nhau mà ta cần thực hiện là:
Bật UFW và từ chối tất cả lưu lượng đến theo mặc định.
Mở cổng SSH nhưng giới hạn tốc độ để ngăn chặn các cuộc tấn công bạo lực.
Mở cổng HTTP.
Điều này có thể được thực hiện tương ứng với các việc sau.
- name: Enable UFW ufw: direction=incoming policy=deny state=enabled - name: UFW limit SSH ufw: rule=limit port=ssh - name: UFW open HTTP ufw: rule=allow port=http
Như trước đây, hãy mở file php.yml
để chỉnh sửa.
- nano php.yml
Thêm các nhiệm vụ trên vào playbook; phần cuối của file phải trùng với phần sau.
. . . - name: Copy public key into /var/www authorized_key: user=www-data key="{{ lookup('file', 'deploykey.pub') }}" - name: Set www-data user shell user: name=www-data shell=/bin/bash - name: Enable UFW ufw: direction=incoming policy=deny state=enabled - name: UFW limit SSH ufw: rule=limit port=ssh - name: UFW open HTTP ufw: rule=allow port=http handlers: . . .
Lưu và chạy playbook.
- ansible-playbook php.yml --ask-sudo-pass
Khi điều đó đã hoàn tất thành công, bạn vẫn có thể kết nối qua SSH (sử dụng Ansible) hoặc HTTP với server của bạn ; các cổng khác bây giờ sẽ bị chặn.
Bạn có thể xác minh trạng thái của UFW bất kỳ lúc nào bằng cách chạy lệnh sau:
- ansible php --sudo --ask-sudo-pass -m shell -a "ufw status verbose"
Chia nhỏ lệnh Ansible ở trên:
-
ansible
: Chạy một tác vụ Ansible thô mà không cần sách vở. -
php
: Chạy tác vụ với các server trong group này. -
--sudo
: Chạy lệnh dưới dạngsudo
. -
--ask-sudo-pass
: Nhắc nhập passwordsudo
. -
-m shell
: Chạy moduleshell
. -
-a "ufw status verbose"
: Các tùy chọn được chuyển vào module . Bởi vì nó là một lệnhshell
, ta sẽ chuyển thẳng lệnh raw (tức làufw status verbose
) vào thẳng mà không có bất kỳ tùy chọnkey=value
.
Nó sẽ trả về thông tin như thế này.
your_server_ip | success | rc=0 >> Status: active Logging: on (low) Default: deny (incoming), allow (outgoing), disabled (routed) New profiles: skip To Action From -- ------ ---- 22 LIMIT IN Anywhere 80 ALLOW IN Anywhere 22 (v6) LIMIT IN Anywhere (v6) 80 (v6) ALLOW IN Anywhere (v6)
Bước 4 - Cài đặt các gói MySQL
Trong bước này, ta sẽ cài đặt một database MySQL để ứng dụng của ta sử dụng.
Bước đầu tiên là đảm bảo MySQL được cài đặt trên server của ta bằng cách chỉ cần thêm các gói bắt buộc vào tác vụ gói cài đặt ở đầu playbook của ta . Các gói ta cần là mysql-server
, mysql-client
và php5-mysql
. Ta cũng cần python-mysqldb
để Ansible có thể giao tiếp với MySQL.
Khi ta thêm các gói, ta cần khởi động lại nginx
và php5-fpm
đảm bảo các gói mới có thể được ứng dụng sử dụng. Trong trường hợp này, ta cần MySQL có sẵn cho PHP, để nó có thể kết nối với database .
Một trong những điều tuyệt vời về Ansible là bạn có thể sửa đổi bất kỳ nhiệm vụ nào và chạy lại playbook của bạn và các thay đổi sẽ được áp dụng. Điều này bao gồm danh sách các tùy chọn, giống như ta có với tác vụ apt
.
Như trước đây, hãy mở file php.yml
để chỉnh sửa.
- nano php.yml
Tìm tác vụ install packages
và cập nhật nó để bao gồm các gói ở trên:
. . . - name: install packages apt: name={{ item }} update_cache=yes state=latest with_items: - git - mcrypt - nginx - php5-cli - php5-curl - php5-fpm - php5-intl - php5-json - php5-mcrypt - php5-sqlite - sqlite3 - mysql-server - mysql-client - php5-mysql - python-mysqldb notify: - restart php5-fpm - restart nginx . . .
Lưu và chạy playbook:
- ansible-playbook php.yml --ask-sudo-pass
Bước 5 - Cài đặt database MySQL
Trong bước này, ta sẽ tạo một database MySQL cho ứng dụng của ta .
Ansible có thể nói chuyện trực tiếp với MySQL bằng cách sử dụng các module mysql_
-prefaced (ví dụ: mysql_db
, mysql_user
). Mô-đun mysql_db
cung cấp một cách đảm bảo một database có tên cụ thể tồn tại, vì vậy ta có thể sử dụng một tác vụ như thế này để tạo database .
- name: Create MySQL DB mysql_db: name=laravel state=present
Ta cũng cần một account user hợp lệ với một password đã biết để cho phép ứng dụng của ta kết nối với database . Một cách tiếp cận là tạo một password local và lưu nó trong sách phát Ansible của ta , nhưng điều đó không an toàn và có một cách tốt hơn.
Ta sẽ tạo password bằng Ansible trên chính server và sử dụng trực tiếp khi cần. Để tạo password , ta sẽ sử dụng công cụ dòng lệnh makepasswd
và yêu cầu password 32 ký tự. Bởi vì makepasswd
không phải là mặc định trên Ubuntu, ta cũng cần thêm nó vào danh sách gói.
Ta cũng sẽ yêu cầu Ansible nhớ kết quả của lệnh (tức là password ), vì vậy ta có thể sử dụng nó sau này trong playbook của bạn . Tuy nhiên, vì Ansible không biết liệu nó đã chạy lệnh shell
, nên ta cũng sẽ tạo một file khi chạy lệnh đó. Ansible sẽ kiểm tra xem file có tồn tại hay không, và nếu có, nó sẽ cho rằng lệnh đã được chạy và sẽ không chạy lại.
Nhiệm vụ trông như thế này:
- name: Generate DB password shell: makepasswd --chars=32 args: creates: /var/www/laravel/.dbpw register: dbpwd
Tiếp theo, ta cần tạo user database MySQL thực với password mà ta đã chỉ định. Điều này được thực hiện bằng cách sử dụng module mysql_user
và ta có thể sử dụng tùy chọn stdout
trên biến mà ta đã xác định trong tác vụ tạo password để nhận kết quả thô của lệnh shell, như sau: dbpwd.stdout
.
Lệnh mysql_user
chấp nhận tên của user và các quyền cần thiết. Trong trường hợp của ta , ta muốn tạo một user có tên laravel
và cung cấp cho họ đầy đủ các quyền trên bảng laravel
. Ta cũng cần yêu cầu tác vụ chỉ chạy khi biến dbpwd
đã thay đổi , điều này sẽ chỉ thực hiện khi tác vụ tạo password được chạy.
Nhiệm vụ sẽ giống như sau:
- name: Create MySQL User mysql_user: name=laravel password={{ dbpwd.stdout }} priv=laravel.*:ALL state=present when: dbpwd.changed
Kết hợp điều này với nhau, hãy mở file php.yml
để chỉnh sửa, vì vậy ta có thể thêm các việc trên.
- nano php.yml
Trước tiên, hãy tìm tác vụ install packages
và cập nhật nó để bao gồm gói makepasswd
.
. . . - name: install packages apt: name={{ item }} update_cache=yes state=latest with_items: - git - mcrypt - nginx - php5-cli - php5-curl - php5-fpm - php5-intl - php5-json - php5-mcrypt - php5-sqlite - sqlite3 - mysql-server - mysql-client - php5-mysql - python-mysqldb - makepasswd notify: - restart php5-fpm - restart nginx . . .
Sau đó, thêm các việc tạo password , tạo database MySQL và tạo user ở dưới cùng.
. . . - name: UFW limit SSH ufw: rule=limit port=ssh - name: UFW open HTTP ufw: rule=allow port=http - name: Create MySQL DB mysql_db: name=laravel state=present - name: Generate DB password shell: makepasswd --chars=32 args: creates: /var/www/laravel/.dbpw register: dbpwd - name: Create MySQL User mysql_user: name=laravel password={{ dbpwd.stdout }} priv=laravel.*:ALL state=present when: dbpwd.changed handlers: . . .
Chưa chạy playbook! Bạn có thể nhận thấy rằng mặc dù ta đã tạo database và user MySQL, nhưng ta chưa thực hiện bất kỳ điều gì với password . Ta sẽ đề cập đến vấn đề đó trong bước tiếp theo. Khi sử dụng các việc shell
trong Ansible, điều quan trọng là phải nhớ hoàn thành toàn bộ quy trình làm việc liên quan đến kết quả / kết quả của tác vụ trước khi chạy nó để tránh phải đăng nhập và đặt lại trạng thái theo cách thủ công.
Bước 6 - Cấu hình ứng dụng PHP cho database
Trong bước này, ta sẽ lưu password database MySQL vào file .env
cho ứng dụng.
Giống như ta đã làm trong hướng dẫn trước, ta sẽ cập nhật file .env
để bao gồm thông tin đăng nhập database mới được tạo của ta . Theo mặc định, file .env của .env
chứa các dòng sau:
DB_HOST=localhost DB_DATABASE=homestead DB_USERNAME=homestead DB_PASSWORD=secret
Ta có thể giữ nguyên dòng DB_HOST
, nhưng sẽ cập nhật ba dòng còn lại bằng cách sử dụng các việc sau, rất giống với các việc ta đã sử dụng trong hướng dẫn trước để đặt APP_ENV
và APP_DEBUG
.
- name: set DB_DATABASE lineinfile: dest=/var/www/laravel/.env regexp='^DB_DATABASE=' line=DB_DATABASE=laravel - name: set DB_USERNAME lineinfile: dest=/var/www/laravel/.env regexp='^DB_USERNAME=' line=DB_USERNAME=laravel - name: set DB_PASSWORD lineinfile: dest=/var/www/laravel/.env regexp='^DB_PASSWORD=' line=DB_PASSWORD={{ dbpwd.stdout }} when: dbpwd.changed
Như ta đã làm với tác vụ tạo user MySQL, ta đã sử dụng biến password được tạo ( dbpwd.stdout
) để điền password vào file và đã thêm tùy chọn when
đảm bảo nó chỉ chạy khi dbpwd
đã thay đổi.
Bây giờ, vì file .env
đã tồn tại trước khi ta thêm tác vụ tạo password của bạn , ta cần lưu password vào một file khác. Tác vụ tạo có thể tìm kiếm sự tồn tại của file đó (mà ta đã cài đặt trong tác vụ). Ta cũng sẽ sử dụng các tùy chọn sudo
và sudo_user
để yêu cầu Ansible tạo file với quyền user www-data
.
- name: Save dbpw file lineinfile: dest=/var/www/laravel/.dbpw line="{{ dbpwd.stdout }}" create=yes state=present sudo: yes sudo_user: www-data when: dbpwd.changed
Mở file php.yml
để chỉnh sửa.
- nano php.yml
Thêm các nhiệm vụ trên vào playbook; phần cuối của file phải trùng với phần sau.
. . . - name: Create MySQL User mysql_user: name=laravel password={{ dbpwd.stdout }} priv=laravel.*:ALL state=present when: dbpwd.changed - name: set DB_DATABASE lineinfile: dest=/var/www/laravel/.env regexp='^DB_DATABASE=' line=DB_DATABASE=laravel - name: set DB_USERNAME lineinfile: dest=/var/www/laravel/.env regexp='^DB_USERNAME=' line=DB_USERNAME=laravel - name: set DB_PASSWORD lineinfile: dest=/var/www/laravel/.env regexp='^DB_PASSWORD=' line=DB_PASSWORD={{ dbpwd.stdout }} when: dbpwd.changed - name: Save dbpw file lineinfile: dest=/var/www/laravel/.dbpw line="{{ dbpwd.stdout }}" create=yes state=present sudo: yes sudo_user: www-data when: dbpwd.changed handlers: . . .
, đừng chạy playbook! Ta còn một bước nữa để hoàn thành trước khi có thể chạy playbook.
Bước 7 - Di chuyển database
Trong bước này, ta sẽ chạy di chuyển database để cài đặt các bảng database .
Trong Laravel, điều này được thực hiện bằng cách chạy lệnh migrate
(tức là php artisan migrate --force
Artian php artisan migrate --force
) trong folder Laravel. Lưu ý ta đã thêm cờ --force
vì môi trường production
yêu cầu nó.
Nhiệm vụ Ansible để thực hiện điều này trông như thế này.
- name: Run artisan migrate shell: php /var/www/laravel/artisan migrate --force sudo: yes sudo_user: www-data when: dbpwd.changed
Bây giờ đã đến lúc cập nhật playbook của ta . Mở file php.yml
để chỉnh sửa.
- nano php.yml
Thêm các nhiệm vụ trên vào playbook; phần cuối của file phải trùng với phần sau.
. . . - name: Save dbpw file lineinfile: dest=/var/www/laravel/.dbpw line="{{ dbpwd.stdout }}" create=yes state=present sudo: yes sudo_user: www-data when: dbpwd.changed - name: Run artisan migrate shell: php /var/www/laravel/artisan migrate --force sudo: yes sudo_user: www-data when: dbpwd.changed handlers: . . .
Cuối cùng, ta có thể lưu và chạy playbook.
- ansible-playbook php.yml --ask-sudo-pass
Khi quá trình thực thi hoàn tất, hãy làm mới trang trong trình duyệt của bạn và bạn sẽ thấy một thông báo cho biết:
Queue: NO Cron: NO
Điều này nghĩa là database được cài đặt chính xác và hoạt động như mong đợi, nhưng ta vẫn chưa cài đặt các việc cron hoặc daemon hàng đợi.
Bước 8 - Cấu hình cron Tasks
Trong bước này, ta sẽ cài đặt bất kỳ tác vụ cron nào cần được cấu hình.
Tác vụ Cron là các lệnh chạy theo lịch trình đã định và được dùng để thực hiện bất kỳ tác vụ nào cho ứng dụng của bạn, chẳng hạn như thực hiện các việc bảo trì hoặc gửi cập nhật hoạt động email - về cơ bản là bất cứ điều gì cần được thực hiện định kỳ mà không cần sự can thiệp thủ công của user . Các việc Cron có thể chạy thường xuyên mỗi phút hoặc không thường xuyên khi bạn yêu cầu.
Laravel đi kèm với một lệnh Artisan được gọi là schedule:run
theo mặc định, được thiết kế để chạy mỗi phút và thực hiện các việc được lên lịch đã xác định trong ứng dụng. Điều này nghĩa là ta chỉ cần thêm một tác vụ cron duy nhất, nếu ứng dụng của ta tận dụng được tính năng này.
Ansible có một module cron
với một số tùy chọn khác nhau chuyển trực tiếp thành các tùy chọn khác nhau mà bạn có thể cấu hình thông qua cron:
-
job
: Lệnh thực thi. Bắt buộc nếu trạng thái = hiện tại. -
minute
,hour
,day
,month
vàweekday
: Phút, giờ, ngày, tháng hoặc ngày trong tuần khi công việc sẽ chạy tương ứng. -
special_time
(reboot
,yearly
,annually
,monthly
,weekly
,daily
,hourly
): Biệt hiệu đặc tả thời gian đặc biệt.
Theo mặc định, nó sẽ tạo ra một tác vụ chạy mỗi phút, đó là những gì ta muốn. Điều này nghĩa là nhiệm vụ ta muốn trông giống như sau:
- name: Laravel Scheduler cron: > job="run-one php /var/www/laravel/artisan schedule:run 1>> /dev/null 2>&1" state=present user=www-data name="php artisan schedule:run"
Lệnh run-one
là một trình trợ giúp nhỏ trong Ubuntu đảm bảo lệnh chỉ được chạy một lần. Điều này nghĩa là nếu lệnh schedule:run
trước đó vẫn đang chạy, nó sẽ không được chạy lại. Điều này rất hữu ích để tránh trường hợp một tác vụ cron bị khóa trong một vòng lặp và theo thời gian, ngày càng nhiều version của cùng một tác vụ được khởi động cho đến khi server hết tài nguyên.
Như trước đây, hãy mở file php.yml
để chỉnh sửa.
- nano php.yml
Thêm nhiệm vụ trên vào playbook; phần cuối của file phải trùng với phần sau.
. . . - name: Run artisan migrate shell: php /var/www/laravel/artisan migrate --force sudo: yes sudo_user: www-data when: dbpwd.changed - name: Laravel Scheduler cron: > job="run-one php /var/www/laravel/artisan schedule:run 1>> /dev/null 2>&1" state=present user=www-data name="php artisan schedule:run" handlers: . . .
Lưu và chạy playbook:
- ansible-playbook php.yml --ask-sudo-pass
Bây giờ, hãy làm mới trang trong trình duyệt của bạn. Trong một phút, nó sẽ cập nhật để trông như thế này.
Queue: NO Cron: YES
Điều này nghĩa là cron đang hoạt động trong nền một cách chính xác. Là một phần của ứng dụng mẫu, có một công việc cron đang chạy mỗi phút cập nhật một mục nhập trạng thái trong database để ứng dụng biết nó đang chạy.
Bước 9 - Cấu hình Daemon Hàng đợi
Giống như schedule:run
lệnh Artisan từ bước 8, Laravel cũng đi kèm với một trình làm việc hàng đợi có thể được bắt đầu bằng lệnh queue:work --daemon
Artisan. Trong bước này, ta sẽ cấu hình trình làm việc daemon hàng đợi cho Laravel.
Queue worker tương tự như cron job ở chỗ chúng chạy các việc trong nền. Sự khác biệt là ứng dụng đẩy các công việc vào hàng đợi, thông qua các hành động được thực hiện bởi user hoặc từ các việc được lập lịch thông qua một công việc cron. Các việc hàng đợi được thực thi lần lượt bởi worker và sẽ được xử lý theo yêu cầu khi chúng được tìm thấy trong hàng đợi. Tác vụ hàng đợi thường được sử dụng cho công việc cần thời gian để thực thi, chẳng hạn như gửi email hoặc thực hiện lệnh gọi API đến các dịch vụ bên ngoài.
Không giống như lệnh schedule:run
, đây không phải là lệnh cần được chạy mỗi phút. Thay vào đó, nó cần phải chạy như một daemon trong nền liên tục. Một cách phổ biến để làm điều này là sử dụng gói của bên thứ ba như supervisord , nhưng phương pháp đó đòi hỏi bạn phải hiểu cách cấu hình và quản lý hệ thống nói trên. Có một cách đơn giản hơn nhiều để thực hiện nó bằng cách sử dụng cron và lệnh run-one
.
Ta sẽ tạo một mục cron để khởi động daemon công nhân hàng đợi và sử dụng run-one
để chạy nó. Điều này nghĩa là cron sẽ bắt đầu tiến trình lần đầu tiên nó chạy và bất kỳ lần chạy cron nào tiếp theo sẽ bị run-one
bỏ qua run-one
khi worker đang chạy. Ngay sau khi worker dừng, run-one
sẽ cho phép lệnh chạy lại và queue worker sẽ bắt đầu lại. Đây là một phương pháp cực kỳ đơn giản và dễ sử dụng giúp bạn không cần phải học cách cấu hình và sử dụng một công cụ khác.
Với tất cả những điều đó, ta sẽ tạo một tác vụ cron khác để chạy queue worker của ta .
- name: Laravel Queue Worker cron: > job="run-one php /var/www/laravel/artisan queue:work --daemon --sleep=30 --delay=60 --tries=3 1>> /dev/null 2>&1" state=present user=www-data name="Laravel Queue Worker"
Như trước đây, hãy mở file php.yml
để chỉnh sửa.
- nano php.yml
Thêm nhiệm vụ trên vào playbook; phần cuối của file phải trùng với phần sau:
. . . - name: Laravel Scheduler cron: > job="run-one php /var/www/laravel/artisan schedule:run 1>> /dev/null 2>&1" state=present user=www-data name="php artisan schedule:run" - name: Laravel Queue Worker cron: > job="run-one php /var/www/laravel/artisan queue:work --daemon --sleep=30 --delay=60 --tries=3 1>> /dev/null 2>&1" state=present user=www-data name="Laravel Queue Worker" handlers: . . .
Lưu và chạy playbook:
- ansible-playbook php.yml --ask-sudo-pass
Giống như trước đây, hãy làm mới trang trong trình duyệt của bạn. Sau một phút, nó sẽ cập nhật trông như thế này:
Queue: YES Cron: YES
Điều này nghĩa là nhân viên hàng đợi đang hoạt động trong nền một cách chính xác. Công việc cron mà ta đã bắt đầu ở bước cuối cùng sẽ đẩy một công việc vào hàng đợi. Công việc này cập nhật database khi nó được chạy để cho thấy rằng nó đang hoạt động.
Bây giờ ta có một ứng dụng Laravel ví dụ hoạt động bao gồm các công việc cron đang hoạt động và các công nhân hàng đợi.
Kết luận
Hướng dẫn này bao gồm một số chủ đề nâng cao hơn khi sử dụng Ansible để triển khai các ứng dụng PHP. Tất cả các việc được sử dụng có thể dễ dàng sửa đổi để phù hợp với hầu hết các ứng dụng PHP (tùy thuộc vào yêu cầu cụ thể của chúng) và nó sẽ cung cấp cho bạn một điểm khởi đầu tốt để cài đặt playbook của bạn cho các ứng dụng của bạn.
Ta đã không sử dụng một lệnh SSH đơn lẻ như một phần của hướng dẫn này (ngoài việc kiểm tra thông tin đăng nhập của user www-data
) và mọi thứ - bao gồm cả password user MySQL - đã được cài đặt tự động. Sau khi làm theo hướng dẫn này, ứng dụng của bạn đã sẵn sàng hoạt động và hỗ trợ các công cụ để đẩy cập nhật mã.
Các tin liên quan
Cách triển khai một ứng dụng PHP cơ bản bằng Ansible trên Ubuntu 14.042015-04-14
Cách chia sẻ các phiên PHP trên nhiều server Memcached trên Ubuntu 14.04
2014-07-22
Cách sử dụng Framework PHP miễn phí béo
2014-03-06
Cách tự động hóa quy trình triển khai ứng dụng PHP bằng Capistrano trên Ubuntu 13
2014-02-26
Cách triển khai ứng dụng Kohana PHP trên VPS Debian 7 / Ubuntu 13 với Nginx và PHP-FPM
2013-12-30
Cách cài đặt và thiết lập Kohana, Khung phát triển ứng dụng web PHP
2013-12-30
Cách tùy chỉnh MediaWiki bằng tệp LocalSettings.php
2013-09-16
Bắt đầu với Yii PHP Framework - Phần 2
2013-08-12
Cách lưu trữ các phiên PHP trong Memcached trên CentOS VPS
2013-08-05
Cách sử dụng Gmail hoặc Yahoo với chức năng PHP mail ()
2013-08-02