CategoryDevOps

Hiểu hơn về HTTPS với ví dụ bồ câu đưa thư (Mike Nguyen)


Chúng ta đều biết mã hoá là một chủ đề rất khó hiểu. Nó ứng dụng hàng loạt các chứng minh toán học để biến thông tin từ định dang bình thường sang định dạng không tin không thể hiểu được nếu như không có phương tiện Giải mã. Nhưng trừ khi bạn thực sự phát triển một hệ thống mã hoá, nếu không thì bạn không cần thiết phải hiểu rõ phần lớn các sự phức tạp mà vẫn có thể hiểu được những gì thực sự đang diễn ra.

Mike, James và …chú trym bồ câu

Mọi hoạt động của bạn trên Internet (bạn đang đọc bài viết này, mua một món hàng trực tuyến hoặc cũng có thể là đăng một bức ảnh “sống ảo” trên Facebook) thực chất đều là gửi và nhận các thông điệp giữa máy tính của bạn và  một máy chủ nào đó.
Bạn hãy tưởng tượng những thông điệp đó được truyền tải bởi những chú chim bồ câu đưa thư, cách HTTP hoạt động cũng tương tự như vậy (thực tế HTTP nhanh hơn rất nhiều :)) )
Thay vì nói về Servers, Clients hay Hackers, chúng ta hãy cùng xem câu chuyện  về Mike, James và Faker.

Thuở sơ khai

Nếu Mike muốn gửi một tin nhắn cho James, anh ấy sẽ kẹp mẩu tin nhắn vào chân chú chim bồ câu và chim bồ câu sẽ bay tới chỗ  James. James nhận được mẩu tin nhắn, đọc nó và mọi thứ diễn ra đều suôn sẻ.
Nhưng đời không như là mơ, Faker xuất hiện, bẫy được chú chim bồ câu đang bay của Mike và giả mạo tin nhắn? James sẽ không thể biết rằng tin nhắn của Mike đã bị giả mạo bởi Faker trong quá trình chú chim vận chuyển mẩu tin nhắn.
Đây chính là cách thức hoạt động của HTTP. Rất đáng sợ phải không nào?

Mã bí mật

Nhưng Mike và James rất khôn ngoan. Họ bí mật với nhau rằng sẽ dùng một loại mật mã bí mật (Secret code) để gửi tin nhắn cho nhau. Họ sẽ thay đổi mỗi chữ trong bảng chữ cái bằng ký tự thứ 3 đứng sau nó.
Ví dụ: D → A, E → B, F → C, tin nhắn sơ khai”Ahihi do ngok” sẽ được mã hoá thành “Xefef al kdlh”
Bây giờ kể cả khi Faker bắt được bồ câu của Mike, hắn sẽ không thể hiểu được ý nghĩa của tin nhắn vì hắn không biết mật mã để giải mã tin nhắn, còn James có thể giải được mật mã bằng cách làm ngược lại với Mike ( A → D, B → E, C → F). Mật mã “Xefef al kdlh” sẽ được James giải mã thành “Ahihi do ngok”.
Ngon!
Kỹ thuật này gọi là Mã hoá Đối xứng (symmetric key cryptography), vì nếu bạn biết mã hoá tin nhắn thì bạn cũng có thể giải mã tin nhắn. Trong thực thế, chúng ta dùng những mã hoá phức tạp hơn, nhưng ý tưởng thì vẫn tương tự như thế này. Dễ hiểu phải không?

Thống nhất chìa khóa giải mã (Key)?

Mã hoá Đối xứng sẽ cực kỳ bảo mật nếu không ai ngoài người gửi và người nhận biết key đã được sử dụng, trong cách mã hoá nêu trên, key chính là số thứ tự của ký tự (trong ví dụ trên là 3), số 3 để xác định rằng chúng ta sẽ dùng bao nhiêu ký tự đứng sau chữ cái để giải mã (A → D thì D là chữ cái thứ 3 sau A) ngoài ra chúng ta có thể dùng key là 5 hoặc “69”.
Vấn đề xảy ra ở đây là nếu Mike và James không gặp mặt nhau và có thỏa thuận trước khi gửi tin nhắn qua bồ câu, họ sẽ không biết được key là gì. Nếu họ gửi key trong thư thì Faker sẽ biết được key, giải mã và sẽ lại giả mạo được tin nhắn. Đây là một ví dụ điển hình của hình thức Tấn công xen giữa (Man in the Middle Attack) và cách duy nhất để phòng tránh điều này là cả 2 đầu cùng thay đổi hệ thống mã hoá.

