Máy chủ web – Fullstack Station https://fullstackstation.com Hướng dẫn lập trình, thiết kế, lập trình web, thiết kế web, lập trình javascript, lập trình fullstack từ cơ bản đến nâng cao Wed, 24 Apr 2024 08:20:25 +0000 vi hourly 1 https://wordpress.org/?v=6.8.1 https://fullstackstation.com/wp-content/uploads/2019/08/favicon.ico Máy chủ web – Fullstack Station https://fullstackstation.com 32 32 Tạo mật khẩu SMTP trong Amazon SES https://fullstackstation.com/tao-mat-khau-smtp-trong-amazon-ses/ https://fullstackstation.com/tao-mat-khau-smtp-trong-amazon-ses/#respond Wed, 17 Aug 2022 01:16:00 +0000 https://fullstackstation.com/?p=6853 Vào một ngày đẹp trời thiết lập gởi mail trong wordpress thì hỡi ôi làm mãi không gởi email đi được. Mãi mới xác định được là cách tạo xác thực trước đây cho SMTP bằng mật khẩu của AWS đã thay bằng Access key ID/AWS secret access key. Với cặp Access key ID/AWS secret […]

The post Tạo mật khẩu SMTP trong Amazon SES appeared first on Fullstack Station.

]]>
Vào một ngày đẹp trời thiết lập gởi mail trong wordpress thì hỡi ôi làm mãi không gởi email đi được. Mãi mới xác định được là cách tạo xác thực trước đây cho SMTP bằng mật khẩu của AWS đã thay bằng Access key ID/AWS secret access key.

Với cặp Access key ID/AWS secret access key thì sẽ được sử dụng cho Amazon SES API, nhưng các plugin dành cho wordpress thì lại không hỗ trợ, nếu có hỗ trợ thì phải sử dụng bản PRO mới có.

Vì vậy muốn sử dụng gởi email qua smtp bằng user/password thì phải “tạo mật khẩu smtp từ AWS secret access key

Bước 1: Tạo tập tin smtp_credentials_generate.py

Cứ copy rồi lưu lại thành tập tin là được, không cần chỉnh sửa gì thêm nhé.

#!/usr/bin/env python3

import hmac
import hashlib
import base64
import argparse

SMTP_REGIONS = [
    'us-east-2',       # US East (Ohio)
    'us-east-1',       # US East (N. Virginia)
    'us-west-2',       # US West (Oregon)
    'ap-south-1',      # Asia Pacific (Mumbai)
    'ap-northeast-2',  # Asia Pacific (Seoul)
    'ap-southeast-1',  # Asia Pacific (Singapore)
    'ap-southeast-2',  # Asia Pacific (Sydney)
    'ap-northeast-1',  # Asia Pacific (Tokyo)
    'ca-central-1',    # Canada (Central)
    'eu-central-1',    # Europe (Frankfurt)
    'eu-west-1',       # Europe (Ireland)
    'eu-west-2',       # Europe (London)
    'sa-east-1',       # South America (Sao Paulo)
    'us-gov-west-1',   # AWS GovCloud (US)
]

# These values are required to calculate the signature. Do not change them.
DATE = "11111111"
SERVICE = "ses"
MESSAGE = "SendRawEmail"
TERMINAL = "aws4_request"
VERSION = 0x04


def sign(key, msg):
    return hmac.new(key, msg.encode('utf-8'), hashlib.sha256).digest()


def calculate_key(secret_access_key, region):
    if region not in SMTP_REGIONS:
        raise ValueError(f"The {region} Region doesn't have an SMTP endpoint.")

    signature = sign(("AWS4" + secret_access_key).encode('utf-8'), DATE)
    signature = sign(signature, region)
    signature = sign(signature, SERVICE)
    signature = sign(signature, TERMINAL)
    signature = sign(signature, MESSAGE)
    signature_and_version = bytes([VERSION]) + signature
    smtp_password = base64.b64encode(signature_and_version)
    return smtp_password.decode('utf-8')


def main():
    parser = argparse.ArgumentParser(
        description='Convert a Secret Access Key for an IAM user to an SMTP password.')
    parser.add_argument(
        'secret', help='The Secret Access Key to convert.')
    parser.add_argument(
        'region',
        help='The AWS Region where the SMTP password will be used.',
        choices=SMTP_REGIONS)
    args = parser.parse_args()
    print(calculate_key(args.secret, args.region))


if __name__ == '__main__':
    main()

Chạy lệnh tạo mật khẩu

python path/to/smtp_credentials_generate.py wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY us-east-1

Sau khi chạy lệnh trên, chúng ta sẽ được 1 dãy ký tự mới, đó chính là mật khẩu STMP. Sử dụng Access key ID và mật khẩu được tạo ra ở trên để cài đặt trong các plugin gởi email bằng SMTP. Bên dưới là phần thiết lập cho plugin WP MAIL SMTP:

Tham khảo thêm các bài viết về Amazon SES:

https://docs.aws.amazon.com/ses/latest/dg/smtp-credentials.html

https://cuongthach.com/email-marketing/huong-dan-su-dung-amazon-ses-smtp-de-gui-email-tu-wordpress

https://vticloud.io/amazon-ses-la-gi-huong-dan-tong-hop-ve-dich-vu-amazon-ses/

The post Tạo mật khẩu SMTP trong Amazon SES appeared first on Fullstack Station.

]]>
https://fullstackstation.com/tao-mat-khau-smtp-trong-amazon-ses/feed/ 0
Một số lệnh hữu ích cho xử lý tập tin, thư mục bằng command line https://fullstackstation.com/mot-so-lenh-huu-ich-cho-xu-ly-tap-tin-thu-muc-bang-command-line/ https://fullstackstation.com/mot-so-lenh-huu-ich-cho-xu-ly-tap-tin-thu-muc-bang-command-line/#respond Wed, 13 Mar 2019 08:52:32 +0000 http://fullstackstation.com/?p=1473 Mấy hôm nay dính vài vấn đề với hệ thống nên phải tra log và xử lý text, nhân tiện ghi chép lại mấy cái lệnh hữu ích chia sẽ với mọi người. Grep Thường thì “grep” được dùng để tìm kiếm text trong file, rất hay được dùng khi kiểm tra log hoặc tập […]

The post Một số lệnh hữu ích cho xử lý tập tin, thư mục bằng command line appeared first on Fullstack Station.

]]>
Mấy hôm nay dính vài vấn đề với hệ thống nên phải tra log và xử lý text, nhân tiện ghi chép lại mấy cái lệnh hữu ích chia sẽ với mọi người.

Grep

Thường thì “grep” được dùng để tìm kiếm text trong file, rất hay được dùng khi kiểm tra log hoặc tập tin văn bản.

$ grep 'keyword' /var/log/path.log

Một số tuỳ chọn hữu ích

$ grep -A 5 -B 6 --color 'keyword' /var/log/path.log

Lệnh trên sẽ làm nổi bật `keyword` bằng màu sắc với --color, và -A 5hiển thị 5 dòng sau (A: After) dòng có chứa keyword, tương tự với -B 6 là hiển thị 6 dòng trước (B: Before) dòng có chứa keyword, nếu dùng -C 7 thì nghĩa là trước 7 dòng và sau 7 dòng.

Kết hợp wc

Chúng ta sẽ kết hợp với wc (wordcount) để đếm số dòng, số byte, số ký tự mà chúng ta cần

$ grep 'keyword' /var/log/path.log | wc -l

Với lệnh trên, thì sẽ đếm xem có bao nhiêu dòng chứa `keyword`, hoặc thay thế tuỳ chọn -l bằng -m sẽ đếm xem có bao nhiêu ký tự, hoặc -c sẽ đếm byte, thường dùng nhất vẫn chỉ có -l.

Kết hợp awk

$ cat access.log | awk '{print $1}'

Nâng cao thêm 1 chút bằng printf

$ cat access.log | awk '{printf ("Nội dung là %s %s", $1, $2)}'

Ứng dụng vào việc tìm IP có số lượng gởi yêu cầu vào máy chủ nhiều nhất

$ cat access.log | awk '{print $1}' | sort -n | uniq -c | sort -nr | head -20

Giả sử $1 ở đây là IP (file log thông thường của server), thì lệnh awk sẽ lấy danh sách IP, và được sắp xếp và lấy duy nhất không trùng lặp bằng lệnh sort -n | uniq -c sau đó sắp xếp đảo ngược với sort -nr và kết thúc là lấy 20 kết quả đầu tiên bằng head -20

Tìm kiếm tập tin, thư mục bằng Find

Lệnh find cũng ít khi sử dụng, nhưng tầm quan trọng và tính hữu dụng thì rất cao.

find -type f -name ‘*.log’ -mtime +15

Câu lệnh trên cơ bản tìm trong thư mục hiện hành tất cả các tập tin có đuôi .log với thời gian cập nhật mtime hơn 15 ngày (+15) hoặc có thể tìm theo thời gian tạo bằng ctime

Lệnh này được sử dụng khi cần xoá các tập tin khi dung lượng ổ cứng bị đầy, hoặc là cần lập lịch tự động xoá file backup sau 15 ngày chẳng hạn.

Kết hợp xoá tập tin

find -type f -name ‘*.log’ -mtime +15 -exec rm {} \;

hoặc

find -type f -name ‘*.log’ -mtime +15 | xargs rm

Tìm thư mục có dung lượng cao

du -h | sort -hr | head -5

Câu lệnh trên cho phép tìm 5 thư mục có dung lượng cao nhất trong thư mục hiện hành, nếu ta thêm --max-depth=1 thì lệnh chỉ giới hạn ở thư mục con cấp 1.

Fullstack Station Tips

Có hằng hà sa số câu lệnh cần thiết, nhưng mấy lệnh này mình hay sử dụng nhất. Từ các lệnh cơ bản này, bạn có thể xem phần `help` của mỗi lệnh để có thêm tuỳ chọn.

The post Một số lệnh hữu ích cho xử lý tập tin, thư mục bằng command line appeared first on Fullstack Station.

]]>
https://fullstackstation.com/mot-so-lenh-huu-ich-cho-xu-ly-tap-tin-thu-muc-bang-command-line/feed/ 0
Serverless là gì? Hãy sẵn sàng với serverless! https://fullstackstation.com/serverless-la-gi/ https://fullstackstation.com/serverless-la-gi/#comments Wed, 28 Nov 2018 06:45:15 +0000 http://fullstackstation.com/?p=1431 Khái niệm về serverless là gì thì cũng không còn mới mẻ lắm cho nhiều người, tuy nhiên để thực sự sử dụng, trải nghiệm ưu khuyết điểm thực tế thì cũng không phải nhiều lắm. Sau một thời gian nghiên cứu về serverless, mình tổng kết một vài kinh nghiệm cá nhân, cố gắng […]

The post Serverless là gì? Hãy sẵn sàng với serverless! appeared first on Fullstack Station.

]]>
Khái niệm về serverless là gì thì cũng không còn mới mẻ lắm cho nhiều người, tuy nhiên để thực sự sử dụng, trải nghiệm ưu khuyết điểm thực tế thì cũng không phải nhiều lắm. Sau một thời gian nghiên cứu về serverless, mình tổng kết một vài kinh nghiệm cá nhân, cố gắng giải thích đơn giản để người mới dễ dàng tiếp cận lĩnh vực này.

Cập nhật 04/2024: Serverless AI là gì?

Serverless là gì?

Serverless là môi trường, nền tảng thực thi ứng dụng và dịch vụ mà không phải quan tâm đến máy chủ. Ứng dụng serverless không cần phải  quan tâm việc phân bổ, quản lý tài nguyên của hệ điều hành, và bỏ qua các vấn đề về nâng cấp và bảo mật. Với khái niệm là chỉ cần tập trung phát triển sản phẩm, việc còn lại về vận hành sẽ để nền tảng này đảm nhiệm.

