Hi 🤓 Cảm ơn bạn đã ghé thăm blog này, nếu những bài viết trên blog giúp ích cho bạn. Bạn có thể giúp blog hiển thị quảng cáo bằng cách tạm ngừng ad blocker 😫 và để giúp blog duy trì hoạt động nếu bạn muốn.
Cảm ơn bạn!

Trong bài viết này, chúng ta cùng tìm hiểu một số kiến thức liên quan đến server như SSH là gì, mục đích sử dụng của nó, cách cài đặt LAMP/LEMP stack trên ubuntu server nhé 😄.


Chúng ta sẽ tạo một máy ảo bằng cách sử dụng virtualbox để thực hành, các bạn có thể dùng VMware cũng được nhé ^^. Cá nhân mình thích sử dụng virtualbox hơn vì nó nhẹ và dễ cài đặt. Giao diện cũng đơn giản và trực quan, giúp dễ dàng tạo và quản lý các máy ảo 😀.

Trước tiên chúng ta cùng tìm hiểu về SSH và cách nó hoạt động nhé!

SSH là gì?

SSH là viết tắt của Secure Shell, đây là giao thức cho phép chúng ta truy cập từ xa (remote access) đến một máy tính hoặc server một cách bảo mật. Nó tạo ra một secure channel giúp ta đăng nhập vào các hệ thống từ xa (remote systems) và có thể thực thi các dòng lệnh (commands) một cách an toàn.

SSH dựa trên kiến trúc client-server (client-server architecture), mình có viết một bài về kiến trúc này, các bạn có thể tìm hiểu tại 👉: Tìm hiểu về client - server architecture, kiến thức về server bạn nên biết. Dưới đây là một số thành phần trong kiểu kiến trúc này:

  1. SSH Client: Một chương trình giúp tạo yêu cầu kết nối SSH đến remote SSH Server.
  2. SSH Server: Một chương trình chạy trên máy tính từ xa, nó có nhiệm vụ nhận các yêu cầu kết nối SSH từ client. Nhiệm vụ của nó là xác thực client, tạo một channel an toàn cho việc giao tiếp giữa 2 máy như cho phép client thực thi các lệnh command từ xa, truyền file,...
  3. Secure Communication Channel: Khi SSH client và SSH server được kết nối, chúng sử dụng thuật toán mã hóa để tạo ra một channel an toàn, bảo mật và đảm bảo tính toàn vẹn dữ liệu truyền giữa client và server. Điều này giúp bảo vệ chống lại việc sửa đổi và giả mạo dữ liệu.
  4. Authentication: SSH hỗ trợ các cơ chế xác thực khác nhau để xác minh danh tính của client kết nối đến server. Các phương thức xác thực thông thường bao gồm xác thực dựa trên mật khẩu, xác thực dựa trên public key và xác thực dựa trên chứng chỉ (certificate). Các cơ chế này đảm bảo chỉ những người dùng được ủy quyền (authorized users) mới có thể truy cập hệ thống từ xa.

Theo mặc định, SSH sử dụng port 22 để giao tiếp. Các bạn có thể thay đổi port này nhé.

SSH bao gồm khả năng truyền file an toàn thông qua các công cụ như SCP (Secure Copy) và SFTP (SSH File Transfer Protocol). Các giao thức này cho phép người dùng truyền file an toàn giữa máy tính cá nhân và hệ thống từ xa. Bạn có thể tìm hiểu thêm bài viết: Cách sử dụng WinSCP để truyền file an toàn qua mạng. WinSCP là một ứng dụng giúp truyền tải file, thư mục giữa local computer và remote server thông qua SSH, SCP (Secure Copy Protocol), SFTP.


👉 Trong bài viết này, mình sẽ sử dụng hệ điều hành windows làm SSH client và Ubuntu làm SSH server. Để dùng SSH, các bạn cần cài đặt SSH client và SSH server.

Version mới nhất của windows 10 and windows 11 đã tích hợp SSH dựa trên phần mềm OpenSSH. Phần mềm này cho phép chúng ta kết nối và tương tác với remote SSH server thông qua command-line tool. Chúng ta sẽ cùng tìm hiểu cách sử dụng OpenSSH sau 😀.