Bồ câu mang hộp

Để bảo mật hơn, Mike và James nghĩ ra một hệ thống tốt hơn. Khi James muốn gửi cho Mike một tin nhắn, anh ấy sẽ làm theo các bước sau:
– James gửi bồ câu không đem theo tin nhắn cho Mike.
– Mike gửi lại bồ câu với một chiếc hộp có ổ khoá đang mở (ổ khóa này có thể khóa lại mà không cần chìa khóa), nhưng Mike vẫn giữ lại chìa khoá của chiếc hộp.
– James cho tin nhắn vào hộp, đóng ổ khoá lại và gửi lại cho Mike.
– Mike nhận chiếc hộp, mở ra bằng chìa khoá và đọc tin nhắn.
Bằng cách này Faker không thể can thiệp vào bồ câu đưa thư vì hắn ta không có chìa khoá.
Tương tự quá trình trên Mike sẽ gửi lại tin nhắn cho James.
Mike và James vừa dùng một cách thức gọi là Mã hóa KHÔNG đối xứng (asymmetric key cryptography). Gọi là không đối xứng vì nếu bạn mã hoá tin nhắn (khoá chiếc hộp lại) thì bạn sẽ không thể mở nó (vì bạn méo có chìa khoá). Về mặt kỹ thuật, chiếc hộp giống như là public key và chìa khoá để mở hộp có thể coi là private key.

Faker cũng có thể giả mạo chiếc hộp mà!

Nếu chú ý, bạn sẽ nhận ra rằng chúng ta vẫn còn một vấn đề nữa. Khi James nhận được chiếc hộp, làm cách nào để James đảm bảo chiếc hộp đó là của Mike và chắc chắn rằng chiếc hộp đó không bị Faker tráo với một chiếc hộp khác của hắn?
Mike quyết định rằng anh ấy sẽ ký vào chiếc hộp, bằng cách này khi James nhận được chiếc hộp anh ấy sẽ kiểm tra xem có đúng là chữ ký của Mike hay không để xác nhận chiếc hộp. Nhưng.. như thế này đã ổn chưa nhỉ?
Chắc chắn các bạn sẽ thắc mắc: làm cách nào để James biết được đó là chữ ký của Mike khi lần đầu nhận chiếc hộp? Hay lắm! Cả Mike và James đều gặp vấn đề này, nên họ quyết định rằng, thay vì Mike ký vào chiếc hộp thì sẽ để cho Tim ký nó.
Tim là ai? Tim là một người nổi tiếng, được biết là một người đáng tin. Tim ký cho mọi người và mọi người tin tưởng rằng anh ta sẽ chỉ ký vào những chiếc hộp của những người đáng tin cậy.
Tim sẽ chỉ ký vào chiếc hộp của Mike nếu anh ta biết chắc rằng người yêu cầu ký là Mike. Vì vậy, Faker sẽ không thể giả mạo được chiếc hộp của Mike đã được ký bởi Tim vì Tim chỉ ký hộp cho những người đã xác minh danh tính của họ. Về mặt kỹ thuật đây gọi là “Chứng nhận thẩm quyền” (Certification Authority).
Khi bạn kết nối đến một Website lần đầu tiên, bạn tin chiếc hộp của nó là thật vì bạn tin Tim và Tim đảm bảo với bạn rằng chiếc hộp là thật.

Những chiếc hộp rất nặng! (Chú chim than thở…)