Điều quan trọng và khác biệt nhất trong serverless là bạn chỉ trả tiền khi và chỉ những phần bạn sử dụng. Giả sử bạn có một máy chủ ảo, thì thường sẽ được tính tiền trọn gói bao gồm thời gian chạy 24/7 trong 1 tháng, CPU và RAM, băng thông, lưu trữ. Bạn vẫn sẽ phải trả tiền hàng tháng đều đặn cho dù cái máy chủ ảo đó không chạy, hoặc chỉ sử dụng 5~10% công suất thì bạn vẫn phải trả trọn gói. Hiểu một cách nôm na, thì serverless như gói cước điện thoại được tính theo block giây, gọi bao nhiêu tính tiền bấy nhiêu, còn máy chủ ảo thường thì phải trả tiền thuê bao hàng tháng dù có phải sử dụng hay không.

Ưu và nhược điểm của serverless

Ưu điểm

Xây dụng ứng dụng serverless đồng nghĩa với việc bạn chỉ tập trung vào sản phẩm cốt lõi thay vì phải lo lắng về việc quản lý và vận hành nhiều máy chủ hoặc thời gian chạy, dù trên nền tảng đám mây hay tự xây dựng hệ thống máy chủ. Sự cắt giảm công sức tổng thể này sẽ giúp cho các nhà phát triển dành thời gian và năng lượng để tập trung vào việc xây dựng các sản phẩm tuyệt vời có quy mô linh hoạt và ổn định cao.

Không cần quản lý máy chủ: Bạn sẽ không cần cung cấp hay duy trì bất kỳ máy chủ nào. Sẽ không cần phần mềm hoặc thời gian chạy để cài đặt, nâng cấp hoặc quản trị.

Thay đổi quy mô một cách linh hoạt: Ứng dụng của bạn sẽ có khả năng thay đổi quy mô tự động hoặc bằng cách điều chỉnh dung lượng thông qua việc chuyển đổi đơn vị sử dụng (ví dụ: thông lượng, bộ nhớ) thay vì với máy chủ độc lập thì sẽ phức tạp hơn.

Độ sẵn sàng cao: Ứng dụng serverless có độ sẵn sàng tích hợp và dung sai cao. Bạn sẽ không cần tạo kiến trúc cho các khả năng này do các dịch vụ chạy ứng dụng đã cung cấp cho ứng dụng theo mặc định. Ngoài ra, có để chọn trung tâm dữ liệu (một hoặc nhiều nơi) để triển khai sản phẩm một cách dễ dàng.

Tiết kiệm chi phí: chi phí gần như bằng 0 sau khi triển khai nếu bạn không có request nào (hoặc không có hành động gọi hàm), còn sử dụng bao nhiêu thì tính tiền bấy nhiêu.

Khuyết điểm

Serverless là một ý tưởng tuyệt vời nhưng không hoàn hảo, serverless có những vấn đề riêng mà bạn cũng phải suy nghĩ trước khi quyết định sử dụng:

Độ trễ: Hiệu suất có thể là một vấn đề, chính bản thân mô hình này có thể gây ra độ trễ lớn hơn trong quá trình các nguồn tài nguyên điện toán phản ứng lại với lệnh của các ứng dụng. Nếu khách hàng yêu cầu hiệu suất cao thì việc sử dụng các máy chủ ảo được phân bổ sẽ là một lựa chọn ưu việt hơn.

Gỡ lỗi (Debug): Công việc giám sát và gỡ lỗi của serverless computing cũng khá khó khăn. Việc bạn không sử dụng một nguồn tài nguyên máy chủ thống nhất làm cho cả hai hoạt động này gặp nhiều trở ngại. (Tin tốt là công cụ này sẽ dần được để cải thiện xử lý giám sát và gỡ lỗi tốt hơn trong môi trường không máy chủ.). Ngoài ra, để giám sát thường cần có 1 thêm các công cụ tương ứng nền tảng đó, chi phí có thể phát sinh thêm.

Giới hạn về bộ nhớ, thời gian: các nhà cung cấp đều giới hạn tài nguyên ở các mức cố định về bộ nhớ và thời gian thực thi (timeout). Giả sử timeout tối đa là 5 phút, nếu bạn chạy quá 5 phút, quá trình thực thi sẽ bị ngắt. Về bộ nhớ, thì sẽ thiết lập mỗi mức khác nhau tuỳ nhà cung cấp, AWS có memory là 3008MB (sẽ được cấp CPU cao tương ứng), nếu ứng dụng yêu cầu bộ nhớ lớn thì sẽ không đáp ứng được. Liên quan đến vấn đề bộ nhớ này, thì cũng cần phải lưu tâm lúc lập trình nên tối ưu tốt, để tiết kiệm chi phí.

Phụ thuộc nhà cung cấp: bạn không thể muốn chạy phiên bản của phần mềm, nền tảng chính xác như bạn muốn. Ví dụ Nodejs bạn cần 10.x nhưng nhà cung cấp chỉ hỗ trợ đến 8.x, thì bạn sẽ không sử dụng được nền tảng này. Như vậy, trước khi sử dụng, bạn cần cân nhắc các nền tảng được hỗ trợ.

Chi phí ngầm: tuỳ nhà cung cấp có tính hay không, nhưng cơ bản là sẽ phát sinh chi phí lưu trữ mã nguồn, băng thông, và chi phí về lưu trữ dữ liệu (tuỳ ứng dụng có sử dụng hay không, ví dụ DynamoDB, RDMS … thì sẽ được tính riêng). Mặc dù, tuy không nhiều nhưng nếu không tối ưu, các phần chi phí ngầm sẽ còn cao hơn cả chi phí cho serverless.

Thời gian để nghiên cứu: trước đây bạn phải học cách sử dụng, quản lý máy chủ thì giờ đây bạn cũng cần thời gian để học để quản lý các tài nguyên trong serverless, mặc dù ko phải quá khó như quản lý máy chủ, nhưng không thể không tính. Ví dụ bạn sẽ mất thời gian để hiểu về cách sử dụng CloudFormation, IAM policies, quản lý cấu hình về stage, region, memory của Functions…

Khi nào nên sử dụng serverless

Có rất nhiều trường hợp có thể ứng dụng được serverless, điểm chung là tất cả những ứng dụng không dính dáng đến điểm yếu của serverless 😀

Websites và APIs: hoàn toàn có thể xây dựng 1 website hoặc API, website có thể là động hoặc là bán tĩnh (bán tĩnh nghĩa là nguồn gốc file là tĩnh, nhưng dùng route động). Thường thì người ta hay xây dựng Restful API với serverless, nhưng mình thích áp dụng cho Graphql hơn, vì Restful có thể trả về dữ liệu không dùng tới nhưng mình phải trả tiền băng thông 😀 (Xem thêm Graphql là gì).

Xử lý đa phương tiện: các thao tác xử lý hình ảnh, video với yêu cầu không quá cao như cắt, nén, định dạng kích thước ảnh, tạo ảnh thumbnail, hoặc chuyển đổi bộ mã của video để phù hợp với thiết bị tương ứng.

Xử lý sự kiện: có thể đóng vai trò như 1 công tắc cầu giao để thực hiện một loạt các hành động khác khi được kích hoạt tuỳ theo sự kiện.

Xử lý dữ liệu: tuỳ theo ngữ cảnh mà có thể ứng dụng như chatbot, IoT,… lý do mà serverless thích hợp với mảng này vì với chatbot hay IoT chúng ta không biết khi nào dữ liệu sẽ tới, khi nào sẽ cần xử lý dữ liệu nên chúng ta không cần phải xây dựng máy chủ luôn luôn chạy và lãng phí ở thời gian chờ.

So sánh một số nhà cung cấp hàng đầu

Hiện nay có rất nhiều nhà cung cấp dịch vụ giúp bạn tạo ra các functions sử dụng mô hình serverless một cách khá dễ dàng:

  • AWS Lambda: nói về thị phần cung cấp hạ tầng cloud hiện nay thì AWS vấn đang dẫn đầu và họ cũng đưa ra dịch Lambda để người dùng có thể sử dụng và tạo ra các functions trên mô hình serverless. Khi kết hợp với các dịch vụ khác như API Gateway, S3,.. thì có thể tạo được một API server hay một hệ thống tự động xử lí khi có file upload lên S3. AWS Lambda hỗ trợ khá nhiều ngôn ngữ như Node.js, Java, C#, Python,…
  • Google Cloud Function: hỗ trợ ngôn ngữ khá đa dạng (Nodejs, Go, Python, Java, PHP, .NET Core)
  • Azure Functions: hàng của Microsoft, hỗ trợ C#, JavaScript, F#, Python, Batch, PHP, PowerShell

Còn nhiều nhà cung cấp khác như Kubeless, Fn,… tuy nhiên 3 ông ở trên có lẽ có thị phần lớn nhất và được quan tâm hơn. Ở dưới là chi tiết so sánh 1 số thông số giữa AWS Lambda, Google Cloud Function và Azure Function

Tính năngAWS LambdaGoogle CloudAzure Functions
Khả năng mở rộngTự độngTự độngBằng tay hoặc theo plan đặt trước
Số Function tối đaKhông giới hạn1000 trên 1 projectKhông giới hạn
Xử lí đồng thời1000 trên 1 account 1 region (soft limit)Không giới hạnKhông giới hạn
Thời gian xử lí tối đa300 sec (5 min)540 seconds (9 minutes)300 sec (5 min)
Ngôn ngữJavaScript, Java, C#, and PythonNodejs, Go, Python, Java, PHP, .NET CoreC#, JavaScript, F#, Python, Batch, PHP, PowerShell
Cài đặt dependenciesĐóng gói trong source packpageNpm, NuGet
DeploymentsChỉ dùng ZIP upload (to Lambda or S3)ZIP upload, Cloud Storage hoặc Cloud Source RepositoriesVisual Studio Team Services, OneDrive, Local Git repository, GitHub, Bitbucket, Dropbox, External repository
Biến môi trườngApp Settings và ConnectionStrings trong App Services
VersioningVersions và aliasesCloud Source branch/tagCloud Source branch/tag
Event-drivenS3, SNS, SES, DynamoDB, Kinesis, CloudWatch, Cognito, API Gateway, CodeCommit, etc.Cloud Pub/Sub hoặc Cloud Storage Object Change NotificationsBlob, EventHub, Generic WebHook, GitHub WebHook, Queue, Http, ServiceBus Queue, Service Bus Topic, Timer triggers
Hỗ trợ HTTP(S)API GatewayHTTP triggerHTTP trigger
OrchestrationAWS Step FunctionsChưa hõ trợAzure Logic Apps
LoggingCloudWatch LogsStackdriver LoggingApp Services monitoring
MonitoringCloudWatch & X-RayStackdriver MonitoringApplication Insights
In-browser code editorChỉ cho Cloud Source RepositoriesFunctions environment, App Service editor
Granular IAMIAM rolesChưa hỗ trợIAM roles
Pricingfree 1M requests, sau đó $0.20/1M requests, thêm $0.00001667/GB-secfree 1M requests, sau đó $0.40/1M requests, thêm $0.00000231/GB-secfree 1M requests, sau đó $0.20/1M requests, thêm $0.000016/GB-s

Xây dựng hệ thống để trở thành nhà cung cấp serverless

Vì sự nổi trội về ưu điểm của serverless, nên hiện nay cũng đã có một số mã nguồn mở để xây dựng thành nền tảng cung cấp serverless

https://www.serverless.com/

OpenFaaS – Serverless Functions Made Simple

https://github.com/openfaas/faas

FireCracker – Secure and fast microVMs for serverless computing

https://github.com/firecracker-microvm/firecracker

Mình thì chỉ quan tâm tới việc xài thôi, nên không tìm hiểu được ở mảng này.

Fullstack Station Tips

Ngày nay khi mà các công cụ hỗ trợ lập trình viên tập trung vào việc xây dựng sản phẩm càng nhiều, thì rõ ràng chính lập trình viên chính là những người hưởng lợi nhất. Serverless là tương lai của những lập trình viên độc lập, khi không còn phụ thuộc vào phần cứng, máy chủ nữa.

Serverless giúp cho chúng ta không còn lo về chi phí duy trì máy chủ, không còn lo khi sản phẩm chưa có doanh thu đã phải trả tiền duy trì. Cho dù serverless là không hoàn hảo, nhưng với những ưu điểm nhiều hơn khuyết điểm và khả năng ứng dụng rộng lớn, serverless là một mảnh đất màu mỡ cho bạn phát triển.