Cài đặt SSH client

Theo mặc định OpenSSH sẽ được cài đặt tại C:\Windows\System32\OpenSSH. Các bạn có thể kiểm tra xem máy đã cài OpenSSH chưa bằng cách vào Windows Settings > Apps > Optional features và search "openssh". Kết quả sẽ tương tự như dưới đây 👇.

Install OpenSSH for Windows

Nếu máy tính chưa cài đặt OpenSSH, tại Windows Settings > Apps > Optional features, các bạn chọn Add a feature, nhập OpenSSH Client và install.

Cài đặt SSH trên Ubuntu server

Tiếp theo, chúng ta cần tạo ra một máy ảo để giả lập remote server, như mình đã giới thiệu ở trên, chúng ta sẽ sử dụng virtualbox để tạo máy ảo. Một số OS (hệ điều hành) bạn có thể sử dụng như Microsoft Windows Server, Ubuntu Server, Fedora Server,... Trong ví dụ này mình sẽ sử dụng Ubuntu server nhé ^^ 👌.

Cài đặt Ubuntu server

Đầu tiên để cài đặt Ubuntu server, các bạn vào link https://ubuntu.com/download/server để tải.

install ubuntu server

File ISO của nó tầm 2gb trong quá trình tải nếu bạn chưa install virtualbox thì có thể tải về và cài đặt nhé ^^.

🚀 Sau khi cài đặt xong virtualbox, chúng ta sẽ cài đặt ubuntu server bằng file ISO đã tải xuống.

install ubuntu server with virtualbox

Nhập tên cho virtual machine và chọn file ISO của ubuntu server vừa tải về, chọn next.

Nhập username và password và chọn next.

unattended gues os install.

Trong quá trình cài đặt các bạn nhớ tích chọn phần cài đặt Install OpenSSH server nhé ^^.

Bước cuối chọn finish, sau khi cài đặt xong chúng ta sẽ được như sau 👇. Đây là bước đăng nhập vào ubuntu server.

screen ubuntu server

👉 Hướng dẫn chi tiết bạn tham khảo tại: https://ubuntu.com/tutorials/install-ubuntu-server

Như vậy chúng ta đã cài đặt xong Ubuntu server 🎉, tiếp theo cùng cài đặt LAMP stack trên ubuntu để build website nhé.

Cài đặt LAMP stack trên Ubuntu server

LAMP/LEMP stack là gì?

Chắc hẳn các bạn khi theo học web đã nghe ít nhiều về LAMP stack, LEMP stack hay MERN stack rồi đúng không 😄. Hiểu đơn giản đây là tập hợp những công nghệ mà chúng ta dùng để xây dựng website.

Ngoài những tech stack mình đã kể trên thì còn rất nhiều những tech stack khác các bạn có thể tìm hiểu thêm nhé. Sự kết hợp giữa backend và frontend tạo nên một web development stack điển hình gồm:

  • Framework: Giúp phát triển phần mềm nhanh chóng và hiệu quả. Ví dụ: Frontend Frameworks: React, Angular, Vue.js. Backend Frameworks: Laravel, Node.js (Express.js),...
  • Web server: Những phần mềm như Apache, Nginx và Microsoft IIS giúp xử lý các yêu cầu HTTP (HTTP request) cho client.
  • Database: Sử dụng để lưu trữ và truy xuất dữ liệu cho web, ví dụ như MySQL, PostgreSQL, MongoDB.
  • Programming languages: Được sử dụng để viết code phát triển ứng dụng phần mềm, ví dụ: JavaScript, PHP, Java, C++,...
  • Operating systems (OS): Hệ điều hành là phần mềm quản lý và điều khiển các tài nguyên phần cứng và phần mềm trên một máy tính hoặc một mạng máy tính. Một số hệ điều hành phổ biến bao gồm Windows, macOS, Linux.