Mike và James giờ đây đã có một hệ thống tin cậy để truyền tin, nhưng họ nhận ra những chú chim bồ câu mang tin chậm hơn trước vì phải mang theo những chiếc hộp và chúng nặng hơn những mẩu tin bình thường rất nhiều.
Họ quyết định chỉ dùng những chiếc hộp (Mã hoá không đối xứng) để trao đổi key, sau khi đã thống nhất được key, họ tiếp tục truyền tin sử dụng mật mã đối xứng ( A → D, key là 3) (Mã hóa đối xứng).)
Bằng cách này họ đã áp dụng cả 2 loại mã hoá (Mã hoá đối xứng và Mã hoá không đối xứng). Sự tin cậy của mã hoá không đối xứng và ưu điểm tốc độ nhanh hơn của mã hoá đối xứng.
Thực tế sẽ không có những chú chim bồ câu chậm (chỉ có những chú chim bồ câu yếu.. ), nhưng mã hoá tin nhắn sử dụng mã hoá không đối xứng vẫn sẽ chậm hơn so với việc sử dụng mã hoá đối xứng, nên chúng ta sẽ chỉ dùng mã hoá không đối xứng để trao đổi các key với nhau.
Xong! Nhiêu đây cũng đã đủ để bạn hiểu hơn về “Mã hóa” và HTTPS rồi chứ 😉

Tác giả: Nguyễn Anh Thiện (Mike Nguyen) (Dịch và chỉnh sửa từ chia sẻ của Andrea Zanin)

PS: Giới thiệu với các bạn một chút, Thiện là em trai tôi.

SSH là gì? Hướng dẫn kết nối đến máy chủ Linux thông qua SSH

SSH là gì?


SSH (Secure Shell) là một giao thức mạng, giao thức này cho phép chúng ta kết nối đến một máy chủ Linux từ xa thông qua mạng Internet. Mọi dữ liệu gửi và nhận thông qua SSH đều được mã hóa giúp bảo mật thông tin an toàn hơn.
Ví dụ bạn thuê một máy chủ Linux (máy chủ này có thể là vật lý, có thể là máy ảo) để chạy website, trên thực tế máy chủ này được đặt ở một DC nào đó, để có thể toàn quyền cài đặt và điều khiển máy chủ đó bạn cần kết nối với máy chủ đó từ xa. SSH cho phép bạn làm điều đó.

Cài đặt SSH trên máy chủ

Để có thể kết nối được từ một máy tính khác đến máy chủ thông qua giao thức SSH thì máy chủ của bạn phải được cài sẵn SSH.
Nếu bạn thuê máy chủ thì thường bước này nhà cung cấp đã làm hộ bạn và sẽ cung cấp cho bạn tài khoản để kết nối luôn.
Nếu bạn tự cài máy chủ thì tham khảo các câu lệnh sau:

Với RHEL/CentOS

yum -y install openssh-server openssh-clients
chkconfig sshd on
service sshd start

Với Ubuntu/Debian

sudo apt install openssh-client
sudo apt install openssh-server

Sau khi cài đặt xong bạn có thể cấu hình SSH thông qua file config: /etc/ssh/sshd_config .
(Cụ thể cách cài đặt và cấu hình SSH trên máy chủ Linux mình sẽ chia sẻ ở một bài viết khác nhé các bạn.)

Đăng nhập vào máy chủ thông qua SSH

Để có thể đăng nhập vào máy chủ thông qua SSH, ta cần có những thông tin sau:

  • IP máy chủ, ví dụ: 10.10.8.10.
  • Tên đăng nhập người dùng (username), thường là root.
  • Mật khẩu người dùng (password).
  • Cổng giao tiếp, mặc định SSH sử dụng cổng 22.

Những thông tin này nếu bạn đi thuê máy chủ bạn sẽ được cung cấp sau khi bạn ký hợp đồng dịch vụ.

Đăng nhập từ một Linux hoặc MacOS

Nếu bạn kết nối từ một máy hệ điều hành Linux hoặc MacOS thì bạn đã được hỗ trợ sẵn SSH, vì vậy bạn chỉ cần mở Terminal và gõ câu lệnh với cú pháp sau:

ssh <username>@<IP>

