THẢO LUẬN

A không cần supervisor, server a là Ubuntu a cài vào đủ theo yêu cầu project này: PHP, MySQL, Redis là đủ cho project Laravel (cài qua apt hết nhé)

Em thấy anh cần chạy 1 cái queue để đưa mess vào hàng đợi, tức là mình phải dùng command line php artisan queue:work, trên server anh làm sao để giữ được command tương tự ?

Riêng Laravel Echo a chạy như 1 app NodeJS ở cổng 6001. A viết script .js rồi dùng PM2 để chạy

Đoạn này nghe có vẻ ok ạ, nhưng như vậy laravel echo phải init trong con PM2 này ạ

0
Avatar
đã bình luận câu trả lời trong câu hỏi
thg 4 10, 2020 8:35 SA

@nam123456 mình nghĩ bạn cứ vững base đi, vì khi bạn chuyển sang học laravel thì những thứ như phân trang các kiểu kia chỉ tốn của bạn 2-3 line code thôi

0

Cám ơn e , câu hỏi rất hay. Chờ mãi mới có người hỏi về deploy 😄

Câu đầu tiên: a chỉ fix localhost:8000 ở mỗi file laravel-echo-server.json thôi mà e 😄

Deploy chia làm 2 khoảng thời gian, ngày xưa và bây giờ 😄, vì mỗi khoảng a deploy theo cách khác nhau

Ngày xưa (cách truyền thống):

  • A không cần supervisor, server a là Ubuntu a cài vào đủ theo yêu cầu project này: PHP, MySQL, Redis là đủ cho project Laravel (cài qua apt hết nhé)
  • Riêng Laravel Echo a chạy như 1 app NodeJS ở cổng 6001. A viết script .js rồi dùng PM2 để chạy
  • Tiếp theo a dùng Nginx như webserver vừa để chạy phần code php của Laravel (ra production mình ko có chạy php artisan server nữa nhé), vừa để forward các request cần thiết vào process Laravel Echo ở trên, đồng thời dùng Nginx thì lấy SSL(HTTPS) rất là dễ. Vậy là đủ để chạy project này.

Thời bây giờ (cách tiện hơn): yêu cầu kiến thức về Docker.

  • A ko cần cài PHP MySQL các thứ lằng nhằng nữa. Nhưng vẫn cần Nginx (a ko muốn chạy Nginx trong Docker vì a dùng Nginx cho nhiều project)
  • A viết cấu hình Dockerfile. chia project thành các service cần thiết (Mysql, Redis, Laravel Echo,....) và chạy
  • Cách này cực kì tiện vì e ko cần cài trực tiếp các thứ như PHP MySQL,... vào hệ điều hành, thích sửa xoá j làm thoải mái ko sợ bị hỏng, và 1 thời gian sau quay lại nhìn vào Dockerfile là e biết project của mình cần gì. Deploy và maintain cực dễ
  • Với cách này thì a thì a cũng chia Laravel Echo ra thành 1 service có image riêng (về khía cạnh trừu tượng thì cũng giống cách chạy như ở cách truyền thống)

Quay trở lại localhost:8000 a fix ở file laravel-echo-server.json có ảnh hưởng gì khi deploy ko? Câu trả lời là không nhé, ở phạm vi bài này, thì ko sao cả, vì khi deploy thì ta ko cần chạy php artisan serve nữa, mà dùng Nginx để "serve" Laravel.

Vậy những chỗ fix cứng localhost:8000 trong laravel-echo-server.json thì sao??? Chi tiết: trong file đó có 2 chỗ a fix cứng 1 là authHost 2 là dưới phần apiOriginAllow (để lấy danh sách user)

  • Vì bài này ta chỉ là public channel, nên authHost ko động tới, ta ko quan tâm
  • Còn với apiOriginAllow thì e đọc bên dưới nhé

Ở Nginx a cấu hình sao cho các route về /socket.io hay /apps (để lấy danh sách user trong phòng), nói chung là bắt những route giao tiếp với Laravel Echo Server, thì request sẽ được forward vào process Laravel Echo như sau:

location ~ ^/(socket.io|apps) { # /apps to get channel's info, list users,... from Laravel echo server
        proxy_pass http://localhost:6001; # forward request vào đây
        ... other options;
    }

Vậy khi truy cập từ trình duyệt, ví dụ https://example.com/socket.io/.... thì request sẽ tới Nginx, từ nginx request sẽ được pass vào http://localhost:6001, và bởi vì Nginx và Laravel Echo Server chạy ở cùng 1 server nên chúng sẽ tự biết nhau khi gọi tới localhost. Do đó e thấy ở đây request từ user bản chất là gọi vào localhost:6001 ở trên server, chính là cổng đang chạy laravel-echo-server, do đó đây KHÔNG phải là Cross-Origin, sẽ ko bị lỗi CORS. do đó thực chất trường apiOriginAllow khi deploy chạy thật thì cũng ko để làm gì cả 😄. Chỉ dùng ở local, vì local ta chạy Laravel ở localhost:8000, trong khi Laravel Echo Server là localhost:6001, nên ta mới phải cấu hình như vậy ở trong file laravel-echo-server.json để cho phép localhost:8000 gọi tới (để lấy danh sách user chẳng hạn)