Mỗi một tech stack sẽ có ưu và nhược điểm riêng, tùy vào dự án mà chúng ta sẽ quyết định chọn tech stack nào cho phù hợp ^^. Sau khi đã hiểu cơ bản về tech stack thì khi phân tích LAMP stack, LEMP stack thì các bạn sẽ hiểu những công nghệ này dùng để làm gì rồi ^^.

  • LAMP stack: Linux, Apache, MySQL, PHP
  • WAMP stack: Windows, Apache, MySQL, PHP
  • LEMP stack: Linux, Nginx, MySQL, PHP
  • MEAN stack: MongoDB, Express.js, AngularJS, Node.js
  • MERN stack: MongoDB, Express.js, ReactJS, Node.js

Lý thuyết nãy giờ cũng nhiều rồi, chúng ta cùng đến với phần install LAMP stack trên Ubuntu nha.

Install apache web server

Để cài apache, chúng ta sẽ sử dụng lệnh:

sudo apt install apache2

Kết quả tương tự như dưới:

install apache on ubuntu

Bây giờ thử truy cập ip sau trên trình duyệt máy tính và xem kết quả, trang default của apache sẽ trông giống như sau ^^.

apache default page

Các bạn có thể thấy khi sử dụng ubuntu server, mặc định apache sẽ được cài đặt vào folder /var/www.

Để có thể truy cập vào địa chỉ ip (địa chỉ của ubuntu server) trên từ local machine các bạn có hai cách sau:

  1. Sử dụng Network adapter là Bridged adapter

Về cơ bản, đây là một cơ chế kết nối mạng cho phép các thiết bị trong cùng một mạng LAN (Local Area Network) tương tác trực tiếp với nhau trong cùng một mạng mà không cần phải thông qua bất kỳ phần mềm hoặc thiết bị trung gian nào.

Do địa chỉ ip của máy mình là 192.168.1.6 (dùng lệnh ipconfig trên windows), nên nếu dùng adapter này thì các bạn có thể truy cập đến 192.168.1.8 vì chúng ta đang truy cập trong cùng một mạng.

Các bạn có thể kiểm tra ip của máy ảo bằng lệnh ip addr hoặc ip a.

check ip on ubuntu server

Phần cài đặt network bạn thực hiện giống bên dưới, chọn Bridged adapter.

virtualbox network adapter

Sau khi config như hình thì các bạn có thể kiểm tra apache đã cài đặt thành công hay chưa 😄.

  1. Sử dụng NAT

Mình có tìm thấy một video giải thích của khá dễ hiểu về NAT (Network address translation) các bạn xem tại đây 👇.

Trong virtualbox, các bạn vào Port forwarding rules và cài đặt tương tự bên dưới:

virtualbox port forwarding rules

Trong cài đặt trên, về cơ bản, virtualbox sẽ thực hiện chuyển kết nối từ port 8080 (local machine) đến port 80 (ubuntu server), theo mặc định apache sẽ nhận HTTP request từ client tại port 80. Bạn có thể thay đổi port của nó tại /etc/apache2/ports.conf trong ubuntu server.

Nếu không chỉ định Host ip, mặc định của nó sẽ là localhost, bây giờ bạn có thể thử truy cập ip localhost:8080 và xem kết quả 😄.

Tiếp theo chúng ta sẽ test apache bằng cách thêm một file info.php vào thư mục /var/www/html.

Các bạn chạy lệnh:

sudo nano /var/www/html/info.php

Màn hình nano editor hiển thị, các bạn thêm dòng bên dưới để xem thông tin cài đặt php nhé, để lưu chúng ta nhấn ctrl + octrl + x để thoát nano. Các bạn có thể xem cách sử dụng nano tại đây.

<?php 
  phpinfo();
?>

Sau đó, thử truy cập file info.php trên trình duyệt, mình giả sử dụng ta đang sử dụng NAT, ở phần cấu hình giống ở trên thì kết quả sẽ được như sau:

apache php info

