Thứ ba, 02/06/2015 | 00:00 GMT+7

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.

Đã cập nhật nhiệm vụ Ansible
- 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ư EnvoyRocketeer 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 ).

Nhiệm vụ Ansible mới
- 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 ).

Nhiệm vụ Ansible mới
- 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 đỏ.

Đã cập nhật php.yml
. . .    - 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à:

  1. Bật UFW và từ chối tất cả lưu lượng đến theo mặc định.

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

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

Nhiệm vụ Ansible mới
- 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.

Đã cập nhật php.yml
. . .    - 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ạng sudo .
  • --ask-sudo-pass : Nhắc nhập password sudo .
  • -m shell : Chạy module shell .
  • -a "ufw status verbose" : Các tùy chọn được chuyển vào module . Bởi vì nó là một lệnh shell , 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ọn key=value .

Nó sẽ trả về thông tin như thế này.

Đầu ra trạng thái UFW
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-clientphp5-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 nginxphp5-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:

Đã cập nhật php.yml
. . .  - 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 .

Nhiệm vụ Ansible mới
- 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:

Nhiệm vụ Ansible mới
- 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:

Nhiệm vụ Ansible mới
- 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 .

Đã cập nhật php.yml
. . .  - 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.

Đã cập nhật php.yml
. . .    - 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:

Tệp .env Laravel
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_ENVAPP_DEBUG .

Nhiệm vụ Ansible mới
- 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 sudosudo_user để yêu cầu Ansible tạo file với quyền user www-data .

Nhiệm vụ Ansible mới
- 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.

Đã cập nhật php.yml
 . . .    - 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.

Nhiệm vụ Ansible mới
  - 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.

Đã cập nhật php.yml
. . .    - 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:

your_server_ip / '> http: // your_server_ip /
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 , monthweekday : 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:

Nhiệm vụ Ansible mới
- 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.

Đã cập nhật php.yml
. . .    - 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.

your_server_ip / '> http: // your_server_ip /
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 .

Nhiệm vụ Ansible mới
- 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:

Đã cập nhật php.yml
. . .    - 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:

your_server_ip / '> http: // your_server_ip /
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ã.


Tags:

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.04
2015-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