Bạn không cần phải cân nhắc nhiều giữa các nền tảng, hãy chọn nền tảng nào bạn đã có kiến thức, hoặc được khuyến mại – giảm chi phí sử dụng. Các nhà hạ tầng luôn luôn phát triển, nên ngoại trừ về đặc điểm ngôn ngữ, các nhà cung cấp đều tương đương nhau. Hãy tập trung vào sản phẩm của mình là tốt rồi, khi có rào cản – tức là đã đạt giới hạn của sản phẩm – cũng có nghĩa là đã có thể có doanh thu, lợi nhuận thì lúc này mới nên tìm hiểu thêm để chuyển qua hệ thống cung cấp serverless khác là ổn nhất.

Quan điểm của Fullstack Station là đa năng, gọn nhẹ và không phụ thuộc, muốn trở thành lập trình viên độc lập thì càng nên học và ứng dụng serverless.

Tham khảo:

http://tech.vtijapan.co.jp/serverless-gioi-thieu-chung-chung/

https://serverless.com/learn/use-cases/

https://www.alibabacloud.com/blog/4-use-cases-of-serverless-architecture_593862

https://epsagon.com/the-best-5-use-cases-for-the-serverless-beginner/

The post Serverless là gì? Hãy sẵn sàng với serverless! appeared first on Fullstack Station.

]]>
https://fullstackstation.com/serverless-la-gi/feed/ 2
Danh sách dịch vụ máy chủ miễn phí https://fullstackstation.com/danh-sach-dich-vu-may-chu-mien-phi/ https://fullstackstation.com/danh-sach-dich-vu-may-chu-mien-phi/#respond Sat, 31 Dec 2016 07:25:42 +0000 https://www.businesscard.vn/blog/?p=860 Không phải ai cũng sẵn sàng bỏ ra 5-10$ cho một máy chủ bèo nhất hiện nay như của Vultr, DigitalOcean, OVH, Linode Bài viết này giới thiệu một số dịch vụ máy chủ miễn phí dành cho lập trình viên thường là trong giai đoạn thử nghiệm sản phẩm mới, đang lập trình chưa […]

The post Danh sách dịch vụ máy chủ miễn phí appeared first on Fullstack Station.

]]>
Không phải ai cũng sẵn sàng bỏ ra 5-10$ cho một máy chủ bèo nhất hiện nay như của Vultr, DigitalOcean, OVH, Linode Bài viết này giới thiệu một số dịch vụ máy chủ miễn phí dành cho lập trình viên thường là trong giai đoạn thử nghiệm sản phẩm mới, đang lập trình chưa hoàn thiện hoặc là các nhóm khởi nghiệp với số vốn ít ỏi. (Có thể bạn quan tâm: Vũ khí bí mật dành cho khởi nghiệp)

Những dịch vụ này có tài nguyên giới hạn (RAM < 1GB) hoặc một vài hạn chế nhất định, nhưng nếu bạn biết tận dụng và cấu hình tốt thì chi phí máy chủ cho khởi nghiệp là bằng 0. Các dịch vụ này hoạt động thường với nguyên tắc là “Pay as you go” tức là xài nhiêu trả nhiêu nên khá là thoải mái nếu sau này sản phẩm của bạn phát triển lên – nghĩa là có khách hàng, có thu nhập.

Danh sách dịch vụ máy chủ miễn phí

AppHarbor

Bảng giá

  • Miễn phí: 1 worker unit
  • Ưu điểm: auto scaling, deploy với git, đặc biệt hỗ trợ .NET
  • Giới hạn: không hỗ trợ việc sử dụng domain riêng của bạn

AWS EC2

Đăng ký

  • Miễn phí: 750 giờ/tháng cho gói t2.micro
  • Điểm mạnh: đầy đủ chức năng của VPS và toàn bộ tính năng của hệ thống AWS EC2
  • Giới hạn: 12 tháng cho mỗi đăng ký, tương ứng 1 credit card. 

GearHost

Bảng giá

  • Miễn phí: 1 shared node và 1 worker, 100MB lưu trữ, 1GB băng thông/tháng, tùy chỉnh tên miền
  • Ưu điểm: hỗ trợ .NET (4.6), PHP (5.3-5.5) và ứng ụng Node.js, cơ sở dữ liệu MSSQL và MySQL, dễ dàng xuất bản với FTP, WebDeploy hoặc trực tiếp từ Git/GitHub/Bitbucket.
  • Giới hạn:
    • Giới hạn tích lũy CPU (60 phút được cấp phát mỗi 24 giờ) và RAM (256 MB được cấp pháp cho mỗi giờ), 1 GB băng thông được cấp phát mỗi 24 giờ, 250 kết nối đồng thời (con số này đạt được thì kiếm được tiền rồi), không hỗ trợ SSL và chỉ hỗ trợ 32bit.
    • Khi mức sử dụng CPU, RAM, băng thông đạt giới hạn thì ứng dụng sẽ bị rơi vào trạng thái offfline và được sẽ hoạt động lại tới khi được reset.

Google App Engine

Trang sản phẩm

  • TấtMiễn phí: 28 giờ instance/ngày, băng thông 1GB chiều ra/ngày,băng thông 1GB vào/ngày.
  • Ưu điểm: thừa kế toàn bộ tính năng của hệ thống Google Cloud: được quản lý, tự động scale, load balancing, …
  • Giới hạn: chỉ hỗ trợ Python, Java, PHP và Go, vì đây là các môi trường chuẩn chỉ được chọn phiên bản nhất định ví dụ Python 2 hoặc Python 3, PHP 5 hoặc PHP 7. Còn với môi trường linh hoạt như Ruby và Node.js thì không được miễn phí.

Heroku

Bảng giá

  • Miễn phí: gói “dyno” (512MB RAM), tùy chỉnh tên miền
  • Ưu điểm: hỗ trợ nhiều ngôn ngữ (Node.js, Ruby, Java, PHP, Python, Go, Scala or Clojure)
  • Giới hạn: instance sẽ bị rơi vào trạng thái ngủ đông khi không có hoạt động, ví dụ web không có ai truy cập trong 30 phút thì nó sẽ bị ngủ đông. Khi có truy cập thì nó tự động khởi động và hoạt động bình thường. Mình đang dùng Heroku để triển khai Huginn, khá ngon 🙂

IBM Bluemix

Bảng giá

  • Miễn phí: gói 512MB/tháng
  • Ưu điểm: có thể triển khai các con VPS nhỏ với tổng cộng 512MB (Ví dụ: 4x128MB, 2x256MB…), hỗ trợ nhiều ngôn ngữ (Java, JS, Go, PHP, Python Ruby), hỗ trợ containers

OpenShift

Bảng giá

  • Miễn phí: 3 small gears (1 CPU, 512MB RAM and 1GB lưu trữ), tương đương 3 CPU, 1,5GB RAM và 3 GB lưu trữ
  • Ưu điểm: mỗi gear có thể để sử dụng để triển khai ứng dụng trong nhiều ngôn ngữ hoặc cơ sở dụng liệu, cũng có sẵn nhiều template cho việc triển khai.
  • Giới hạn:
    • Triển khai đòi hỏi phải cài đặt ựng dụng OpenShift.
    • Bị ngủ đông nếu trong 24h không có request.
    • Nếu ứng dụng rơi vô trạng thái ngủ đông thì mất hơn 30s để hoạt động trở lại.

Zeit Now

Bảng giá

  • Miễn phí: 1GB lưu trữ, băng thông 1GB tháng, 20 lần triển khai/tháng, miễn phí sao lưu
  • Ưu điểm: tự động scale, miễn phí sao lưu, có thể triển khai HTTP/2, sử dụng phiên bản mới nhất của Node.js. Tất nhiên là nó cũng có thể dùng để triển khai web tĩnh.
  • Giới hạn: mỗi tập tin có dung lượng tối đa 1MB (cái này thì cũng không cần lo lắm), không tùy chỉnh tên miền. Tuy nhiên, mã nguồn bị đặt ở chế độ công cộng là điểm trừ khá lớn.

Đánh giá

Tùy thuộc vào hệ thống của bạn sử dụng những công nghệ nào để chọn, nhưng theo đánh giá của mình (và có sử dụng một vài kỹ thuật tối ưu) thì máy chủ miễn phí sẽ có những thứ tự sau:

  1. OpenShift
  2. IBM Bluemix
  3. Heroku
  4. AWS EC2
  5. Google App Engine
  6. AppHarbor
  7. GearHost
  8. Zeit Now

Trong danh sách dịch vụ máy chủ miễn phí này thì tất nhiên xài cái nào cũng có giới hạn nhất định,. Nhưng mình chọn OpenShift đứng vị trí số vì ngoài tài nguyên nhiều nhất thì chúng ta cũng có thể khắc phục giới hạn của nó. Còn IBM Bluemix thì cũng khá linh động khi cho phép tạo nhiều VPS nhỏ và hỗ trợ container nữa. Heroku thì cũng có khắc phục được giới hạn thời gian.

Fullstack Station’s Tips

Trong bài giới thiệu về Next.js mình có nói về microservice, và cũng như sự lên ngôi của microservice trong thời gian tới. Mặc dù độ trễ khi kết nối các microservice là điều khó tránh khỏi nhưng về mặt linh động và hạn chế rủi ro thì microservice rất tốt. Với các dịch vụ máy chủ miễn phí này, bạn hoàn toàn có thể tự xây dựng cho mình một mạng lưới các microservice  như vậy để hạn chế chi phí trong quá trình lập trình.

Dưới đây là một số thủ thuật để nâng cao hiệu quả sử dụng các dịch vụ trên:

  • AWS EC2: bạn có thể dùng 1 credit card khác đăng ký để sử dụng thêm.
  • Các dịch vụ như Heroku, OpenShift bị ngủ đông sau 1 khoảng thời gian nhất định thì bạn dùng một máy khác và tạo cronjob để thực hiện request vào các máy này để không cho nó ngủ. Hoặc sử dụng các dịch vụ ngoài, hiện tại thì có UptimeRobot miễn phí với 50 monitors (tương đương 1 lệnh theo dõi)
  • Với các dịch vụ trong top 4 thì bạn có thể chạy 1 website nhỏ khá thoải mái, ngoài ra còn có thể sử dụng các dịch vụ này để làm một số tác vụ như:
    • Chạy cron
    • Chỉnh sửa hình ảnh
    • API đơn giản
    • Task queue: nếu sử dụng mô hình phân tán nhiệm vụ như Gearman bạn có thể tạo ra được một hệ thống mạnh mẽ, với tổng các dịch vụ được giới thiệu tầm 4GB RAM hơn 8 CPU, đây là một con số không hề nhỏ.

Kết

Hi vọng với việc giới thiệu các dịch vụ máy chủ miễn phí này, bạn có thể thoải mái tập trung vào việc phát triển sản phẩm trong thời gian lâu hơn, và có thể nắm rõ hệ thống microservice để hạn chế chi phí sau này. Mặc dù việc nghiên cứu sử dụng các dịch vụ này là cần có, cũng như những sự cố có thể xảy ra đòi hỏi tốn thời gian bảo trì. Tuy nhiên với những kinh nghiệm bạn trải qua đó, bạn hoàn toàn có thể tận dụng những máy chủ miễn phí này để xây dựng môi trường Production. Đây là một điều lý tưởng cho khởi nghiệp khi triển khai không tốn chi phí.

Chúc mọi người thành công trong năm mới 2017, Happy New Year!!!

 

The post Danh sách dịch vụ máy chủ miễn phí appeared first on Fullstack Station.

]]>
https://fullstackstation.com/danh-sach-dich-vu-may-chu-mien-phi/feed/ 0
Kỹ thuật lập trình web tĩnh để nâng cao bảo mật website https://fullstackstation.com/ky-thuat-lap-trinh-web-tinh-de-nang-cao-bao-mat-website/ https://fullstackstation.com/ky-thuat-lap-trinh-web-tinh-de-nang-cao-bao-mat-website/#comments Sat, 06 Aug 2016 09:25:46 +0000 https://www.businesscard.vn/blog/?p=590 Từ vụ tin tặc tấn công hệ thống VNAirlines ngày 30/7, cho thấy sự nguy hiểm của hệ thống thông tin như thế nào, phải luôn luôn có ý thức nâng cao bảo mật, quản trị rủi ro về hệ thống tốt nhất. Trong phạm vi về lập trình chúng ta cùng tìm hiểu xem […]