Ví dụ:

ssh [email protected]

Sau đó nhập hoặc past mật khẩu và ấn Enter. Done.
Mặc định port kết nối là 22, trong trường hợp không sử dụng port mặc định thì chúng ta thêm tham số -p, ví dụ:

ssh [email protected] -p 1234

Đăng nhập từ một Windows

Nếu bạn kết nối từ một máy chạy hệ điều hành Windows thì bạn cần sử dụng một ứng dụng hỗ trợ. Ứng dụng thông dụng nhất mình biết là PuTTY. Bạn có thể truy cập putty.org  để tải ứng dụng. Cách sử dụng cũng khá đơn giản, bạn chỉ cần nhập đầy đủ thông tin và kết nối.
(Các bạn thông cảm vì mình không sử dụng Windows nên không thể hướng dẫn các bạn chi tiết được.)
Ngoài ra với giao thức SSH chúng ta có một cách khác để kết nối với máy chủ mà không cần đăng nhập, cách này thường được sử dụng để cài đặt các tác vụ tự động hóa giữa các máy chủ với nhau. Mình sẻ chia sẻ với các bạn trong một bài viết khác nhé.
 

Cron format – Định dạng và cú pháp Cron trên Linux

Trong bài viết này mình sẽ chỉ nói về định dạng và cú pháp của Cron, việc cài đặt Cron Job mình sẽ chia sẻ trong một vài viết khác.
Nói qua một chút về Cron Format. Cron Format là một định dạng thời gian để xác định tần xuất của một tác vụ nào đó của hệ thống , định dạng này được thiết kế với tiêu chí đơn giản, hiệu quả, linh hoạt. Ví dụ các tác vụ như: Backup Database, Polling SCM…
Cron Format bao gồm có 5 trường giá trị riêng biệt được phân cách nhau bởi dấu “TAB” hoặc dấu cách “Whitespace”.

<Phút> <Giờ> <Ngày_trong_tháng> <Tháng_trong_năm> <Ngày_trong_tuần>

Nếu sử dụng nnCron thì chúng ta có thể có thêm trường thứ 6 là <Năm> .
Các giá trị khả dụng:

  • Phút: 0-59
  • Giờ: 0-23
  • Ngày trong tháng: 1-31
  • Tháng trong năm: 1-12
  • Ngày trong tuần: 0-6 hoặc 1-7. Lưu ý: Chủ nhật được coi là ngày đầu tiên.
  • Năm: 1900-3000

Các cú pháp đặc biệt:

  • * : Tất cả những giá trị khả dụng.
  • M-N : 1 khoảng giá trị. Ví dụ: 5-8 .
  • A,K,Z : tập hợp các giá trị. Ví dụ: 1,5,6,8,30 .

Hãy xem xét các ví dụ sau để hiểu rõ hơn:
* * * * * : Mỗi phút.
0 0 * * * : Vào 0 giờ 0 phút mỗi ngày.
0 2-4 * * * : Vào 2 giờ, 3 giờ và 4 giờ mỗi ngày.
* * * 2,4,6,8,10,12 * * : Mỗi phút trong tháng 2, 4, 6, 8, 10, 12.
0 0 1 * * * : 0 giờ 0 phút vào các ngày đầu tiên của tháng.
Ngoài ra các bạn có thể tham khảo 1 số tool có thể giúp mình làm việc dễ dàng hơn với Cron như: crontab-generator.org , crontab.guru ..
Mình sẽ chia sẻ cách cài đặt và cấu hình Cron trên hệ thống trong một bài viết khác nhé!

CI Jenkins – Cài đặt Jenkins trên máy ảo Laravel Homestead

Bài viết này hướng dẫn các bạn cài đặt Jenkins trên máy ảo Laravel Homestead. Việc cấu hình và sử dụng Jenkins mình sẽ chia sẻ trong một bài viết khác.
Ngoài ra nếu bạn chưa biết cài đặt Laravel Homestead, hãy tham khảo bài viết này: Laravel Homestead – Môi trường phát triển chuẩn cho Laravel.
Các bước hướng dẫn dưới đây là các bước sau khi các bạn chạy câu lệnh vagrant ssh  để kết nối với máy ảo.