Kết quả nhận được là một đoạn plain text như trên 😯, lý do là vì Apache là một web server được thiết kế chủ yếu để xử lý các HTTP request và trả về nội dung tĩnh như các tệp HTML, CSS, JavaScript,... Nó không có khả năng thực thi (execute) code PHP.

Để execute code PHP, ta cần sử dụng một PHP interpreter để có thể hiểu và xử lý các tập lệnh PHP.

Khi có request đến file PHP, Apache chuyển request đó cho PHP interpreter, nó sẽ xử lý mã PHP và generate ra HTML hoặc các định dạng khác và trả kết quả đã xử lý về cho Apache, và Apache sẽ chuyển nó đến client 😄.

Install php on Ubuntu server

Trong bài viết này mình sẽ cài đặt php 8.1, các bạn có thể cài đặt các phiên bản khác nếu muốn nhé ^^.

Chúng ta sẽ sử dụng lệnh:

sudo apt install php8.1

Sau khi cài đặt xong, kiểm tra bằng lệnh php -v để xem version php nhé. Cài đặt xong các bạn hãy refresh lại trang localhost:8080/info.php và xem kết quả nhé ^^.

Install mysql on Ubuntu server

Để cài đặt mysql các bạn chạy command sau:

sudo apt install mysql-server

Chúng ta sẽ thấy thông tin tương tự như bên dưới.

homiedev@homiedev-server:~$ sudo apt install mysql-server
[sudo] password for homiedev:
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
  libcgi-fast-perl libcgi-pm-perl libclone-perl libencode-locale-perl libevent-pthreads-2.1-7 libfcgi-bin libfcgi-perl
  libfcgi0ldbl libhtml-parser-perl libhtml-tagset-perl libhtml-template-perl libhttp-date-perl libhttp-message-perl
  libio-html-perl liblwp-mediatypes-perl libmecab2 libprotobuf-lite23 libtimedate-perl liburi-perl mecab-ipadic
  mecab-ipadic-utf8 mecab-utils mysql-client-8.0 mysql-client-core-8.0 mysql-common mysql-server-8.0
  mysql-server-core-8.0
Suggested packages:
  libdata-dump-perl libipc-sharedcache-perl libbusiness-isbn-perl libwww-perl mailx tinyca
The following NEW packages will be installed:
  libcgi-fast-perl libcgi-pm-perl libclone-perl libencode-locale-perl libevent-pthreads-2.1-7 libfcgi-bin libfcgi-perl
  libfcgi0ldbl libhtml-parser-perl libhtml-tagset-perl libhtml-template-perl libhttp-date-perl libhttp-message-perl
  libio-html-perl liblwp-mediatypes-perl libmecab2 libprotobuf-lite23 libtimedate-perl liburi-perl mecab-ipadic
  mecab-ipadic-utf8 mecab-utils mysql-client-8.0 mysql-client-core-8.0 mysql-common mysql-server mysql-server-8.0
  mysql-server-core-8.0
0 upgraded, 28 newly installed, 0 to remove and 3 not upgraded.
Need to get 29.6 MB of archives.
After this operation, 243 MB of additional disk space will be used.
Do you want to continue? [Y/n] y

Sau khi cài đặt thành công, mysql sẽ tự động được start. Các bạn có thể xem trạng thái của mysql bằng lệnh:

sudo service mysql status

Chúng ta sẽ thấy kết quả tương tự như dưới đây:

● mysql.service - MySQL Community Server
     Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2023-08-12 12:30:24 UTC; 2min 11s ago
    Process: 1808 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre (code=exited, status=0/SUCCESS)
   Main PID: 1816 (mysqld)
     Status: "Server is operational"
      Tasks: 37 (limit: 2220)
     Memory: 363.6M
        CPU: 7.052s
     CGroup: /system.slice/mysql.service
             └─1816 /usr/sbin/mysqld

Aug 12 12:30:21 homiedev-server systemd[1]: Starting MySQL Community Server...
Aug 12 12:30:24 homiedev-server systemd[1]: Started MySQL Community Server.

Cuối cùng chúng ta có thể log in vào mysql console bằng command sudo mysql.