The post Kỹ thuật lập trình web tĩnh để nâng cao bảo mật website appeared first on Fullstack Station.

]]>
Từ vụ tin tặc tấn công hệ thống VNAirlines ngày 30/7, cho thấy sự nguy hiểm của hệ thống thông tin như thế nào, phải luôn luôn có ý thức nâng cao bảo mật, quản trị rủi ro về hệ thống tốt nhất. Trong phạm vi về lập trình chúng ta cùng tìm hiểu xem trong lĩnh vực web thì kỹ thuật nào được xem là an toàn nhất nhé. Tất nhiên, tấn công vào hệ thống hàng không thì phải nói là cao thủ rồi, cho nên cũng cần chuyên gia bảo mật để nói chuyện, mình không phải chuyên gia bảo mật nên bài viết này chỉ giới thiệu một cách tiếp cận về kỹ thuật lập trình web tĩnh, và những loại website nào nên áp dụng, công cụ, mô hình triển khai để đạt hiệu quả cao nhất.

Website tĩnh là gì

Website tĩnh là web không có nội dung thay đổi liên tục trong khoảng thời gian ngắn, chỉ toàn là html, javascript và css thôi. Không hề có kết nối API nào cả, nên dĩ nhiên máy chủ không có cơ sở dữ liệu. Nếu bạn sử dụng Github thì có thể biết tới Github Page, chúng ta viết bằng markdown và được máy chủ tạo (generate) thành html, hoàn toàn là website tĩnh.

Nói đến đây, chắc hẳn bạn nào đang theo dõi blog này cũng đều nghĩ “ồ, thật đơn giản, chỉ là môn học lập trình web cơ bản”, vì chắc bạn cũng đã từng học rồi. Với lại trong thế giới phẳng phát triển nhanh chóng như hiện nay, thì web tĩnh thiệt là lạc hậu, tuy nhiên sẽ là sai lầm nếu bạn chưa hiểu rõ web tĩnh có những ưu khuyết điểm đối với website của mình như thế nào. Chúng ta thường ưu tiên phát triển website động, đơn giản là vì nó nhanh, ngay cả blog này cũng sử dụng wordpress, nhanh gọn lẹ. Tuy nhiên, đó cũng chính là lỗ hổng bảo mật mà web động mang lại. Hơn nữa, khi website đạt đến một độ lớn nhất định nào đó, nằm top 1000 của VN chẳng hạn, thì vấn đề máy chủ bắt đầu trở nên phức tạp và tốn kém. Việc triển khai cân bằng tải (mức máy chủ, cơ sở dữ liệu, tài nguyên tĩnh) trở nên khó khăn hơn rất nhiều.

Ưu và khuyết của website tĩnh

Mặc dù gọi là lạc hậu, nhưng đây vẫn là cốt lõi của web, tất cả những gì hiển thị đến người dùng là html, css, js và phim, hình ảnh. Web tĩnh cũng có ưu điểm và khuyết điểm tương ứng với nhu cầu của website. Độ bảo mật của website tỉ lệ nghịch với chức năng tương tác của người dùng, có nghĩa là càng cho người dùng tương tác với với máy chủ (POST, PUT, DELETE) thì bảo mật càng thấp, tất nhiên ngay cả phương thức GET cũng chứa đầy nguy hiểm với các tham số đi kèm. Chúng ta xem danh sách ưu khuyết điểm của kỹ thuật lập trình web tĩnh sau:

Khuyết điểm

  • Khó cập nhật tức thì nội dung, giả sử có sai sót trong nội dung thì thời gian cập nhật sẽ lâu hơn so với web động
  • Trang web đơn thuần 1 chiều, không có tương tác từ người dùng

Ưu điểm

  • Tốc độ nhanh nhất, bạn dễ dàng áp dụng các kỹ thuật Pagespeed
  • An toàn nhất, loại trừ yếu tố bị tấn công từ bên trong máy chủ, việc tấn công 1 trang web tĩnh chỉ mở duy nhất port 80, 443 là rất khó, nếu không nói là không thể (trừ trường hợp lỗi của web server như Nginx, Apache thì cũng khá là hiếm).
  • Nhu cầu cấu hình máy chủ thấp, nên chi phí máy chủ thấp, cũng như các chi phí vận hành, bảo trì, sao lưu dự phòng.

Mặc dù có khuyết điểm, nhưng với ưu thế tuyệt đối về ưu điểm, và áp dụng cho phần lớn các website hiện nay. Ngoại trừ các website mang tính chất trao đổi nhiều như diễn đàn, hỏi đáp/thảo luận, thương mại điện tử, trò chơi trực tuyến, và hầu hết dịch vụ có tính chất trực tuyến. Vì đặc tính cập nhật theo thời gian, nên không thể sử dụng kỹ thuật lập trình web tĩnh được, còn các loại website khác (xem tiếp phần bên dưới) đều có thể áp dụng được.

Những loại website nào nên áp dụng

Hầu hết website đều có thể áp dụng được, đặc biệt là những loại website tương tác 1 chiều như Tin tức, Giới thiệu sản phẩm, Blog đều có thể sử dụng kỹ thuật web tĩnh để tăng cường hiệu quả. Những website thể loại diễn đàn như tinhte, webtretho nếu có ấn phẩm riêng, tức là những bài viết tuyển chọn, có biên tập tạo thành bài đọc 1 chiều cũng đều có thể sử dụng web tĩnh, không nhất thiết phải dùng web động.

Các website hiện nay đa phần đều có cho phép người dùng phản hồi, góp ý kiến, chức năng này nên tách riêng ra thành một dịch vụ riêng (nằm ở máy chủ khác độc lập), nằm ở 1 cụm máy chủ khác (xem mục Mô hình triển khai bên dưới), hoặc sử dụng các dịch ngoài như Facebook Comment, Google+, Disqus là đủ. Nói đến đây, bạn cũng có thể liên tưởng đến phân quyền người dùng trong hệ thống, có những tài nguyên chỉ cho phép đọc, hoặc tài khoản dùng để kết nối database cũng có thể chia làm 2 loại: đọc và ghi (bao gồm thêm, xóa, sửa). Nếu bạn là dân lập trình web PHP, cũng có thể xem thêm qua bài Những lỗi lập trình viên PHP hay mắc phải, trong đó có đề cập đến 1 số lỗi liên quan bảo mật để hạn chế những rủi ro không đáng.

Đối với loại website có tài khoản người dùng, có thể chia ra thành 2 loại server khác nhau, một máy chủ chứa dữ liệu chỉ đọc bao gồm tài nguyên tĩnh có thể truy xuất ở chế độ công cộng (public – http://tên-miền.com), một máy chủ chứa dữ liệu có thể thay đổi ở cơ sở dữ liệu nằm riêng (Ví dụ: http://my.tên-miền.com)

Kỹ thuật lập trình Server Side Include (SSI)

Kỹ thuật thêm (include) tài nguyên từ nhiều tập tin khác nhau không có gì mới khi bạn sử dụng ngôn ngữ lập trình động (PHP, Python, Ruby, Js hay .Net). Tuy nhiên, kỹ thuật SSI bằng webserver lại ít được biết đến, vì nó không nằm trong các chương trình giảng dạy, hoặc nếu có thì hầu như không được chú ý. Với kỹ thuật web tĩnh, máy chủ web chỉ cài đặt duy nhất web server mà không có hỗ trợ ngôn ngữ động, không PHP, không Nodejs, không Ruby, … (Mặc dù có thể cài đặt  để chạy ở chế độ cli, còn ngoài ra các request đến server đều được trả về bằng tập tin tĩnh hết, tuy nhiên mình khuyến nghị không nên cài nếu không cần thiết)

Giống nhau

  • Đều là hành động thêm một tập tin khác

Khác nhau

  • Ngôn ngữ lập trình động có thể include tập tin cùng loại, hoặc tập tin html
  • SSI chỉ có thể include html, nhưng đặc biệt là có thể include “kết quả xử lý” từ ngôn ngữ động

Ví dụ xét đoạn mã SSI của Nginx sau:

<!--# include virtual="http://server-B/remote/body.php?argument=value" wait="yes" -->

Đoạn mã trên được sử dụng trong 1 tập tin của server A, và lấy nội dung trả về từ server B, sau đó trả về cho khách. Đây chỉ là ví dụ để bạn hình dung về việc include, chứ trong thực tế thì cách include như trên ảnh hưởng đến tốc độ của máy chủ. Nếu như hai máy chủ được nằm trong 1 cụm chung data-center thì tốc độ cũng gọi là chấp nhận.

Qua ví dụ này, bạn cũng có thể thấy rõ là cấu trúc động-tĩnh hoàn toàn có thể ăn khớp với nhau, cũng giống như quảng cáo gắn trên mỗi trang, thay đổi theo thời gian, bài viết, đối tượng…thì cũng gọi là động rồi (động ở đây sử dụng javascript để lấy dữ liệu – khác với kỹ thuật SSI nhé). Vậy nên phân chia tài nguyên, nhiệm vụ cho từng máy chủ là rất cần thiết, vừa nâng cao hiệu quả hoạt động, tốc độ tốt lại bảo mật hơn.

Sử dụng cho Nginx: http://nginx.org/en/docs/http/ngx_http_ssi_module.html

Sử dụng cho Apache: https://httpd.apache.org/docs/current/howto/ssi.html

Công cụ

Hiện tại đã có một website tập hợp tất cả các công cụ mã nguồn mở:

https://www.staticgen.com/

Bạn chỉ cần sử dụng các công cụ trên tương ứng với framework và ngôn ngữ lập trình. Công cụ đó sẽ tạo ra file tĩnh, và bạn chỉ cần thiết lập cơ chế đồng bộ tuỳ theo độ lớn của website.

Nếu hệ thống là tự lập trình ra, thì chắc là khó có công cụ đáp ứng đúng, vì vậy phải tốn công sức để tạo ra html từ hệ thống. Tuy nhiên, kỹ thuật này thì không có gì khó khăn cả, quan trọng là bạn có áp dụng hay không mà thôi.

Mô hình triển khai máy chủ

Mô hình

Kỹ thuật lập trình web tĩnh

Mô hình này ở trên được triển khai với 6 (hoặc 8 nếu tách database) máy chủ, bao gồm:

  • 2 máy chủ sử dụng HA Proxy cấu hình nhỏ gọn để cân bằng tải, không cần cũng được, tuy nhiên đối với website lớn thì rất cần thiết.
  • 2 máy chủ chỉ cài đặt máy chủ web (Nginx hoặc Apache) đơn giản nhất, không cài thêm bất cứ module nào nếu bạn không thực sự nắm chắc sự cần thiết.
  • 2 máy chủ chính dùng để cái hệ thống quản lý (CMS, Blog, …), được đặt trong một lớp mạng riêng với 2 máy chủ web ở trên. Và chỉ đồng bộ dữ liệu 1 chiều từ 2 máy chủ (Main System) lên máy chủ web (Static files server). Để đạt độ bảo mật an toàn thì 2 máy chủ này chỉ được phép truy cập từ mạng nội bộ.
  • 2 máy chủ chứa database cài đặt cơ chế Replicator (Master-Slave hoặc cả 2), nếu tình hình tài chính eo hẹp, có thể thu gọn 2 máy chủ này vào 2 máy chủ Main System.
  • Các đường kết nối màu xanh và đỏ chỉ sự tương tác 1 chiều, đây là điều rất quan trọng để giảm thiểu các con đường, phương thức tấn công. Đường màu đen được diễn tả tương tác 2 chiều, ví dụ một truy vấn (request)  [GET] từ người dùng và phản hồi (response) từ máy chủ.

Mô hình ở trên được áp dụng cho công ty cần độ bảo mật cao, tốc độ và an toàn dữ liệu. Thường được sử dụng cho các công ty tài chính cỡ vừa, với công ty thuộc lĩnh vực ngân hàng thì cần mô hình tốt hơn chút.

Tuy nhiên, các công ty dù hệ thống lớn ra sao vẫn sử dụng kỹ thuật lập trình web động, rất ít công ty nghĩ đến web tĩnh như một cách bảo mật và tối ưu tốc độ.

Mô hình rút gọn của mô hình trên chỉ còn 2 máy chủ: 1 Main System và 1 cho Static files server. Vẫn hoạt động với nguyên tắc đồng bộ 1 chiều từ Main System -> Static files server.

Nguyên tắc, cơ chế đồng bộ

  • Chủ động: máy chủ Main Server xác định khi nào có nội dung mới (Xuất bản/Publish) để đồng bộ lên máy chủ Static files Server. Việc xác định này có thể dễ dàng làm được với việc ra lệnh từ Main System.
  • Bị động: máy chủ Main Server sử dụng cronjob để đồng bộ lên Static files Server định kỳ theo khoảng n giây định sẵn. Thường là khoảng 10 phút, hoặc 30 phút…tất cả tuỳ theo mức độ tần suất cập nhật nội dung của nghiệp vụ.

Kết luận

Các công ty lớn thường đầu tư vào hệ thống phần cứng mà ít chú trọng đến giải pháp phần mềm, thường cho ra việc ngân sách phình lên một cách không cần thiết. Với việc áp dụng giải phép phần mềm với kỹ thuật lập trình web tĩnh được trình bày ở đây, chi phí có thể giảm đi một nửatốc độ được cải thiện lên ít nhất là gấp đôi. Hơn nữa, với sức mạnh của các hệ thống Cloud mạnh như Google Cloud và Amazon thì việc phân tầng lớp mạng giữa các server trong cùng hoặc khác nhóm là rất dễ dàng.

Như vậy, lợi ích của kỹ thuật lập trình web tĩnh làm cho việc xây dựng hệ thống web trở nên an toàn hơn, tốc độ cao và tiết kiệm chi phí. Hi vọng qua bài này, sẽ có nhiều đơn vị quản lý website cũng như các bạn lập trình web có cái nhìn về kỹ thuật mang lại nhiều điều tốt như vậy.

The post Kỹ thuật lập trình web tĩnh để nâng cao bảo mật website appeared first on Fullstack Station.

]]>
https://fullstackstation.com/ky-thuat-lap-trinh-web-tinh-de-nang-cao-bao-mat-website/feed/ 1
Hướng dẫn cài đặt V8JS cho PHP trên Centos 7 https://fullstackstation.com/huong-dan-cai-dat-v8js-cho-php7-tren-centos/ https://fullstackstation.com/huong-dan-cai-dat-v8js-cho-php7-tren-centos/#respond Tue, 12 Jan 2016 02:06:48 +0000 https://www.businesscard.vn/blog/?p=14 Giới thiệu Từ khi Google giới thiệu V8 Engine, không ngoa khi nói rằng đó là nền tảng cho Javascript thăng hoa, vài dự án nổi tiếng phát triển dựa trên V8 là Google Chrome, Node Js, Mongo Db. Trong đó, với Google Chrome, giờ đã chiếm thị phần quá nửa trên thị phần trình duyệt, […]

The post Hướng dẫn cài đặt V8JS cho PHP trên Centos 7 appeared first on Fullstack Station.

]]>
Giới thiệu

Từ khi Google giới thiệu V8 Engine, không ngoa khi nói rằng đó là nền tảng cho Javascript thăng hoa, vài dự án nổi tiếng phát triển dựa trên V8 là Google Chrome, Node Js, Mongo Db. Trong đó, với Google Chrome, giờ đã chiếm thị phần quá nửa trên thị phần trình duyệt, cũng nhờ đó mà javascript cho trình duyệt cũng trở nên phát triển trong thời kỳ rực rỡ, và hơn hết là Node Js, nền tảng thực thi javascript dựa trên V8 chạy ở phía server rất mạnh mẽ không kém gì các ngôn ngữ PHP, Python, Ruby, .Net mà còn nhỉnh hơn trong các ứng dụng thời gian thực (realtime). Bài viết này sẽ hướng dẫn cài đặt V8JS trên Cent OS 7.

V8 Engine là gì?

Trang chủ V8 [Github]

Như đã giới thiệu cơ bản ở trên, V8 là một bộ máy (engine) được viết bằng C++ thực thi Javascript theo EcmaScript (đọc thêm bài ES2015 là gì), biên dịch Javascript ra mã máy (IA-32, x86-64, ARM, hay là MIPS ISAs …)

Do biên dịch Javascript ra mã máy, nên tốc độ của V8 Engine là rất nhanh, cũng như được nâng cấp kỹ thuật cache để gia tăng tốc độ cho Javascript.

Từ trước khi V8 Engine ra đời, Javascript chỉ thực hiện ở trên trình duyệt: chậm và thiếu nhiều tính năng. Node Js ra đời dựa trên V8 Engine và đã chiếm được rất nhiều tình cảm từ cộng đồng lập trình viên trên toàn thế giới. Ngay tại thời điểm bạn đọc bài viết này, Node Js được dùng bởi hầu hết lập trình viên Frontend thông qua Bower hoặc NPM cho cả Frontend, và phía server.

V8 Js là gì?

Trang chủ thư viện PHPV8/V8Js [Github]

Node Js thực thi Javascript cho ngôn ngữ phía server và rất mạnh mẽ. Tuy nhiên, tại thời điểm viết bài Node Js cũng chỉ mới có 7 năm tuổi đời, còn PHP có đến 20+ tuổi đời, số lượng lập trình viên PHP trên thế giới rất đông đảo. Vậy làm sao lập trình viên PHP tận dụng được sức mạnh của V8 trong sản phẩm của mình?

Tận dụng được sức mạnh của V8: thực thi Javascript trong PHP là lý do V8 Js ra đời. Bộ thư viện mở rộng V8Js giúp PHP có thể thực thi Javascript ngay trong chính ngôn ngữ PHP.

<?php
class Foo {
  var $bar = null;
}
$v8 = new V8Js();
$v8->foo = new Foo;
// This prints "no"
$v8->executeString('print( "bar" in PHP.foo ? "yes" : "no" );');
?>

Đoạn code ở trên cho thấy có thể sử dụng javascript ngay trong PHP. Đọc đến đây bạn có thể có bạn đặt câu hỏi: Chạy javascript trên Server làm gì?

Bạn có thể viết ứng dụng từ React Js phát triển cho client-side (Đọc thêm bài React Js là gì?), và sử dụng lại code đó cho server-side, được gọi từ PHP code. Bản thân cách sử dụng lại code này có thể đạt được bởi dùng Node Js, nhưng nếu bạn đã có website sử dụng PHP và muốn phát triển client-side bằng React Js thì V8Js sẽ giúp bạn đạt được điều này một cách dễ dàng.

Hướng dẫn cài đặt V8 Js

Chuẩn bị:

  • CentOS 7
  • Quyền sudo, hoặc tài khoản root.

Bước 1: chuẩn bị các thư viện cần thiết

yum -y update
# Install EPEL repo
rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
# Install build tools
yum -y install gcc-c++ pcre-devel zlib-devel make unzip 
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm

Bước 2: cài đặt PHP 5 hoặc 7

Nếu bạn đã có PHP rồi có thể bỏ qua bước này.

PHP 7:

# Install PHP 7
yum -y install --enablerepo=webtatic php70w php70w-common php70w-fpm php70w-cli php70w-opcache php70w-pear php70w-devel php70w-intl php70w-mbstring php70w-mcrypt

PHP 5.6:

# Install PHP 5.6
yum -y install --enablerepo=webtatic php56w php56w-common php56w-fpm php56w-cli php56w-opcache php56w-pear php56w-devel php56w-intl php56w-mbstring php56w-mcrypt

Bước 3: Cài đặt GIT

[Quan trọng]: do GIT cài đặt sẵn, hoặc bạn cài từ lệnh YUM thì phiên bản này cũ không phù hợp với một số lệnh mới để cài đặt V8

# Install Git latest  
yum -y install curl-devel expat-devel gettext-devel openssl openssl-devel zlib-devel bzip2
yum -y install gcc perl-ExtUtils-MakeMaker

cd /usr/src && 
    git clone https://github.com/git/git
cd /usr/src/git && make prefix=/usr/local/git all && make prefix=/usr/local/git install
yum -y remove git

# Use new Git
PATH /usr/local/git/bin:$PATH

Bước 4: Cài đặt V8

# Install Depot Tools
cd /usr/src && git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
PATH /usr/src/depot_tools:$PATH

# Install v8
cd /usr/src && fetch v8
cd /usr/src/v8 && make native library=shared snapshot=off -j 4

cp -R /usr/src/v8/out/native/lib.target/lib* /lib64/
cp /usr/src/v8/out/native/obj.target/tools/gyp/libv8_libplatform.a /usr/lib64/
cp -R /usr/src/v8/include /usr/local

Bước 5: Cài đặt V8Js

PHP 7:

# Install v8js 
echo "/usr/lib64" | pecl install v8js-1.0.0

PHP 5.6:

# Install v8js 
echo "/usr/lib64" | pecl install v8js

Bạn có thể thấy đây là mục đích cuối cùng, cài V8Js, nhưng đó lại là bước dễ nhất! Nhưng để đạt được bước này, mình đã trải qua nghiên cứu, cài đặt thử nghiệm trên CentOs 6, 7 trong mấy ngày để tìm đủ các thư viện để hoàn thiện các bước từ 1->4.

Đến bước này thì bạn đã cài đặt V8Js thành công rồi đó.

Thêm dòng này vào php.ini

echo extension=v8js.so > /etc/php.d/v8js.ini

Bước 6: Kiểm tra

php -m | grep v8
#### Display ####
# v8js
# Check V8Js class
php -r 'var_dump(get_declared_classes());' | grep V8
#### Display ####
# string(4) "V8Js"
# string(13) "V8JsException"
# string(19) "V8JsScriptException"
# string(22) "V8JsTimeLimitException"
# string(24) "V8JsMemoryLimitException"
# string(8) "V8Object"
# string(10) "V8Function"
# Check method
php -r '$class = new ReflectionClass("V8Js"); var_dump($class->getMethods());'
#### Display ####
# array(14) {
# [0]=>
# object(ReflectionMethod)#2 (2) {
# ["name"]=>
# string(11) "__construct"
# ["class"]=>
# string(4) "V8Js"
# }
# [1]=>
# object(ReflectionMethod)#3 (2) {
# ["name"]=>
# string(7) "__sleep"
# ["class"]=>
# string(4) "V8Js"
# }
# Excute test v8js
php -r '$v8 = new V8Js(); var_dump($v8->executeString("1+2+3"));'
#### Display ####
# int(6)

Nếu bạn chạy các dòng trên có kết quả như trên thì bạn đã hoàn toàn cài đặt V8Js thành công rồi. Từ bây giờ bạn có thể sử dụng Javascript trong PHP một cách thoải mái rồi nhé.

Docker: V8Js/PHP7/Nginx trên CentOS 7

Dành cho mục đích test V8Js trên PHP là cái quái gì? Mình đã tạo ra 1 image và phát hành trên Docker Hub:

https://hub.docker.com/r/virusvn/docker-centos-v8js/

Chỉ cần pull về, thực hiện SSH vào trong container thì sẽ thực thi được các lệnh Javascript trong PHP. Nếu bạn chưa biết Docker là gì, thì Fullstack Station cũng đã viết 1 bài giới thiệu tại đây.

The post Hướng dẫn cài đặt V8JS cho PHP trên Centos 7 appeared first on Fullstack Station.

]]>
https://fullstackstation.com/huong-dan-cai-dat-v8js-cho-php7-tren-centos/feed/ 0
Tối ưu tốc độ website bằng module pagespeed cho Nginx https://fullstackstation.com/toi-uu-toc-do-website-bang-module-pagespeed-cho-nginx/ https://fullstackstation.com/toi-uu-toc-do-website-bang-module-pagespeed-cho-nginx/#respond Sat, 09 Jan 2016 19:07:00 +0000 https://www.businesscard.vn/blog/?p=206 Tối ưu tốc độ website là gì? Để một website có nội dung động (như blog Fullstack Station này) trải qua rất nhiều bước: Viết code PHP/Python/Ruby, kết nối cơ sở dữ liệu, process engine sẽ kết hợp dữ liệu từ cơ sở dữ liệu với HTML cho ra web với giao diện hoàn thiện. Sau đó, web […]

The post Tối ưu tốc độ website bằng module pagespeed cho Nginx appeared first on Fullstack Station.

]]>
Tối ưu tốc độ website là gì?

Để một website có nội dung động (như blog Fullstack Station này) trải qua rất nhiều bước: Viết code PHP/Python/Ruby, kết nối cơ sở dữ liệu, process engine sẽ kết hợp dữ liệu từ cơ sở dữ liệu với HTML cho ra web với giao diện hoàn thiện. Sau đó, web server sẽ trả kết quả HTML/CSS/JS đã được biên dịch này về trình duyệt web (browser). Mỗi công đoạn trong quá trình trên cần được tối ưu để website đạt tốc độ tốt nhất.

Có nhiều kỹ thuật để tối ưu tốc độ website (nén file, nén hình ảnh, lazy load…), và tối ưu web server là một trong những thành phần quan trọng nhất. Mình giới thiệu đến các bạn cách cài đặt module pagespeed (mod_pagespeed) cho nginx trên Centos 7.

Chú ý: nếu bạn muốn dùng Centos nhưng chưa tự tay cài server bao giờ hoặc muốn cài đặt nhanh, mình khuyến nghị dùng CentMin Mod để cài đặt Nginx, Maria Mysql DB, PHP-FPM, Opcache, Memcached…

Giới thiệu module PageSpeed

Module PageSpeed là một dự án của Google, ở Google việc tối ưu tốc độ website là cực kỳ quan trọng. Họ luôn phát triển các công cụ, kỹ thuật để làm cho website chạy nhanh nhất có thể, có thể kể ra một vài dự án như: Google Chrome (tất nhiên có nhiều mục đích khác nữa, nhưng ít nhất nó cũng có tốc độ tải trang nhanh hơn các trình duyệt khác), Pagespeed Insights (Công cụ kiểm tra các yếu tốc tốc độ của website), mod Pagespped

Các kỹ thuật tối ưu tốc độ sẽ được giới thiệu trong loạt bài “Tối ưu tốc độ cho website”.

Nếu bạn sử dụng website bằng WordPress, thì có lẽ plugin [W3 Total Cache] cũng đủ dùng, tuy nhiên nếu bạn dùng nền tảng khác không có plugin tương tự hoặc website là do bạn viết thì bài viết này sẽ giúp ích nhiều cho bạn. Ngay cả khi dùng WordPress với W3 Total Cache thì nếu dùng thêm mod pagespeed vẫn hiệu quả hơn bạn nhé, ngoài ra còn có rất nhiều tính năng rất hay.

Kiểm tra trước khi tối ưu tốc độ

Đây là điểm số của blog trên Pingdom: (Thời điểm dùng domain businesscard.vn)

businesscard-blog-before-pagespeed

Đây là thông số hệ thống:

  • Nền tảng: WordPress 4.4
    • Plugin cache (ví dụW3 Total Cache): không hoạt động. Để dễ dàng đánh giá nên mình không bật chức năng này lên.
  • Máy chủ: Centos 7
  • Máy chủ web: Nginx 1.9.9
  • Preprocessor: PHP7 với Zend OPcache
  • HTTP/2 + SSL: hoạt động. (SSL của mình đã tối ưu mức A+ tại SSLLabs)

Mặc dù đã dùng ZendOpcache và HTTP/2 mà như bạn thấy ở hình test ở trên, chậm hơn 78% website khác đã test tại Pingdom, hix hix. Sao mà chậm quá vậy !!!

View source xem thử:

bc-blog-script-source

=> Rất nhiều file Css và Js sẽ làm cho website tải lâu hơn

businesscard-blog-source

=> Còn rất nhiều khoảng trắng và các dòng ghi chú (comment) => website sẽ nặng nên chậm hơn, đó là những thứ không cần thiết cần phải được loại bỏ.

Yah, phải khắc phục thôi!!!!!!!!!

Bắt đầu tối ưu tốc độ

Yêu cầu để thực hiện theo bài viết:

  • Máy chủ Centos 6 hoặc 7, có quyền root.
  • Máy chủ web: Nginx (Đối với các bạn dùng Apache, sẽ có bài viết khác nhé)

Bước 1: cài đặt các thư viện cần thiết

sudo yum install wget curl unzip gcc-c++ pcre-devel zlib-devel

Bước 2: tìm phiên bản mới nhất

Vào trang chủ chính thức của Nginx, bạn sẽ nhìn thấy phiên bản mới nhất, nhớ chọn phiên bản đầu tiên của Mainline version nhé. Nhớ số phiên bản này, hiện tại là 1.9.9

Bước 3: tải mã nguồn Nginx

NGINX_VERSION=1.9.9 #khai báo phiên bản Nginx đã xác định ở trên
cd /usr/src #Mình có thói quen build source từ thư mục này 
sudo wget http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz 
sudo tar zxvf nginx-${NGINX_VERSION}.tar.gz

Bước 4: xác định phiên bản mã nguồn PageSpeed mới nhất

Vào Github Repo, vào mục Branch/Tag, sẽ thấy phiên bản mới nhất:

pagespeed-git

Theo hình trên thì phiên bản mới nhất là: v.1.10.33.2-beta [chỉ cần nhớ 1.10.33-2]

Bước 5: tải & giải nén pagespeed

NPS_VERSION=1.10.33.2 #dòng này khai báo phiên bản của Pagespeed
cd /usr/src
sudo wget https://github.com/pagespeed/ngx_pagespeed/archive/release-${NPS_VERSION}-beta.zip -O release-${NPS_VERSION}-beta.zip
unzip release-${NPS_VERSION}-beta.zip
cd ngx_pagespeed-release-${NPS_VERSION}-beta/
wget https://dl.google.com/dl/page-speed/psol/${NPS_VERSION}.tar.gz
tar -xzvf ${NPS_VERSION}.tar.gz  # extracts to psol/

Bước 6: bắt đầu build

cd /usr/src/nginx-${NGINX_VERSION}/
# vì nên bật http/2 và ssl luôn
./configure --add-module=/usr/src/ngx_pagespeed-release-${NPS_VERSION}-beta --with-http_v2_module --with-http_ssl_module
make
sudo make install
# Sau khi chạy xong, kiểm tra lại:
ls /usr/local/nginx
#Nếu thấy: "conf html logs sbin" có nghĩa là đã build xong

Bước 7: tạo script init

sudo nano /etc/init.d/nginx

Copy script này vào:

#!/bin/sh
#
# nginx - this script starts and stops the nginx daemon
#
# chkconfig:   - 85 15
# description:  NGINX is an HTTP(S) server, HTTP(S) reverse 
#               proxy and IMAP/POP3 proxy server
# processname: nginx
# config:      /etc/nginx/nginx.conf
# config:      /etc/sysconfig/nginx
# pidfile:     /var/run/nginx.pid

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0

nginx="/usr/sbin/nginx"
prog=$(basename $nginx)

NGINX_CONF_FILE="/etc/nginx/nginx.conf"

[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx

lockfile=/var/lock/subsys/nginx

make_dirs() {
   # make required directories
   user=`$nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=([^ ]*).*/1/g' -`
   if [ -z "`grep $user /etc/passwd`" ]; then
       useradd -M -s /bin/nologin $user
   fi
   options=`$nginx -V 2>&1 | grep 'configure arguments:'`
   for opt in $options; do
       if [ `echo $opt | grep '.*-temp-path'` ]; then
           value=`echo $opt | cut -d "=" -f 2`
           if [ ! -d "$value" ]; then
               # echo "creating" $value
               mkdir -p $value && chown -R $user $value
           fi
       fi
   done
}

start() {
    [ -x $nginx ] || exit 5
    [ -f $NGINX_CONF_FILE ] || exit 6
    make_dirs
    echo -n $"Starting $prog: "
    daemon $nginx -c $NGINX_CONF_FILE
    retval=$?
    echo
    [ $retval -eq 0 ] && touch $lockfile
    return $retval
}

stop() {
    echo -n $"Stopping $prog: "
    killproc $prog -QUIT
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f $lockfile
    return $retval
}

restart() {
    configtest || return $?
    stop
    sleep 1
    start
}

reload() {
    configtest || return $?
    echo -n $"Reloading $prog: "
    killproc $nginx -HUP
    RETVAL=$?
    echo
}

force_reload() {
    restart
}

configtest() {
  $nginx -t -c $NGINX_CONF_FILE
}

rh_status() {
    status $prog
}

rh_status_q() {
    rh_status >/dev/null 2>&1
}

case "$1" in
    start)
        rh_status_q && exit 0
        $1
        ;;
    stop)
        rh_status_q || exit 0
        $1
        ;;
    restart|configtest)
        $1
        ;;
    reload)
        rh_status_q || exit 7
        $1
        ;;
    force-reload)
        force_reload
        ;;
    status)
        rh_status
        ;;
    condrestart|try-restart)
        rh_status_q || exit 0
            ;;
    *)
        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
        exit 2
esac

Cho phép script quyền thực thi:

sudo chmod +x /etc/init.d/nginx

Nếu trường hợp bạn đang sử dụng nginx đã cài bằng lệnh yum rồi:

#backup phiên bản nginx đang chạy
sudo mv /usr/sbin/nginx /usr/sbin/nginx.yum

Cài đặt vào thư mục sbin:

sudo ln -fs /usr/local/nginx/sbin/nginx /usr/sbin/nginx

Cài đặt cấu hình:

sudo ln -s /usr/local/nginx/conf/ /etc/nginx
# dùng để server tự bật nginx lên sau khi restart sudo chkconfig nginx on

Sau bước này, bạn đã cài đặt xong Nginx + mod Pagespeed, bây giờ chỉ việc kích hoạt lên

Bước 8: Kích hoạt mod pagespeed

sudo mkdir -p /var/ngx_pagespeed_cache
#user nginx được lấy trong file /etc/nginx/nginx.conf, có thể của bạn là nobody
sudo chown -R nginx:nginx /var/ngx_pagespeed_cache

Thêm các dòng sau vào trong block server của nginx.conf:

##
# Pagespeed main settings

pagespeed on;
pagespeed FileCachePath /var/ngx_pagespeed_cache;

# Ensure requests for pagespeed optimized resources go to the pagespeed
# handler and no extraneous headers get set.

location ~ ".pagespeed.([a-z].)?[a-z]{2}.[^.]{10}.[^.]+" { add_header "" ""; }
location ~ "^/ngx_pagespeed_static/" { }
location ~ "^/ngx_pagespeed_beacon" { }

 # Filter settings
pagespeed RewriteLevel CoreFilters;
pagespeed EnableFilters collapse_whitespace,remove_comments,combine_css,rewrite_css,combine_javascript,rewrite_javascript;

Nếu bạn add như trên vào nginx, thì tất cả các website đều được bật pagespeed, nếu bạn muốn chỉ một vài website đặc biệt chạy mod pagespeed thì đừng thêm vào nginx.conf mà thêm vào file config của website đặc biệt đó ví dụ: /etc/nginx/conf.d/www.example.conf

Start nginx

sudo service nginx start

Cuối cùng kiểm tra thành quả:

bc-after-ps

Oh, đã nhanh hơn 46% rồi đó. (Phần nội dung website đã giảm từ 1.6MB xuống ~900KB)

Để hiểu hết ý nghĩa của các bộ lọc này, bạn đọc thêm bài viết Ý nghĩa của các bộ lọc trong module Pagespeed và cách sử dụng để tối ưu hóa tốc độ website

Kết luận:

Từ chậm hơn 78% lên mức nhanh hơn 46% quả là không tệ phải không bạn? Tuy nhiên đây chưa phải là mức cao mà Fullstack Station nhắm đến, nếu các bạn thực hiện hết tất cả các tiêu chuẩn kỹ thuật mà seri “Tối ưu hóa tốc độ website” mang lại, mình đảm bảo tốc độ sẽ nằm ở mức “nhanh hơn 80%

The post Tối ưu tốc độ website bằng module pagespeed cho Nginx appeared first on Fullstack Station.

]]>
https://fullstackstation.com/toi-uu-toc-do-website-bang-module-pagespeed-cho-nginx/feed/ 0
Ý nghĩa và cách sử dụng bộ lọc của Pagespeed https://fullstackstation.com/y-nghia-trong-danh-sach-bo-loc-cua-pagespeed-va-cach-su-dung/ https://fullstackstation.com/y-nghia-trong-danh-sach-bo-loc-cua-pagespeed-va-cach-su-dung/#respond Sat, 09 Jan 2016 01:48:38 +0000 https://www.businesscard.vn/blog/?p=213 Trang chủ pagespeed cho Nginx: http://ngxpagespeed.com/ Cách bật tắt: # Bật pagespeed on; # Tắt pagespeed off; Cách thêm hoặc bớt bộ lọc (filter): # Khai báo một dòng pagespeed EnableFilters filter_1,filter_2,...,module_2; # Khai báo nhiều dòng pagespeed EnableFilters filter_1,filter_2,...,module_2; pagespeed EnableFilters filter_1,filter_2,...,module_2; Danh sách các bộ lọc của Google Pagespeed rất nhiều nên ở đây mình […]

The post Ý nghĩa và cách sử dụng bộ lọc của Pagespeed appeared first on Fullstack Station.

]]>
Trang chủ pagespeed cho Nginx: http://ngxpagespeed.com/

Cách bật tắt:

# Bật
pagespeed on;
 
# Tắt
pagespeed off;

Cách thêm hoặc bớt bộ lọc (filter):

# Khai báo một dòng
pagespeed EnableFilters filter_1,filter_2,...,module_2;
 
# Khai báo nhiều dòng
pagespeed EnableFilters filter_1,filter_2,...,module_2;
pagespeed EnableFilters filter_1,filter_2,...,module_2;

Danh sách các bộ lọc của Google Pagespeed rất nhiều nên ở đây mình sẽ liệt kê ra các bộ lọc thường dùng, dễ hiểu nhất để các bạn tham khảo. Ngoài ra các bạn nên tham khảo qua danh sách toàn bộ bộ lọc có ở trang chủ Pagespeed tại đây.

  • combine_heads
    • CoreFilters: No
    • OptimizeForBandwidth: No
    • Tự gộp nếu website có nhiều thẻ <head> được tìm thấy trong tài liệu.
  • inline_import_to_link
    • CoreFilters: Yes
    • OptimizeForBandwidth: No
    • Tự tạo một tập tin CSS và chèn vào thẻ <link> nếu website chứa thẻ <style> và trong đó có sử dụng @import.
  • outline_css
    • CoreFilters: No
    • OptimizeForBandwidth: No
    • Gộp các đoạn CSS được chèn trực tiếp vào website ở thẻ <style> vào một file CSS đệm và chèn vào thẻ <link>.
  • outline_javascript
    • CoreFilters: No
    • OptimizeForBandwidth: No
    • Gộp các đoạn Javascript được chèn trực tiếp vào website ở thẻ <script> vào một file JS đệm và chèn vào thẻ <link>.
  • move_css_above_scripts
    • CoreFilters: No
    • OptimizeForBandwidth: No
    • Tự động đưa toàn bộ CSS của website lên trên các đoạn Javascript, hay nói cách khác là ép website tải CSS trước khi tải Javascript.
  • combine_css
    • CoreFilters: Yes
    • OptimizeForBandwidth: No
    • Tự nén nhiều file CSS vào trong một file CSS chung để giảm số lượng request trong website.
  • rewrite_css
    • CoreFilters: Yes
    • OptimizeForBandwidth: Yes
    • Rewrite lại CSS – việc rewrite này sẽ tối ưu CSS bằng cách tự bỏ các đoạn comment, xóa khoảng trắng, lưu cache cho các file ảnh có trong CSS,…
  • rewrite_style_attributes
    • CoreFilters: No
    • OptimizeForBandwidth: No
    • Kích hoạt rewrite cho các đoạn CSS nằm trong một thẻ nào được được khai báo bằng tham số style=”…”.
  • flatten_css_imports
    • CoreFilters: Yes
    • OptimizeForBandwidth: No
    • Tách nội dung của một file CSS được chèn vào bằng thẻ @import vào thẻ <style>.
  • prioritize_critical_css
    • CoreFilters: No
    • OptimizeForBandwidth: No
    • Tự động tách các thành phần CSS quan trọng trong website và đưa lên đầu website để nó tải trước.
  • make_google_analytics_async
    • CoreFilters: No
    • OptimizeForBandwidth: No
    • Tự động chuyển đoạn mã theo dõi của Google Analytics về kỹ thuật tải không đồng bộ (async). Tức là chỉ tải sau khi website tải xong CSS.
  • rewrite_javascript
    • CoreFilters: Yes
    • OptimizeForBandwidth: Yes
    • Rewrite lại Javascript – việc rewrite sẽ giúp nén file .js lại bằng cách bỏ comment, bỏ khoảng trắng.
  • combine_javascript
    • CoreFilters: Yes
    • OptimizeForBandwidth: No
    • Gộp nhiều file .js thành một file .js chung để giảm thời gian tải.
  • canonicalize_javascript_libraries
    • CoreFilters: No
    • OptimizeForBandwidth: No
    • Tự động sử dụng các thư viện trên CDN của Google nếu có. Ví dụ website bạn đang sử dụng file jquery.js tự host thì nó sẽ tự chuyển sang file jquery.js trên CDN của Google.
  • inline_css
    • CoreFilters: Yes
    • OptimizeForBandwidth: No
    • Tự chuyển nội dung file CSS trong website ra ngoài tài liệu và chèn vào thẻ <style> trong website.
  • inline_google_font_css
    • CoreFilters: No
    • OptimizeForBandwidth: No
    • Tự động chuyển các thẻ chèn Google Font vào website thành định dạng font cố định .woff.
  • inline_javascript
    • CoreFilters: Yes
    • OptimizeForBandwidth: No
    • Tự chuyển nội dung Javascript trong các file .js và chèn trực tiếp vào tài liệu bằng thẻ <script>.
  • local_storage_cache
    • CoreFilters: No
    • OptimizeForBandwidth: No
    • Tự lưu nội dung của website như một bản bộ nhớ đệm là tiến hành load ra ở lần truy cập sau.
  • insert_ga
    • CoreFilters: No
    • OptimizeForBandwidth: No
    • Tự thêm mã nhúng Google Analytics vào mỗi trang của website.
  • rewrite_images
    • CoreFilters: Yes
    • OptimizeForBandwidth: Yes
    • Tối ưu lại hình thành bằng cách rewrite lại đường dẫn, nén ảnh về định dạng webp, giảm dung lượng ảnh và thêm thời hạn cache cho ảnh.
  • convert_jpeg_to_progressive
    • CoreFilters: Yes
    • OptimizeForBandwidth: Yes
    • Tự động chuyển tất cả hình ảnh định dạng JPEG sang định dạng nén.
  • convert_png_to_jpeg
    • CoreFilters: Yes
    • OptimizeForBandwidth: Yes
    • Chuyển tất cả hình ảnh định dạng PNG sang JPEG.
  • convert_jpeg_to_webp
    • CoreFilters: Yes
    • OptimizeForBandwidth: Yes
    • Chuyển tất cả hình ảnh từ định dạng JPEG sang Webp.
  • insert_image_dimensions
    • CoreFilters: Yes
    • OptimizeForBandwidth: Yes
    • Tự thêm tham số width và height vào thẻ <img>.
  • inline_images
    • CoreFilters: Yes
    • OptimizeForBandwidth: Yes
    • Chuyển các hình ảnh cỡ nhỏ về định dạng base64.
  • convert_gif_to_png
    • CoreFilters: Yes
    • OptimizeForBandwidth: Yes
    • Chuyển đổi hình ảnh định dạng GIF về PNG.
  • resize_images
    • CoreFilters: Yes
    • OptimizeForBandwidth: No
    • Thay đổi kích thước hình ảnh.
  • resize_mobile_images
    • CoreFilters: No
    • OptimizeForBandwidth: No
    • Thay đổi kích thước hình ảnh nhưng chỉ có hiệu lực khi truy cập bằng các trình duyệt trên điện thoại di động.
  • remove_comments
    • CoreFilters: No
    • OptimizeForBandwidth: No
    • Xóa các đoạn comment trong mã nguồn HTML của website.
  • collapse_whitespace
    • CoreFilters: No
    • OptimizeForBandwidth: No
    • Xóa các khoảng trắng bên trong mã nguồn HTML của website.
  • sprite_images
    • CoreFilters: No
    • OptimizeForBandwidth: No
    • Tự động cắt nhỏ hình ảnh background ra và ráp vào mã nguồn HTML bằng CSS để giảm thời gian tải bằng cách tải luân phiên từng mảnh trong ảnh đã được cắt, kỹ thuật này gọi là Sprite Image.
  • defer_javascript
    • CoreFilters: No
    • OptimizeForBandwidth: No
    • Thiết lập website chỉ tải Javascript sau khi các thành phần trong website đã tải xong.
  • lazyload_images
    • CoreFilters: No
    • OptimizeForBandwidth: No
    • Thêm hiệu ứng LazyLoad cho toàn bộ ảnh trong website (kỹ thuật chỉ load ảnh khi kéo thanh cuộn website xuống tới thành phần chứa ảnh).

Những tính năng trên không phải cứ bật là chạy, nó còn tùy thuộc vào code của website nữa, có nhiều trường hợp minify javascript sẽ khiến javascript trên website của bạn bị lỗi, vì do javascript đó viết không tốt.

Tốt hơn hết, là bạn cứ thử bật/tắt từng bộ lọc để xem website có lỗi không nhé.

The post Ý nghĩa và cách sử dụng bộ lọc của Pagespeed appeared first on Fullstack Station.

]]>
https://fullstackstation.com/y-nghia-trong-danh-sach-bo-loc-cua-pagespeed-va-cach-su-dung/feed/ 0
Cài đặt SSL và giao thức HTTP/2 cho NGINX trên CentOS 7 https://fullstackstation.com/cai-dat-ssl-va-giao-thuc-http2-cho-nginx-tren-centos-7/ https://fullstackstation.com/cai-dat-ssl-va-giao-thuc-http2-cho-nginx-tren-centos-7/#respond Thu, 01 Oct 2015 02:03:00 +0000 https://www.businesscard.vn/blog/?p=84 Trong tháng 2/2015, một kiểu giao thức web mới vừa được IESG chấp thuận mang nhiều tính năng vượt trội hơn, giúp website tối ưu tốc độ hơn đó là giao thức HTTP/2. Vậy thì HTTP/2 là gì, nó có những ưu điểm nào thì trong bài này, tác giả Công Hải tại AppFast sẽ […]

The post Cài đặt SSL và giao thức HTTP/2 cho NGINX trên CentOS 7 appeared first on Fullstack Station.

]]>
Trong tháng 2/2015, một kiểu giao thức web mới vừa được IESG chấp thuận mang nhiều tính năng vượt trội hơn, giúp website tối ưu tốc độ hơn đó là giao thức HTTP/2. Vậy thì HTTP/2 là gì, nó có những ưu điểm nào thì trong bài này, tác giả Công Hải tại AppFast sẽ giới thiệu và hướng dẫn cách cài đặt nó vào máy chủ Linux sử dụng CentOS 7.

Cập nhật 12/2019: vào 01/2020 thì 2 giao thức TLSv1 TLSv1.1 trở nên lỗi thời và không còn đạt điểm bảo mật cao nhất nữa, vì vậy bạn cần phải điều chỉnh lại thiết lập cho phù hợp để đạt điểm A+.

HTTP 1.1 và HTTP 2

HTTP (Hypertext Transfer Protocol) là một giao thức truyền chuẩn về mạng (truyền tải siêu văn bản – nói nôm na là giao thức web). HTTP 1.1 ra đời vào năm 1997 và vẫn được sử dụng đến hiện tại mà chưa hề có một nâng cấp nào. Có lẽ đã quá cũ nên vào 12/2014 nhóm phát triển của Hypertext Transfer Protocol đã đề xuất lên IESG xem HTTP/2 như là một tiêu chuẩn mới. Và đã được IESG chấp thuận vào ngày 17/02/2015.

HTTP 2 phát triển dựa trên SPDY (pronounced speedy) một giao thức mạng mở được phát triển bởi Google.

Sự khác biệt thì rất nhiều nhưng mình tóm lại sự khác biệt lớn nhất giữa 2 giao thức là: HTTP2 hỗ trợ các truy vấn ghép, nén nội dung, ưu tiên và quản lý thông minh hơn các luồng dữ liệu. Điều đó gây ra việc giảm độ trễ và tăng tốc tải nội dung web. Xem thêm tại bài HTTP/2 là gì?

HTTPS là gì?

HTTPS (Hypertext Transfer Protocol Secure) là một sự kết hợp giữa giao thức HTTP và giao thức bảo mật SSL hay TLS cho phép trao đổi thông tin một cách bảo mật trên Internet.

Cách cài đặt

Hiện có rất nhiều bài hướng dẫn cài đặt SSL nhưng thật sự rất ít bài làm đúng. Ngay cả tinhte.vn cũng chưa thực sự cài đúng.

Các bạn có thể test SSL của website tại:https://www.ssllabs.com/ssltest/index.html

Kết quả test của https://fullstackstation.com/.

Nên hôm nay, mình sẽ hướng dẫn bạn cài đặt và cấu hình HTTPS với HTTP2 lên chuẩn A+.

Bước 1. Cài NGINX 1.9.5 trở lên và kích hoạt HTTP 2

Ngày 22/09/2015 vừa rồi NGINX đã ra phiên bản mainline 1.9.5 chính thức hỗ trợ HTTP 2, và từ này chính thức say goodbye SDPY một thời hùng hậu. Như vậy, điều này có nghĩa là bạn chỉ có thể sử dụng HTTP 2 trên NGINX phiên bản 1.9.5 trở lên, nếu bạn đang dùng NGINX thì hãy gõ nginx -v để kiểm tra phiên bản NGINX hiện tại của bạn.

Để cài NGINX 1.9.5, bạn cần nạp package vào. Hãy tạo file /etc/yum.repos.d/nginx.repo và chèn đoạn dưới đây vào hoặc nếu có rồi thì sửa nội dung:
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=0
enabled=1

Sau đó cập nhật lại gói yum.

yum update -y

Và cài NGINX vào với lệnh sau:

yum install nginx

Sau khi cài đặt bạn kiểm tra lại có phải là version 1.9.5 và có module http 2 (--with-http_v2_module) bằng lệnh sau:

nginx -V

Sau khi cài đặt xong, hãy thiết lập NGINX sử dụng HTTP 2 bằng cách mở tập tin cấu hình NGINX của bạn tại /etc/nginx/conf.d và đổi phần listen 80 thành thế này:

server {
 listen 443 ssl http2;
 server_name domain.com www.domain.com;
 .....
}

Bước 2: Cấu hình SSL cho NGINX

Thiết lập chứng thực vùng nhớ (Session cache)

Điều này là khá quan trọng vì khi truy cập giao thức SSL thì lần đầu sẽ xử lý rất nặng và nhiều (Nên khi truy cập vào trang web https lần đầu tiên thường lâu hơn so với lần sau). Thiết lập này sẽ giúp NGINX nhớ session của user và  không cần chứng thực cho request kế tiếp.

ssl_session_cache shared:SSL:20m;
ssl_session_timeout 180m;

Ý nghĩa dòng 1 là tạo vùng nhớ 20MB cho chứng thực SSL. Theo tài liệu của NGINX thì 1MB chứ 4000 session. Vậy 20MB tương đương với 80.000 Session (bạn có thể điều chỉnh cho phù hợp với nhu cầu server bạn).

Dòng thứ 2 là lưu nó trong 180 phút (3 tiếng) con số này phù hợp với khoảng thời gian User truy cập website bạn. Nếu website bạn cần bảo mật hơn thì có thể giảm con số này xuống nhưng KHÔNG NÊN giảm dưới 10 phút.

Vô hiệu hóa SSL

Có thể là bạn nói tôi khùng, đang setup SSL giờ là vô hiệu hóa nó.

Nói vậy thôi, chứ thực ra là thay thế SSL (Secure Sockets Layer) bằng TLS(Transport Layer Security). Vì thực tế là SSL còn nhiều điểm yếu hơn là TLS. Tuy nhiên IE6 không hỗ trợ TLS (nhưng chắc là IE6 đã quá cổ rồi, tìm cũng chẳng còn đâu).

Thêm dòng sau tiếp theo 2 dòng trên:

ssl_protocols TLSv1.2;
# từ 02/2020 thì TLSv1 TLSv1.1 đưa vào danh sách lạc hậu, bạn cần chỉnh lại giá trị này

Tối ưu hóa Cipher Suites (Bộ mã hóa)

Trung tâm xử lý, mã hóa, giải mã của SSL/TLS là chổ này (tạm hiểu vậy vì mình không phân tích sâu vào cơ chế hoạt động của nó).

Khai báo NGINX bật bộ mã hóa:

ssl_prefer_server_ciphers on;

Khai báo danh sách các cơ chế mã hóa được chấp nhận:

ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5

Tạo ra các thông số DHParam

Tạo file DH (Diffie-Hellman) với 2048 bit (đủ chết cho những thằng muốn hack):

openssl dhparam 2048 -out /etc/nginx/cert/dhparam.pem

Sau đó thêm vào config dòng sau:

ssl_dhparam /etc/nginx/cert/dhparam.pem;

@Lưu ý: Nếu client của bạn dùng JAVA 6 trở xuống thì nên dùng 1024 bit thôi nhé ?

Kích hoạt OCSP

OCSP (Online Certificate Status Protocol) được hiểu như là kiểm tra chứng thức của bạn với nhà cùng cấp SSL (theo bài tạo chứng chỉ SSL đây là COMODO). Tạo ra file Khai báo với NGINX của bạn đây là giấy thức bằng cách sử dụng lệnh sau:

cat AddTrustExternalCARoot.crt PositiveSSLCA2.crt > trustchain.crt

File AddTrustExternalCARoot.crt là file gốc, file PositiveSSLCA2.crt là file chứng thực trung gian có kèm theo trong file zip khi bạn mua SSL hoặc download của COMODO tại đây.

Tiếp theo là cấu hình NGINX stapling

ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/nginx/cert/trustchain.crt;
resolver 8.8.8.8 8.8.4.4;

Ở đây là mình dùng qua DNS Google, bạn có thể dùng DNS nào khác mà bạn tin tưởng hoặc nhanh hơn.

Cấu hình Strict Transport Security

Sau khi server đã chứng thực xong thì trả về trình duyệt thời gian chứng thực được chấp nhận, trong thời gian này khi request trình duyệt không cần gửi chứng thực với Server nữa (Dó là lý do tại sao chỉ nặng lúc đầu).

Thêm dòng sau vào config file:

add_header Strict-Transport-Security "max-age=31536000" always;

Trong trường hợp chứng thực này được dùng cho nhiều subdomain thì sửa lại như sau:

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

That All, chỉ thế thôi. Bạn save lại file và restart NGINX và có thể kiểm tra xem SSL của bạn được loại gì rồi nào?

Sau khi cấu hình xong bạn sẽ có file cấu hình NGINX của domain như thế này đây:

server {
 listen 443 ssl http2;
 listen [::]:443 ssl http2;
 
 server_name your_domain.com;
 
 ssl_certificate /etc/nginx/cert/your_key.certchain.crt;
 ssl_certificate_key /etc/nginx/cert/your_key.key;
 
 ssl_session_cache shared:SSL:20m;
 ssl_session_timeout 60m;
 
 ssl_prefer_server_ciphers on;
 ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5;
 
 ssl_dhparam /etc/nginx/cert/dhparam.pem;
 
 ssl_protocols TLSv1.2;
  
 ssl_stapling on;
 ssl_stapling_verify on;
 ssl_trusted_certificate /etc/nginx/cert/trustchain.crt;
 resolver 8.8.8.8 8.8.4.4;
 
 add_header Strict-Transport-Security "max-age=31536000" always;
 #add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
 
 # Cấu hình của bạn ở dưới này
 …
}

Sau đó bạn có thể kiểm tra server đã dùng HTTP 2 chưa bằng cách cài pluginHTTP/2 and SPDY indicator của Chrome.

Thế thôi, rất đơn giản phải không nào? Nhìn chung cách cài đặt SSL và bật HTTP/2 cũng khá đơn giản, nó cũng giống như mình kích hoạt SPDY mà thôi nhưng chỉ khác là thay spdy thành http2 trong phần listen của tập tin cấu hình mà thôi. Nhưng ngoài việc đó, trong bài này bạn cũng đã biết thêm một vài kỹ thuật quan trọng để cấu hình SSL an toàn hơn để đạt chuẩn A+ tại SSLLabs.

Nguồn: Bài viết được gởi từ tác giả Công Hải từ appfast.io là đối tác của Fullstack Station. Được biên tập và cập nhật bởi Fullstackstation.

The post Cài đặt SSL và giao thức HTTP/2 cho NGINX trên CentOS 7 appeared first on Fullstack Station.

]]>
https://fullstackstation.com/cai-dat-ssl-va-giao-thuc-http2-cho-nginx-tren-centos-7/feed/ 0
HTTP2 [HTTP/2] là gì và hoạt động như thế nào? https://fullstackstation.com/http2-la-gi-va-hoat-dong-nhu-nao/ https://fullstackstation.com/http2-la-gi-va-hoat-dong-nhu-nao/#respond Mon, 30 Mar 2015 12:16:32 +0000 https://www.businesscard.vn/blog/?p=53 HTTP2 là gì? HTTP/2 hoặc HTTP phiên bản 2 là phiên bản chính thứ hai của giao thức mạng HTTP; dựa trên SPDY/2 để cải thiện hiệu suất web ở mức độ rất lớn. HTTP/2 được phát triển bởi Hypertext Transfer Protocol – một bộ phận của Internet Engineering Task Force. HTTP 1.1 là bước […]

The post HTTP2 [HTTP/2] là gì và hoạt động như thế nào? appeared first on Fullstack Station.

]]>

HTTP2 là gì?

HTTP/2 hoặc HTTP phiên bản 2 là phiên bản chính thứ hai của giao thức mạng HTTP; dựa trên SPDY/2 để cải thiện hiệu suất web ở mức độ rất lớn.

HTTP/2 được phát triển bởi Hypertext Transfer Protocol – một bộ phận của Internet Engineering Task Force.

HTTP 1.1 là bước chuyển dịch quan trọng từ HTTP 1.0 và nó cho phép các kết nối cùng tồn tại (nhiều hơn một đề xuất/phản hồi trên cùng một kết nối HTTP); cải tiến bộ nhớ đệm, mã trạng thái mới, hỗ trợ nén nâng cao, phương pháp OPTION cho Cross Origin Resource Sharing trong ứng dụng web và còn nhiều hơn nữa.

Tính đến thời điểm này, HTTP/1.1 đã được dùng cho Web hơn 15 năm nay. Và trên thực tế, HTTP chỉ cho phép tồn tại một đề xuất trên mỗi kết nối TCP.

Nếu có quá nhiều đề xuất được thực hiện, nó sẽ làm ảnh hưởng đến hiệu suất web. Chính vì vậy, HTTP/2 được tạo ra nhằm sử dụng hiệu quả hơn các nguồn lực mạng và giảm độ trễ bằng cách nén header và cho phép các lưu lượng đồng thời lưu thông trên cùng một kết nối.

Tóm lại, ở cấp độ cao, HTTP/2 có các đặc điểm:

•    nhị phân

•    đa truyền hoàn toàn

•    sử dụng một kết nối cho trạng thái song song

•    sử dụng nén header để giảm chi phí

Nguồn: Telecomit

The post HTTP2 [HTTP/2] là gì và hoạt động như thế nào? appeared first on Fullstack Station.

]]>
https://fullstackstation.com/http2-la-gi-va-hoat-dong-nhu-nao/feed/ 0