Bước 1: Cài đặt Java

Các bạn tham khảo bài viết này nhé: Hướng dẫn cài đặt Java JDK trên Ubuntu.

Bước 2: Cài đặt Jenkins

Thêm repository key vào hệ thống: wget -q -O – https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add – .
Mở file sources.list  với câu lệnh sudo vi /etc/apt/sources.list , thêm vào cuối file deb https://pkg.jenkins.io/debian-stable binary/ .
Cập nhật package: sudo apt-get update .
Cài đặt Jenkins: sudo apt-get install jenkins .
Mặc định sau khi cài đặt Jenkins sẽ tự động chạy tại cổng 8080 , chúng ta có thể truy cập vào Jenkins thông qua trình duyệt với đường dẫn: http://ip_may_chu_cua_ban:8080 . Ví dụ: http://10.10.8.10:8080 .

Bước 3: Unlock Jenkins

Sau khi truy cập vào Jenkins thành công qua trình duyệt, chúng ta sẽ nhận được bảng thông báo như sau:

Để đảm bảo bảo mật thì Jenkins bắt buộc chúng ta phải lấy mã Admin trong file initialAdminPassword trên máy chủ.
Chạy lệnh sau để lấy mã: sudo cat /var/lib/jenkins/secrets/initialAdminPassword .
Output sẽ có dạng: d177322e66ca4ba38034fbfeada344c0 .
Copy đoạn mã và past vào ô Administrator password sau đó ấn Continue.

Bước 4: Đổi mật khẩu Admin

Sau khi đã có quyền truy cập vào Jenkins, điều đầu tiên chúng ta cần làm là đổi mật khẩu Admin.
Ở góc trên bên phải sẽ có 1 nút Admin , ấn vào đó, tiếp tục ở cột bên trái sẽ có Configure , tiếp tục ấn vào form cập nhật thông tin sẽ hiện ra.
Sau khi đổi mật khẩu admin coi như chúng ta đã tạm cài đặt xong Jenkins lên máy chủ, các bước tiếp theo mình sẽ hướng dẫn trong một bài viết khác nhé!

Hướng dẫn cài đặt Java trên Ubuntu

Để kiểm tra xem máy chủ của bạn đã được cài Java chưa, gõ lệnh: java -version .
Nếu output tương tự thế này thì máy bạn đã cài Oracle Java rồi:

java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)

Hoặc nếu output tương tự thế này thì máy của bạn đã được cài Java Open JDK rồi:

openjdk version "1.8.0_151"
OpenJDK Runtime Environment (build 1.8.0_151-8u151-b12-0ubuntu0.16.04.2-b12)
OpenJDK 64-Bit Server VM (build 25.151-b12, mixed mode)

Nếu chưa, tham khảo các bước sau để cài đặt Java:

Bước 1: Cài đặt Java thông qua apt-get

Cài đặt Java Open JDK

sudo apt-get install default-jdk

Bạn có thể thay đổi phiên bản mong muốn, ví dụ:

sudo apt-get install openjdk-8-jdk
sudo apt-get install openjdk-7-jdk

Hoặc cài đặt Oracle Java

Mặc định Java không có sẵn trong repository của Ubuntu, vì vậy ta cần add thêm:

sudo add-apt-repository ppa:webupd8team/java

Cập nhật lại Apt package:

sudo apt-get update -y

Cài đặt Oracle Java:

sudo apt-get install oracle-java8-installer

Kiểm tra lại version của Java:

java -version

Bước 2: Cấu hình JAVA_HOME

Mở file enviroment với câu lệnh: sudo vi /etc/environment
Sau đó thêm vào cuối file dòng: JAVA_HOME=”/usr/lib/jvm/java-8-openjdk-amd64″ hoặc /usr/lib/jvm/java-8-oracle/  nếu cài đặt Oracle Java.
Lưu ý đường dẫn đến Java home có thể khác tùy thuộc vào phiên bản, vì vậy cách tốt nhất các bạn cd /usr/lib/jvm  sau đó ls -la  để xác định Java home phù hợp nhé.
Bước cuối cùng, chạy lệnh source /etc/environment để tải lại file enviroment.
Chúc các bạn thành công!.