Câu cuối: bài này còn ở dạng demo, với project thật thì thường a lưu các biến cần thiết ở trong file .env, file này deploy theo cách truyền thống hay Docker thì cũng để tái sử dụng được rất là dễ. Các biến, URL, API_KEY,... sẽ ko fix cứng trong code nữa mà để ở đây

+1

"time": int(time()) * 1000000000 cho mình hỏi cái này có ý nghĩa gì vậy bạn ?

0

Hi anh, Em đọc bài viết của anh rất hay và em có vài thắc mắc khi deploy mong được anh giải đáp

  1. Trong code em thấy anh fix url khá nhiều như localhost:8000, vậy khi deploy anh giải quyết bài toán khác url như thế nào ?
  2. Khi deploy lên sever, redis thì chắc anh dùng supervisor rồi, còn laravel echo, anh giải quyết bài toán để nó chạy port 6001 always như nào

Thanks anh ạ

+1

Chèn nhiều backlink vào bài viết một cách thật khéo và cho họ thoải mái copy. Như vậy mình có thêm back link mà chả tốn công. Chứ copy thì kiểu gì mà họ chẳng copy được

0
thg 4 10, 2020 4:47 SA

biểu đồ đấy không thể hiện số người dùng arch đâu. nếu cứ để ý trên các sub reddit linux thì phải đến 70% dùng arch. Cài Arch không hề khó. cứ làm đúng wiki là được. chỉ mất công đọc và tìm tòi thôi. từ đó tự làm mình biết nhiều thứ hơn. I use Arch, btw.

+1
thg 4 10, 2020 4:19 SA

bài viết thật bổ ích =))

0

Mình sử dụng window để build container, khi chạy câu lệnh "docker run -v D:/Docker/webroot:/var/www/html -p 9000:80 -it ubuntu-nginx /bin/bash" kết quả là success. Nhưng khi vào local host thì hiện lỗi 403, Forbiden. Mình hiểu có thể lỗi do permission của file helloworld.html trong thư mục /var/www/html không được set quyền cho user của nginx là www-data, nhưng khi mình chạy câu lệnh "chown -R www-data:www-data hello.html" thì file vẫn không đổi permission. Không biết là mình hiểu sai lỗi hay bạn có cách nào khắc phục không ạ? Cảm ơn

0
Avatar
đã bình luận câu trả lời trong câu hỏi
thg 4 10, 2020 3:19 SA

@duong.manh.hoang lúc đầu mình làm CRUD, giờ mình đang làm project đây,những thứ như phân trang,lấy bài viết mới nhất,... giờ vẫn code lại chứ vẫn không tự viết đc 😢😢

0
thg 4 10, 2020 2:43 SA

Hi @at3s,
Cảm ơn vì bạn đã đọc bài viết này 😃
Khi value prop được truyền trong Context.Provider thay đổi, các thành phần bên trong Provider này sẽ bị re-render.
Thành phần ở đây là các consuming components - component này được wrap trong Provider như bạn nói (hay còn gọi là descendant consumers), cho phép chúng ta subscribe context changes thông qua Context.Consumer hoặc Class.contextType nha ^^

0
thg 4 10, 2020 2:20 SA

UnhandledPromiseRejectionWarning: Error: Returned error: invalid sender Mình gặp lỗi này mình có cho hêm chainId vào TxRow rồi mà ko được, Tài khoản thì mình coppy rồi nên ko sai được, Lỗi này có còn nguyên nhân nào khác ko bạn.

0
Avatar
đã bình luận câu trả lời trong câu hỏi
thg 4 10, 2020 2:01 SA

thanks các bạn nhiều

0

Hi bạn, Theo mình thì cứ để copy đi bạn, thực sự copy không ảnh hưởng đến giá trị web của bạn đâu. Bạn để ý những web của chính phủ, báo tuổi trẻ, Thanh Niên hoặc Amazon, những web lớn này cũng copy được bình thường thôi ban. Như web mình: https://sites.google.com/site/thienantravelsite , Sản phẩm của google cũng mặc định cho copy bình thường. Còn nếu bạn muốn thì vào Setting (Cài đặt) và click vào devtool là ok nhé bạn. Môt vài chia sẻ gửi đến bạn.

+1
thg 4 10, 2020 12:59 SA

cảm ơn bạn 👏

0

với mỗi 1 connect tới 1 channel sẽ qua 2 bước, 1 là authenticate sau đó thành công thì sẽ cho join, đó là lí do 2 thấy in ra 2 dòng kia ở cmd, toàn bộ những j e đang thấy được sinh ra bởi laravel-echo-server nhé.

E check lại code của e nhé, a ko thể xem cách e implement nên k thể nói rõ được, check lại những đoạn user join channel, xem cái channel user.1.to_user.2 kia ở đâu mà ra, tại sao nó ko cần authenticate mà vẫn dùng được?


Với lại bài này a viết về public channel ko cần authenticate mà e. 😃

0
thg 4 9, 2020 3:05 CH

Bài tut này a cũng viết đc 1 tgian rồi, a tin là từ đó đến giờ đã có nhiều thay đổi, a sẽ làm lại và reply e sớm nhất nhé, 😄

0
Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí