Thứ hai, 22/09/2014 | 00:00 GMT+7

Cách triển khai ứng dụng Meteor.js trên Ubuntu 14.04 với Nginx


Giới thiệu về Meteor.js

Meteor.js là một khuôn khổ cho JavaScript cho phép các nhà phát triển web viết mã JavaScript một lần và sử dụng lại nó cả phía client và phía server . Điều này có thể thực hiện được nhờ vào quy trình xây dựng độc đáo của Meteor (đọc thêm về cấu trúc mã ứng dụng và chia sẻ mã của bạn ). Điều này cũng giải quyết vấn đề cần một quy trình triển khai phức tạp giữa chế độ phát triển , nơi các nhà phát triển viết mã và gỡ lỗi và chế độ production , đủ an toàn cho version ứng dụng công khai. Khung công tác Meteor cung cấp một cách để mã client và mã server cũng như phát triển và production có liên quan chặt chẽ với nhau. Đây có lẽ là cách dễ nhất để các nhà phát triển phía client bắt đầu làm việc trên mã phía server !

Để xem điều này trong thực tế, bạn có thể cần xem video giới thiệu trên trang web của Meteor.

Meteor.js cho phép bạn phát triển các dự án như trang web (ứng dụng web), ứng dụng trình duyệt web dựa trên HTML5 (sử dụng AppCache) hoặc ứng dụng di động (thông qua tích hợp với PhoneGap). Tất cả những gì bạn cần là kiến thức về Javascript và HTML. Meteor bao gồm hỗ trợ cho MongoDB (một database NoSQL). Khí quyển lưu trữ các gói có thể cung cấp các khối xây dựng hoàn chỉnh cho ứng dụng của bạn để tăng tốc độ phát triển hơn nữa.

Ở cuối hướng dẫn này, ta sẽ có:

  • Đã cài đặt Meteor.js
  • Đã tạo một gói triển khai chứa toàn bộ ứng dụng Meteor ở định dạng sẵn sàng production (trừ web server và backend database )
  • Đã cài đặt Nginx làm web server của ta để chuyển các yêu cầu HTTP đến Meteor
  • Đã cài đặt MongoDB làm công cụ database của ta
  • Quản lý ứng dụng của ta với Upstart
  • Đã cấu hình backup database hàng ngày cho database Meteor

Trong suốt hướng dẫn này, nếu bạn chưa có ứng dụng Meteor của riêng mình, bạn có thể sử dụng ứng dụng ví dụ “Todo List” từ trang web Meteor .

Trước khi bắt đầu

Bạn nên có:

  • Ứng dụng Meteor hiện có trên một máy tính phát triển riêng biệt (bạn có thể xem ví dụ về ứng dụng “Danh sách Todo” tại đây ; hướng dẫn được cung cấp sau trong hướng dẫn)
  • Server Ubuntu 14.04 mới ; các cài đặt Meteor hiện có sẽ hoạt động trong hầu hết các trường hợp
  • quyền truy cập root vào server để thực hiện các lệnh
  • Đã cập nhật danh sách gói. Hành hình:

    apt-get cập nhật

  • Thay thế todos.net bằng domain bạn thực sự đang sử dụng (hoặc bỏ nó nếu bạn không có domain và sẽ sử dụng địa chỉ IP thay thế)

  • Thay thế todos (không có .net) bằng tên ứng dụng của bạn

Bước 1 - Cài đặt web server Nginx

Ta sẽ cài đặt và cài đặt Nginx vì nó cho phép ta mã hóa lưu lượng truy cập web bằng SSL, một tính năng mà web server tích hợp của Meteor không cung cấp. Nginx cũng sẽ cho phép ta phục vụ các trang web khác trên cùng một server , đồng thời lọc và ghi lại lưu lượng truy cập.

Trong cấu hình của ta , ta sẽ bảo mật trang web của bạn bằng certificate SSL và chuyển hướng tất cả lưu lượng truy cập từ HTTP sang HTTPS. Ta cũng sẽ sử dụng một số phương pháp bảo mật mới để nâng cao tính bảo mật của kết nối SSL.

Để cài đặt Nginx, ta thực hiện:

apt-get install nginx

Tạo file cấu hình server ảo trong /etc/nginx/sites-available .

Dưới đây là file cấu hình có chú thích mà ta có thể tạo dưới dạng /etc/nginx/sites-available/ todos với nội dung sau. Giải thích cho tất cả các cài đặt cấu hình có trong các comment trong file :

server_tokens off; # for security-by-obscurity: stop displaying nginx version

# this section is needed to proxy web-socket connections
map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}

# HTTP
server {
    listen 80 default_server; # if this is not a default server, remove "default_server"
    listen [::]:80 default_server ipv6only=on;

    root /usr/share/nginx/html; # root is irrelevant
    index index.html index.htm; # this is also irrelevant

    server_name todos.net; # the domain on which we want to host the application. Since we set "default_server" previously, nginx will answer all hosts anyway.

    # redirect non-SSL to SSL
    location / {
        rewrite     ^ https://$server_name$request_uri? permanent;
    }
}

# HTTPS server
server {
    listen 443 ssl spdy; # we enable SPDY here
    server_name todos.net; # this domain must match Common Name (CN) in the SSL certificate

    root html; # irrelevant
    index index.html; # irrelevant

    ssl_certificate /etc/nginx/ssl/todos.pem; # full path to SSL certificate and CA certificate concatenated together
    ssl_certificate_key /etc/nginx/ssl/todos.key; # full path to SSL key

    # performance enhancement for SSL
    ssl_stapling on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 5m;

    # safety enhancement to SSL: make sure we actually use a safe cipher
    ssl_prefer_server_ciphers on;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:ECDHE-RSA-RC4-SHA:ECDHE-ECDSA-RC4-SHA:RC4-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!3DES:!MD5:!PSK';

    # config to enable HSTS(HTTP Strict Transport Security) https://developer.mozilla.org/en-US/docs/Security/HTTP_Strict_Transport_Security
    # to avoid ssl stripping https://en.wikipedia.org/wiki/SSL_stripping#SSL_stripping
    add_header Strict-Transport-Security "max-age=31536000;";

    # If your application is not compatible with IE <= 10, this will redirect visitors to a page advising a browser update
    # This works because IE 11 does not present itself as MSIE anymore
    if ($http_user_agent ~ "MSIE" ) {
        return 303 https://browser-update.org/update.html;
    }

    # pass all requests to Meteor
    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade; # allow websockets
        proxy_set_header Connection $connection_upgrade;
        proxy_set_header X-Forwarded-For $remote_addr; # preserve client IP

        # this setting allows the browser to cache the application in a way compatible with Meteor
        # on every applicaiton update the name of CSS and JS file is different, so they can be cache infinitely (here: 30 days)
        # the root path (/) MUST NOT be cached
        if ($uri != '/') {
            expires 30d;
        }
    }
}

Nếu bạn muốn điều chỉnh file cấu hình theo nhu cầu của bạn và để biết thêm giải thích, hãy xem hướng dẫn này về server ảo Nginx .

Như đã thấy trong file cấu hình server ảo, Nginx sẽ certificate request SSL hợp lệ và nhập /etc/nginx/ssl . Ta cần tạo folder này và bảo mật nó:

mkdir /etc/nginx/ssl
chmod 0700 /etc/nginx/ssl

Sau đó, ta có thể tạo các file chứa certificate (và certificate chuỗi nếu được yêu cầu) và khóa ở các vị trí mà ta đã xác định trong cấu hình ở trên:

  • certificate : /etc/nginx/ssl/ todos.pem
  • key: /etc/nginx/ssl/ todos.key

Nếu bạn chưa có certificate SSL và khóa, bây giờ bạn nên tạo certificate tự ký bằng cách sử dụng hướng dẫn tạo certificate SSL tự ký cho Nginx này . Lưu ý bạn cần sử dụng các tên giống nhau từ file cấu hình, như todos.key làm tên khóa và todos.pem làm tên certificate . Mặc dù certificate tự ký là phù hợp để thử nghiệm, nhưng ta khuyến khích sử dụng certificate thương mại, đã ký để sử dụng trong production . Chứng chỉ tự ký sẽ kích hoạt cảnh báo Nginx được kết nối với ssl_stapling và cảnh báo bảo mật trong trình duyệt web.

Khi bạn hoàn tất việc tạo hoặc lấy certificate , hãy đảm bảo bạn có các todos.pemtodos.key được đề cập ở trên.

Tiếp theo, ta nên vô hiệu hóa vhost mặc định:

rm /etc/nginx/sites-enabled/default

Và kích hoạt vhost Meteor của ta :

ln -s /etc/nginx/sites-available/todos /etc/nginx/sites-enabled/todos

Kiểm tra xem cấu hình vhost không có lỗi (bạn sẽ thấy lỗi liên quan đến ssl_stapling nếu bạn có certificate tự ký; điều này không sao):

nginx -t

Nếu mọi thứ đều ổn, ta có thể áp dụng các thay đổi cho Nginx:

nginx -s reload

Đến đây, bạn có thể sử dụng trình duyệt web của bạn để truy cập https: // todos.net (hoặc địa chỉ IP của bạn). Nó sẽ cho ta thấy 502 Bad Gateway . Điều đó không sao, vì ta chưa chạy Meteor!

Bước hai - Cài đặt database MongoDB

Ta sẽ cài đặt MongoDB từ repository Ubuntu thông thường. Cấu hình tiêu chuẩn sẽ ổn. Không cần xác thực để kết nối với database , nhưng chỉ có thể kết nối từ localhost. Điều này nghĩa là không có kết nối bên ngoài nào khả thi và do đó database an toàn, miễn là ta không có user không tin cậy có quyền truy cập SSH vào hệ thống.

Cài đặt gói server MongoDB:

apt-get install mongodb-server

Đây là mọi thứ ta cần làm để MongoDB chạy. Để chắc chắn rằng không thể truy cập từ các server bên ngoài, ta thực thi các bước sau đảm bảo rằng MongoDB được liên kết với 127.0.0.1 . Kiểm tra bằng lệnh này:

netstat -ln | grep -E '27017|28017'

Sản lượng mong đợi:

tcp        0      0 127.0.0.1:27017         0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.1:28017         0.0.0.0:*               LISTEN
unix  2      [ ACC ]     STREAM     LISTENING     6091441  /tmp/mongodb-27017.sock

Để có sẵn các bản backup hàng ngày trong trường hợp xảy ra sự cố, ta có thể tùy chọn cài đặt một lệnh đơn giản như một công việc cron hàng ngày. Tạo file /etc/cron.d/mongodb-backup :

@daily root mkdir -p /var/backups/mongodb; mongodump --db todos --out /var/backups/mongodb/$(date +'\%Y-\%m-\%d')

Bước 3 - Cài đặt ứng dụng Meteor

Đầu tiên, ta cần cài đặt Node.js. Vì Meteor thường yêu cầu version Node.js mới hơn so với version có sẵn trong repository lưu trữ tiêu chuẩn, ta sẽ sử dụng PPA tùy chỉnh (tại thời điểm viết bài, Ubuntu 14.04 cung cấp nodejs = 0.10.25 ~ dfsg2-2ubuntu1 trong khi Meteor 0.8.3 yêu cầu Node.js 0.10.29 hoặc mới hơn) .

Thực hiện các bước sau để thêm PPA với Node.js và xác nhận bằng cách nhấn Enter:

add-apt-repository ppa:chris-lea/node.js

Đầu ra:

 Evented I/O for V8 javascript. Node's goal is to provide an easy way to build scalable network programs
 More info: https://launchpad.net/~chris-lea/+archive/ubuntu/node.js
Press [ENTER] to continue or ctrl-c to cancel adding it

gpg: keyring `/tmp/tmphsbizg3u/secring.gpg' created
gpg: keyring `/tmp/tmphsbizg3u/pubring.gpg' created
gpg: requesting key C7917B12 from hkp server keyserver.ubuntu.com
gpg: /tmp/tmphsbizg3u/trustdb.gpg: trustdb created
gpg: key C7917B12: public key "Launchpad chrislea" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)
OK

Bây giờ ta phải làm mới bộ nhớ cache của repository và sau đó ta có thể cài đặt Node.js và npm (trình quản lý gói Node.js):

apt-get update
apt-get install nodejs

Đó là một thực tiễn tốt để chạy ứng dụng Meteor của ta như một regular user . Do đó, ta sẽ tạo một user hệ thống mới đặc biệt cho mục đích đó:

adduser --disabled-login todos

Đầu ra:

Adding user `todos' ...
Adding new group `todos' (1001) ...
Adding new user `todos' (1001) with group `todos' ...
Creating home directory `/home/todos' ...
Copying files from `/etc/skel' ...
Changing the user information for todos
Enter the new value, or press ENTER for the default
        Full Name []: 
        Room Number []: 
        Work Phone []: 
        Home Phone []: 
        Other []: 
Is the information correct? [Y/n]

Bước 4 - Cấu hình Khởi động lại

Bây giờ ta đã sẵn sàng tạo dịch vụ Upstart để quản lý ứng dụng Meteor của ta . Upstart sẽ tự động khởi động ứng dụng khi khởi động và khởi động lại Meteor trong trường hợp nó chết. Bạn có thể đọc thêm về cách tạo file dịch vụ Upstart trong hướng dẫn này .

Tạo file /etc/init/ todos .conf . , nó được chú thích trong dòng:

# upstart service file at /etc/init/todos.conf
description "Meteor.js (NodeJS) application"
author "Daniel Speichert <daniel@speichert.pro>"

# When to start the service
start on started mongodb and runlevel [2345]

# When to stop the service
stop on shutdown

# Automatically restart process if crashed
respawn
respawn limit 10 5

# we don't use buil-in log because we use a script below
# console log

# drop root proviliges and switch to mymetorapp user
setuid todos
setgid todos

script
    export PATH=/opt/local/bin:/opt/local/sbin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    export NODE_PATH=/usr/lib/nodejs:/usr/lib/node_modules:/usr/share/javascript
    # set to home directory of the user Meteor will be running as
    export PWD=/home/todos
    export HOME=/home/todos
    # leave as 127.0.0.1 for security
    export BIND_IP=127.0.0.1
    # the port nginx is proxying requests to
    export PORT=8080
    # this allows Meteor to figure out correct IP address of visitors
    export HTTP_FORWARDED_COUNT=1
    # MongoDB connection string using todos as database name
    export MONGO_URL=mongodb://localhost:27017/todos
    # The domain name as configured previously as server_name in nginx
    export ROOT_URL=https://todos.net
    # optional JSON config - the contents of file specified by passing "--settings" parameter to meteor command in development mode
    export METEOR_SETTINGS='{ "somesetting": "someval", "public": { "othersetting": "anothervalue" } }'
    # this is optional: http://docs.meteor.com/#email
    # commented out will default to no email being sent
    # you must register with MailGun to have a username and password there
    # export MAIL_URL=smtp://postmaster@mymetorapp.net:password123@smtp.mailgun.org
    # alternatively install "apt-get install default-mta" and uncomment:
    # export MAIL_URL=smtp://localhost
    exec node /home/todos/bundle/main.js >> /home/todos/todos.log
end script

Một điều cần chú ý trong file cấu hình này là tham số METEOR_SETTINGS . Nếu bạn sử dụng meteor --settings config.json khi chạy chế độ phát triển của Meteor, thì bạn nên dán nội dung của config.json dưới dạng một biến trong METEOR_SETTINGS .

Các MAIL_URL phải là một URL SMTP chỉ có giá trị nếu bạn có kế hoạch để sử dụng gói Email Meteor. Bạn có thể sử dụng MailGun (theo khuyến nghị của Meteor), một server thư local , v.v.

Như ta có thể thấy trong file , log sẽ được lưu vào /home/ todos / todos .log. Tệp này sẽ không xoay và SẼ PHÁT TRIỂN theo thời gian. Bạn nên để mắt đến nó. Tốt nhất, không nên có nhiều nội dung (lỗi) trong đó. Theo tùy chọn, bạn có thể cài đặt xoay vòng log hoặc thay thế >> bằng > ở cuối tập lệnh Khởi động để overrides toàn bộ file thay vì thêm vào cuối file .

Đừng khởi động dịch vụ này vì ta chưa có file ứng dụng Meteor thực sự!

Bước 5 - Triển khai ứng dụng Meteor

Tùy chọn: Nếu bạn chưa có dự án Meteor

Nếu bạn chưa có dự án Meteor và muốn sử dụng ứng dụng demo, đó không phải là vấn đề!

Thực hiện bước tiếp theo trên máy tính gia đình của bạn hoặc server Linux đang phát triển. Các lệnh có thể khác nhau dựa trên hệ điều hành của bạn. Di chuyển đến folder chính của bạn:

cd ~

Đầu tiên, hãy cài đặt version phát triển của Meteor:

curl https://install.meteor.com | /bin/sh

Sau đó, tạo một ứng dụng từ một ví dụ, được gọi là Todo List :

meteor create --example todos

Bây giờ hãy nhập folder ứng dụng của bạn và bạn đã sẵn sàng để tiếp tục:

cd todos

Tất cả các dự án Meteor

Đã đến lúc tạo gói version production từ ứng dụng Meteor của ta . Các lệnh sau phải được thực thi trên máy tính gia đình hoặc server Linux phát triển của bạn, bất cứ nơi nào ứng dụng Meteor của bạn tồn tại. Đi tới folder dự án của bạn:

cd /app/dir

Và thực hiện:

meteor build .

Thao tác này sẽ tạo một file lưu trữ như todos.tar.gz trong folder /app/dir . Sao chép file này vào folder ~ của bạn trên Server.

scp todos.tar.gz root@todos.net:~

Bây giờ quay lại Server. Tạo một folder dự án và di chuyển file dự án lưu trữ vào đó. Lưu ý đây là folder chính cho user dự án mà ta đã tạo trước đó, không phải folder chính root của bạn:

mkdir /home/todos
mv todos.tar.gz /home/todos

Di chuyển vào folder dự án và extract nó:

cd /home/todos
tar -zxf todos.tar.gz

Hãy xem qua dự án README:

cat /home/todos/bundle/README

Gói bao gồm một file README với nội dung:

This is a Meteor application bundle. It has only one external dependency:
Node.js 0.10.29 or newer. To run the application:

  $ (cd programs/server && npm install)
  $ export MONGO_URL='mongodb://user:password@host:port/databasename'
  $ export ROOT_URL='http://example.com'
  $ export MAIL_URL='smtp://user:password@mailhost:port/'
  $ node main.js

Use the PORT environment variable to set the port where the
application will listen. The default is 80, but that will require
root on most systems.

Find out more about Meteor at meteor.com.

Công thức này được phản ánh trong file /etc/init/ todos .conf của ta . Vẫn còn một điều nữa được đề cập trong README mà ta cần phải làm.

Bây giờ ta cần cài đặt một số module npm bắt buộc. Để có thể tạo một số trong số chúng, ta cũng cần cài đặt g ++ và tạo:

apt-get install g++ make
cd /home/todos/bundle/programs/server
npm install

Bạn sẽ thấy kết quả như thế này:

npm WARN package.json meteor-dev-bundle@0.0.0 No description
npm WARN package.json meteor-dev-bundle@0.0.0 No repository field.
npm WARN package.json meteor-dev-bundle@0.0.0 No README data

> fibers@1.0.1 install /home/todos/bundle/programs/server/node_modules/fibers
> node ./build.js

`linux-x64-v8-3.14` exists; testing
Binary is fine; exiting
underscore@1.5.2 node_modules/underscore

semver@2.2.1 node_modules/semver

source-map-support@0.2.5 node_modules/source-map-support
└── source-map@0.1.29 (amdefine@0.1.0)

fibers@1.0.1 node_modules/fibers

Lý do ta cần làm điều này là vì gói ứng dụng của ta không chứa các module và thư viện phụ thuộc vào nền tảng.

Ta gần như đã sẵn sàng để chạy ứng dụng, nhưng vì ta hoạt động trên các file dưới dạng root và chúng phải thuộc sở hữu của user todos , ta cần cập nhật quyền sở hữu của folder dự án:

chown todos:todos /home/todos -R

Bước sáu - Thời gian chiếu

Đến đây, ta có mọi thứ cần thiết để chạy ứng dụng Meteor:

  • Đã cài đặt môi trường Node.js
  • Ứng dụng được cài đặt trong folder dự án của nó
  • Khởi động lại dịch vụ được cấu hình để chạy ứng dụng
  • Database MongoDB
  • Server proxy Nginx ở phía trước ứng dụng Meteor của ta để cung cấp mã hóa SSL

Để khởi động ứng dụng của ta , hãy thực hiện lệnh này từ folder dự án:

start todos

Đến đây bạn sẽ có thể xem ứng dụng của bạn trong trình duyệt tại https: // todos.net .

Triển khai lại ứng dụng

Khi bạn thực hiện những thay đổi trong chế độ phát triển (và bạn sẽ;! Ta đang phát triển sau khi tất cả), bạn có thể chỉ đơn giản lặp lại Bước năm (bắt đầu từ meteor build ) và đi qua hầu hết các bước cho đến khi restart todos lệnh, mà sẽ được reload của bạn ứng dụng thông qua Upstart.

Bằng cách này, bạn có thể đẩy một version mới mà không mất thời gian chết. Khách hàng (khách truy cập vào trang web ) sẽ tự động lấy version mã mới và làm mới trang của họ - đó là điều kỳ diệu của Meteor!

Nếu bạn muốn kiểm tra điều này, bạn có thể thực hiện một thay đổi đơn giản đối với văn bản trong trang todos/client/todos.html trong bản sao phát triển của ứng dụng trên máy tính gia đình hoặc server phát triển của bạn.

Server phát triển:

Xây dựng:

meteor build /app/dir

Tải lên:

scp todos.tar.gz root@todos.net:/home/todos

Server production :

Mở rộng:

tar -zxf /home/todos/todos.tar.gz

Di chuyển vào folder dự án:

cd /home/todos/bundle/programs/server

Cập nhật các module npm (bạn có thể thấy một vài cảnh báo):

npm install

Khởi động lại ứng dụng:

restart todos

Xử lý sự cố

Nếu có gì đó không ổn, đây là một vài gợi ý về nơi để tìm sự cố:

  • Kiểm tra /home/ todos / todos .log nếu ứng dụng của bạn khởi động và chết; nó sẽ đưa ra một thông báo lỗi thích hợp (ví dụ như trong trường hợp lỗi lập trình).
  • Kiểm tra /var/log/nginx/error.log nếu bạn thấy lỗi HTTP thay vì ứng dụng của bạn.
  • Kiểm tra /var/log/mongodb/mongodb.log nếu bạn cho rằng có thể có sự cố với database .

Cuối cùng, hãy kiểm tra xem tất cả các dịch vụ đang chạy:

status todos
service nginx status
status mongodb

Tags:

Các tin liên quan

Cách cài đặt Drupal trên server Ubuntu 14.04 với Apache
2014-09-19
Cách sử dụng Reprepro cho Kho lưu trữ Gói Bảo mật trên Ubuntu 14.04
2014-09-10
Cách cài đặt Discourse trên Ubuntu 14.04
2014-09-10
Cách sử dụng Foreman để quản lý các node puppet trên Ubuntu 14.04
2014-09-08
Cách sử dụng phân phối giám sát mở với Check_MK trên Ubuntu 14.04
2014-09-08
Cách cài đặt và cấu hình một Daemon và Ứng dụng khách SNMP trên Ubuntu 14.04
2014-08-18
Giới thiệu về cách sử dụng Consul, Hệ thống khám phá dịch vụ, trên Ubuntu 14.04
2014-08-15
Cách cấu hình Lãnh sự trong Môi trường Sản xuất trên Ubuntu 14.04
2014-08-15
Cách bảo mật lãnh sự bằng mã hóa TLS trên Ubuntu 14.04
2014-08-15
Cách tạo một cụm RethinkDB được chia nhỏ trên Ubuntu 14.04
2014-08-08