Học Javascript qua ví dụ – Learn Javascript by examples

Bài viết tổng hợp các ví dụ về Javascript, qua đó có thể giúp chúng ta củng cố, nắm chắc kiến thức về Javascript hơn.

Mục lục

  1. Toán tử delete
  2. Closure trong vòng lặp

1. Toán tử delete

Xét đoạn code, và đoán xem các output sẽ là gì?

//Ví dụ 1:
var myCar = 'Range Rover';
var getMyCar = (function(){
    delete myCar;
    return myCar;
});
console.log(myCar); //Kết quả 1
//Ví dụ 2:
function RangeRover(){};
RangeRover.prototype.color = 'White';
RangeRover.prototype.year = '2016';
var myCar = new RangeRover();
delete myCar.year;
console.log(myCar.year); //Kết quả 2
//Ví dụ 3:
delete RangeRover.prototype.color;
console.log(myCar.color); //Kết quả 3

Kết quả:

Range Rover //Kết quả 1
2016 //Kết quả 2
undefined //Kết quả 3

Giải thích:
Ví dụ 1: Toán tử delete  dùng để xoá một thuộc tính của một đối tượng, myCar  là một biến và không phải là một đối tượng, vì thế kết quả cuối cùng vẫn là Range Rover  vì toán tử delete  không ảnh hưởng đến myCar .
Ví dụ 2: Như đã nói ở trên, toán tử delete  dùng để xoá một thuộc tính của đối tượng, vậy tại sao myCar.year  vẫn không bị ảnh hưởng bởi toán tử delete ? Lí do là vì myCar.year  là một thuộc tính kế thừa từ RangeRover.year , nên myCar.year  cũng không bị ảnh hưởng bởi delete .
Ví dụ 3: Kết quả là undefined  vì thuộc tính color  đã bị xoá trong RangeRover.prototype.color , đồng thời thuộc tính kế thừa color  của instance myCar  cũng bị loại bỏ theo.

2. Closure trong vòng lặp

Đang cập nhật..
 

Cài đặt Laravel Homestead – môi trường phát triển chuẩn cho Laravel – sử dụng Vagrant, Virtual Box

Hãy hình dung, bạn có một nhóm cùng với nhau phát triển một dự án, khi đó vấn đề nảy sinh là: Mỗi thành viên trong team sử dụng một hệ điều hành khác nhau, dẫn đến khả năng phát sinh lỗi khi phát triển là rất cao, nhiều khi dự án chạy trên máy người này thì ổn, nhưng sang máy của một thành viên khác thì lại lỗi, gây khó khăn cho cả nhóm, tốn thời gian sửa lỗi không cần thiết. Vấn đề này không chỉ nảy sinh với những nhóm phát triển Laravel mà nó cũng là vấn đề với bất kỳ nhóm phát triển nào.

Vậy thì, làm thế nào để giải quyết vấn đề này?

Ý tưởng: Tất cả các thành viên trong nhóm sẽ cài đặt một máy ảo trên máy của mình và làm việc trên đó, máy ảo này sẽ được cài đặt đầy đủ tương đương với môi trường khi deploy.
Vấn đề phát sinh tiếp theo là mỗi thành viên khi cài đặt máy ảo của mình thì chưa chắc đã cài đặt đủ, đúng phiên bản các công cụ, dịch vụ, và hơn nữa là cũng khá tốn thời gian để cài đặt từng cái.
Và một vấn đề nữa, nhiều bạn đọc đến đây chắc vẫn đang băn khoăn “Nếu cài máy ảo thì tôi lại phải code trên máy ảo à? tôi không thích như vậy! tôi thích làm việc trên hệ điều hành quen thuộc của tôi cơ!”.
Chúng ta có quá nhiều vấn đề nhỉ, nhưng không sao, Vagrant có thể giúp chúng ta xử lý hết những vấn đề ở trên.
Trước hết hãy tìm hiểu xem “Vagrant là gì?”