homiedev@homiedev-server:~$ sudo mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.33-0ubuntu0.22.04.4 (Ubuntu)

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

Các bạn có thể chạy thêm lệnh mysql_secure_installation, lệnh này được sử dụng để cải thiện tính bảo mật cho cài đặt MySQL. Thông thường, nó được chạy sau khi cài đặt MySQL.

Để thực thi mysql_secure_installation, ta chạy command sudo mysql_secure_installation.

homiedev@homiedev-server:~$ sudo mysql_secure_installation

Securing the MySQL server deployment.

Connecting to MySQL using a blank password.

VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?

Press y|Y for Yes, any other key for No: y

There are three levels of password validation policy:

LOW    Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary                  file

Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 1

Skipping password set for root as authentication with auth_socket is used by default.
If you would like to use password authentication instead, this can be done with the "ALTER_USER" command.
See https://dev.mysql.com/doc/refman/8.0/en/alter-user.html#alter-user-password-management for more information.

By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
Success.

Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
Success.

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.

Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
 - Dropping test database...
Success.

 - Removing privileges on test database...
Success.

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
Success.

All done!

Các bạn có thể đọc thêm về lệnh này tại: https://dev.mysql.com/doc/refman/8.0/en/mysql-secure-installation.html.

SSH đến ubuntu server

Bài viết cũng khá dài, nhưng cũng cảm ơn các bạn vì đã đến được đây ^^, phần SSH đến remote server cũng khá đơn giản, trước tiên các bạn xem virtualbox setting network là NAT hay Bridged adapter.

Nếu network là NAT, các bạn thêm port như hình dưới nhé.

virtualbox port forwarding rules

Mình đang để Host port là 3022, và mặc định SSH server listen tại port 22 như chúng ta đã tìm hiểu ở trên. Với windows chúng ta sẽ thử mở command prompt và dùng command:

ssh user_name@remote_server_ip -p 3022

Nếu thành công, chúng ta sẽ được kết nối đến remote server thông qua SSH.

C:\Users\Admin>ssh homiedev@localhost -p 3022
homiedev@localhost's password:
Welcome to Ubuntu 22.04.3 LTS (GNU/Linux 5.15.0-78-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Sat Aug 12 01:38:38 PM UTC 2023

  System load:  0.06689453125      Processes:               115
  Usage of /:   48.1% of 11.21GB   Users logged in:         1
  Memory usage: 30%                IPv4 address for enp0s3: 10.0.2.15
  Swap usage:   0%

Expanded Security Maintenance for Applications is not enabled.

1 update can be applied immediately.
To see these additional updates run: apt list --upgradable

Enable ESM Apps to receive additional future security updates.
See https://ubuntu.com/esm or run: sudo pro status

Last login: Sat Aug 12 12:27:14 2023 from 10.0.2.2
homiedev@homiedev-server:~$

Để test thì bạn có thể dùng lệnh whoami, nó sẽ trả về user hiện đang login vào hệ thống.

homiedev@homiedev-server:~$ whoami
homiedev

Các bạn có thể sử dụng WinSCP, một tool để chúng ta có thể dễ dàng truyền tải các tệp tin an toàn giữa máy tính của bạn với remote server 😄.

Tạm kết

Như vậy là chúng ta đã cùng nhau tìm hiểu về một số kiến thức liên quan đến server như SSH, install tech stack trên ubuntu, cách config mạng để tạo liên kết giữa máy tính với máy ảo thông qua NAT và Bridged adapter của virtualbox 😁.

Nếu bạn viết thú vị các bạn có thể share cho bạn bè cùng đọc nhé. Nếu có thắc mắc các bạn có thể comment bên dưới phần bình luận nha.

Chúc các bạn học tốt 🎉.

Có thể bạn thích ⚡
homiedev
About Me

Hi, I'm @devnav. Một người thích chia sẻ kiến thức, đặc biệt là về Frontend 🚀. Trang web này được tạo ra nhằm giúp các bạn học Frontend hiệu quả hơn 🎉😄.

Chúc các bạn tìm được kiến thức hữu ích trong blog này 😁😁.