Vagrant là gì?

Vagrant là một sản phẩm của HashiCorp, nó là một công cụ giúp chúng ta xây dựng môi trường phát triển. Hiểu đơn giản thì vagrant sẽ là cầu nối giữa máy tính cá nhân của chúng ta và máy ảo. Chúng ta vẫn code trên máy chúng ta như bình thường, và vagrant sẽ tự động đồng bộ nó với máy ảo, và máy ảo sẽ làm nhiệm vụ biên dịch và thông dịch, và hơn nữa máy ảo này có thể share được cho mọi người trong nhóm. Cool 😀
Hiểu sơ sơ vậy đủ rồi, giờ bắt tay vào cài đặt thôi.

Cài đặt Virtual Box

Đầu tiên chúng ta sẽ cài Virtual Box, đây là phần mềm tạo và cài đặt máy ảo, trên máy ảo sẽ được cài đặt sẵn môi trường làm việc phù hợp.
Ví dụ máy ảo để lập trình Laravel (Web/PHP) sẽ bao gồm:

  • Ubuntu 14.04
  • Git
  • PHP 7.0
  • HHVM
  • Nginx
  • MySQL
  • MariaDB
  • Sqlite3
  • Postgres
  • Composer
  • Node (With PM2, Bower, Grunt, and Gulp)
  • Redis
  • Memcached
  • Beanstalkd

Chú ý, theo kinh nghiệm cá nhân mình, phiên bản ổn định nhất của Virtual Box hiện tại là phiên bản 4.0.10 hoặc 4.0.12.

Cài đặt Vagrant

Tiếp theo chúng ta sẽ cài Vagrant, như đã nói ở trên thì Vagrant sẽ là cầu nối giữa máy chúng ta đang làm việc và máy ảo, mọi cập nhật trên máy chúng ta sẽ được đồng bộ với máy ảo ngay lập tức.

Add Vagrant Box

Sau khi cài đặt xong Virtual Box và Vagrant, bước tiếp theo chúng ta sẽ add box trên Vagrant. Vagrant cung cấp khái niệm box, mỗi box tương đương với một máy ảo. Tuỳ vào ngôn ngữ chúng ta sử dụng và yêu cầu của từng team chúng ta sẽ chọn những box khác nhau, danh sách các box được chia sẻ và tổng hợp tại hashicorp.
Với Laravel thì chúng ta sẽ chọn laravel/homestead. Bạn có thể thấy nó ở ngay trang đầu trên hashicorp.
Mở Terminal và gõ vagrant box add tên_box, VD: vagrant box add laravel/homestead
Máy tính bạn sẽ tự động tải bộ cài máy ảo tương ứng, dung lượng khoảng 1GB nên thời gian chờ cũng khá lâu.

Trường hợp mạng yếu tải Vagrant Box xảy ra lỗi

Có một số trường hợp do mạng yếu mà không thể tải được, để ý một chút chúng ta có thể thấy bên trong thông báo lỗi có đường dẫn tải box, chúng ta có thể copy link đó và tải trên trình duyệt, tốc độ sẽ nhanh và ổn định. Sau khi tải xong chúng ta lại chạy câu lệnh add như ở trên nhưng thêm path đến file vừa tải vào cuối.
vagrant box add /Volumes/Data/Setup/Homestead/hc-download
Với trường hợp này, để tránh phát sinh thêm lỗi về sau khi vagrant up, chúng ta tạo một file metadata.json, chứa nội dung như sau:

{
    "name": "tên_box",
    "versions": [{
        "version": "0.4.0",
        "providers": [{
            "name": "virtualbox",
            "url": "đường_dẫn_đến_file_box_đã_tải "
        }]
    }]
}

Sau đó chạy câu lệnh: vagrant box add metadata.json
Mình khuyến khích các bạn dùng cách này, vì sau này khi muốn add lại box mình không mất công tải lại box, chỉ cần add lại file metadata.json  là xong.

Trường hợp box đã tồn tại

Sử dụng lệnh vagrant box list  để hiển thị các box đang có.
Dùng lệnh vagrant box remove tên_box  để xoá box.
Xoá Vagrantfile hiện tại rm Vagrantfile .
Tiếp đến quay lại bước vagrant box add .

Config Vagrant

Tiếp theo chúng ta phải config lại vagrant một chút. Trước khi làm việc đó thì chúng ta chạy một vài câu lệnh nhỏ sau đây để khởi tạo.

git clone https://github.com/laravel/homestead.git Homestead
cd Homestead
bash init.sh
ssh-keygen -t rsa -C "[email protected]"

Chú ý, nếu bạn cài đặt trên Window thì có thể vào thẳng folder Homestead và chạy file init.bat .
Sau đó chúng ta sẽ có 1 folder .homestead  và file ~/.homstead/Homestead.yaml
Mở file Homestead.yaml , chúng ta cần chỉnh sửa một chút cho phù hợp, chú ý đoạn sau:

ip: "10.10.8.10"
...
folders:
- map: /Users/Jeremy/Homestead
to: /home/vagrant/Code
sites:
- map: toanf.dev
to: /home/vagrant/Code/toanf.com/public

Nhìn qua chắc bạn cũng có thể hình dung ra, mọi thứ trong /Users/Jeremy/Homestead  trên máy thật sẽ được đồng bộ với /home/vagrant/Code  trên máy ảo.
10.10.8.10  chính là ip của máy ảo, bạn có thể đổi tuỳ ý, miễn là không bị trùng với local của bạn là được.
toanf.dev  bạn có thể hiểu đơn giản nó là domain mà bạn sẽ gõ trên trình duyệt, còn /home/vagrant/Code/toanf.com/  là nơi chứa code laravel. Tất nhiên bạn sẽ phải add 10.10.8.10 toanf.dev  vào file hosts  trên máy bạn thì nó mới có thể chạy được.
Sắp xong rồi, giờ chúng ta mở terminal trong folder ~/Homestead  và chạy câu lệnh: vagrant up  để khởi động máy ảo.
Chúng ta cũng có thể connect với máy ảo qua ssh bằng câu lệnh: vagrant ssh
Vậy là xong, giờ chúng ta đã có môi trường ngon lành để làm việc với đầy đủ các công cụ, dịch vụ cần thiết mà không cần mất công đi cài đặt từng cái một, config từng cái một.
Một số câu lệnh làm việc với Vagrant

vagrant up #Khởi động máy ảo
vagrant reload #Restart máy ảo
vagrant halt #Tắt máy ảo
vagrant ssh #Truy cập máy ảo qua ssh

Chú ý, sau này khi muốn tương tác với máy ảo chúng ta cần mở terminal trong folder ~/Homestead  hoặc gõ lệnh vagrant global-status  để liệt kê các máy ảo, tiếp theo gõ câu lệnh vagrant theo cú pháp vagrant [lệnh] [id_máy_ảo] , ví dụ: vagrant up 1f5321 .
Ở bài viết này, mình chỉ đề cập chi tiết cách cài với mục đích sử dụng để phát triển Laravel, ứng với yêu cầu của team mình thì các bạn có thể tự tìm hiểu thêm nhé.

Bổ sung cách khắc phục một số lỗi phát sinh.

Lỗi:

==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
The guest machine entered an invalid state while waiting for it
to boot. Valid states are 'starting, running'. The machine is in the
'poweroff' state. Please verify everything is configured
properly and try again.
If the provider you're using has a GUI that comes with it,
it is often helpful to open that and watch the machine, since the
GUI often has more helpful error messages than Vagrant can retrieve.
For example, if you're using VirtualBox, run vagrant up while the
VirtualBox GUI is open.

Khắc phục: thêm đoạn config sau vào Vagrantfile

config.vm.provider "virtualbox" do |vb|
vb.customize ["modifyvm", :id, "--accelerate3d", "off"]
end

© 2019 AT Nguyen

Theme by ATUp ↑