Thứ ba, 23/07/2019 | 00:00 GMT+7

Cách triển khai ứng dụng cốt lõi ASP.NET với server MySQL bằng Nginx trên Ubuntu 18.04

ASP.NET Core là một khung open-souce , hiệu suất cao để xây dựng các ứng dụng web hiện đại, nghĩa là một version module hơn của Khung ASP.NET của Microsoft . Được phát hành vào năm 2016, nó có thể chạy trên một số hệ điều hành như Linux và macOS. Điều này cho phép các nhà phát triển nhắm đến một hệ điều hành cụ thể để phát triển dựa trên các yêu cầu thiết kế. Với ASP.NET Core, nhà phát triển có thể xây dựng bất kỳ loại ứng dụng web hoặc dịch vụ nào dù mức độ phức tạp và kích thước.

Các nhà phát triển cũng có thể sử dụng các trang Razor để tạo thiết kế tập trung vào trang hoạt động trên đầu mẫu Model-View-Controller (MVC) truyền thống.

ASP.NET Core cung cấp sự linh hoạt để tích hợp với bất kỳ khuôn khổ front-end nào để xử lý logic phía client hoặc sử dụng dịch vụ web. Ví dụ: bạn có thể xây dựng một API RESTful với ASP.NET Core và dễ dàng sử dụng nó với các khung JavaScript như Angular, React và Vue.js.

Trong hướng dẫn này, bạn sẽ cài đặt và triển khai ứng dụng ASP.NET Core sẵn sàng production với Server MySQL trên Ubuntu 18.04 bằng Nginx. Bạn sẽ triển khai một ứng dụng ASP.NET Core demo tương tự như ứng dụng từ tài liệu của Microsoft và được lưu trữ trên GitHub . Sau khi triển khai, ứng dụng demo sẽ cho phép bạn tạo danh sách phim và lưu trữ trong database . Bạn có thể tạo, đọc, cập nhật và xóa các bản ghi khỏi database . Thay vào đó, bạn có thể sử dụng hướng dẫn này để triển khai ứng dụng ASP.NET Core của riêng mình; có thể bạn sẽ phải thực hiện các bước bổ sung bao gồm tạo file di chuyển mới cho database của bạn .

Yêu cầu

Bạn cần các thành phần sau cho hướng dẫn này:

Bước 1 - Cài đặt .NET Core Runtime

Cần có thời gian chạy .NET Core để chạy thành công ứng dụng .NET Core, vì vậy bạn sẽ bắt đầu bằng cách cài đặt ứng dụng này vào máy của bạn . Trước tiên, bạn cần đăng ký Microsoft Key và kho sản phẩm. Sau đó, bạn sẽ cài đặt các phụ thuộc cần thiết.

Đầu tiên, đăng nhập với quyền là user mới được tạo của bạn, đảm bảo bạn đang ở trong folder root của bạn :

  • cd ~

Tiếp theo, hãy chạy lệnh sau để đăng ký repository sản phẩm và khóa Microsoft:

  • wget -q https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb

Sử dụng dpkg với cờ -i để cài đặt file được chỉ định:

  • sudo dpkg -i packages-microsoft-prod.deb

Để tạo điều kiện cài đặt các gói khác cần thiết cho ứng dụng của bạn, bạn sẽ cài đặt repository universe bằng lệnh sau:

  • sudo add-apt-repository universe

Tiếp theo, cài đặt gói apt-transport để cho phép sử dụng các kho được truy cập qua giao thức HTTP Secure:

  • sudo apt install apt-transport-https

Bây giờ, hãy chạy lệnh sau để download danh sách gói từ repository và cập nhật chúng để nhận thông tin về version mới nhất của gói và các phụ thuộc của chúng:

  • sudo apt update

Cuối cùng, bạn có thể cài đặt SDK thời gian chạy .NET với:

  • sudo apt install dotnet-sdk-2.2

Bạn cần với thông tin chi tiết về kích thước của các file bổ sung sẽ được cài đặt. Nhập Y và nhấn ENTER để tiếp tục.

Đến đây bạn đã cài đặt xong .NET Core runtime SDK trên server , bạn gần như đã sẵn sàng download ứng dụng demo từ GitHub và cài đặt cấu hình triển khai. Nhưng trước tiên, bạn sẽ tạo database cho ứng dụng.

Bước 2 - Tạo Database và User MySQL

Trong phần này, bạn sẽ tạo user server MySQL, tạo database cho ứng dụng và cấp tất cả các quyền cần thiết để user mới kết nối với database từ ứng dụng của bạn.

Để bắt đầu, bạn cần truy cập client MySQL bằng account root MySQL như được hiển thị ở đây:

  • mysql -u root -p

Bạn cần nhập password account root , được cài đặt trong hướng dẫn yêu cầu .

Tiếp theo, tạo database MySQL cho ứng dụng với:

  • CREATE DATABASE MovieAppDb;

Bạn sẽ thấy kết quả sau trong console :

Output
Query OK, 1 row affected (0.03 sec) 

Đến đây bạn đã tạo thành công database . Tiếp theo, bạn sẽ tạo một user MySQL mới, liên kết họ với database mới được tạo và cấp cho họ tất cả các quyền .

Chạy lệnh sau để tạo user và password MySQL. Hãy nhớ thay đổi tên user và password thành một thứ gì đó an toàn hơn:

  • CREATE USER 'movie-admin'@'localhost' IDENTIFIED BY 'password';

Bạn sẽ thấy kết quả sau:

Output
Query OK, 0 rows affected (0.02 sec) 

Để truy cập database hoặc thực hiện một hành động cụ thể trên nó, user MySQL cần có quyền thích hợp. Hiện tại , administrator phim không có quyền thích hợp đối với database ứng dụng.

Bạn sẽ thay đổi điều đó bằng cách chạy lệnh sau để cấp quyền truy cập cho administrator phim trên MovieAppDb :

  • GRANT ALL PRIVILEGES ON MovieAppDb.* TO 'movie-admin'@'localhost';

Bạn sẽ thấy kết quả sau:

Output
Query OK, 0 rows affected (0.01 sec) 

Bây giờ, bạn có thể reload các bảng-cấp quyền quyền bằng cách chạy lệnh sau để áp dụng các thay đổi mà bạn vừa thực hiện bằng cách sử dụng câu lệnh flush:

  • FLUSH PRIVILEGES;

Bạn sẽ thấy kết quả sau:

Output
Query OK, 0 rows affected (0.00 sec) 

Bạn đã hoàn tất việc tạo user mới và cấp quyền . Để kiểm tra xem bạn có đang đi đúng hướng hay không, hãy thoát khỏi client MySQL:

  • quit;

Đăng nhập lại, sử dụng thông tin đăng nhập của user MySQL mà bạn vừa tạo và nhập password thích hợp khi được yêu cầu :

  • mysql -u movie-admin -p

Kiểm tra đảm bảo người quản trị phim có thể truy cập vào database đã tạo, hãy kiểm tra bằng:

  • SHOW DATABASES;

Bạn sẽ thấy bảng MovieAppDb được liệt kê trong kết quả :

Output
+--------------------+ | Database           | +--------------------+ | MovieAppDb         | | information_schema | +--------------------+ 2 rows in set (0.01 sec) 

Bây giờ, hãy thoát khỏi client MySQL:

  • quit;

Bạn đã tạo database , tạo user MySQL mới cho ứng dụng demo và cấp cho user mới tạo các quyền phù hợp để truy cập database . Trong phần tiếp theo, bạn sẽ bắt đầu cài đặt ứng dụng demo.

Bước 3 - Cài đặt ứng dụng demo và thông tin đăng nhập database

Như đã nêu trước đó, bạn sẽ triển khai một ứng dụng ASP.NET Core hiện có. Ứng dụng này được xây dựng để tạo danh sách phim và sử dụng mẫu thiết kế Model-View-Controller đảm bảo cấu trúc phù hợp và tách biệt các mối quan tâm. Để tạo hoặc thêm phim mới vào danh sách, user sẽ điền chi tiết thích hợp vào các trường biểu mẫu và nhấp vào nút Tạo để đăng thông tin chi tiết lên bộ điều khiển. Bộ điều khiển tại thời điểm này sẽ nhận được một yêu cầu POST HTTP với các chi tiết đã gửi và giữ nguyên dữ liệu trong database thông qua mô hình.

Bạn sẽ sử dụng Git để lấy mã nguồn của ứng dụng demo này từ GitHub và lưu nó vào một folder mới. Bạn cũng có thể download một ứng dụng thay thế tại đây nếu bạn sẽ triển khai một ứng dụng khác.

Để bắt đầu, hãy tạo một folder mới có tên là movie-app từ terminal bằng cách sử dụng lệnh sau:

  • sudo mkdir -p /var/www/movie-app

Đây sẽ là folder root cho ứng dụng của bạn. Tiếp theo, thay đổi chủ sở hữu folder và group để cho phép account user không phải root hoạt động với các file dự án:

  • sudo chown sammy:sammy /var/www/movie-app

Thay thế sammy bằng tên user không phải root có quyền sudo của bạn.

Bây giờ, bạn có thể di chuyển vào folder mẹ và sao chép ứng dụng trên GitHub:

  • cd /var/www
  • git clone https://github.com/do-community/movie-app-list.git movie-app

Bạn sẽ thấy kết quả sau:

Output
Cloning into 'movie-app'... remote: Enumerating objects: 91, done. remote: Counting objects: 100% (91/91), done. remote: Compressing objects: 100% (73/73), done. remote: Total 91 (delta 13), reused 91 (delta 13), pack-reused 0 Unpacking objects: 100% (91/91), done. 

Bạn đã nhân bản thành công ứng dụng demo từ GitHub, vì vậy bước tiếp theo sẽ là tạo kết nối thành công với database ứng dụng. Bạn sẽ thực hiện việc này bằng cách chỉnh sửa thuộc tính ConnectionStrings trong file appsettings.json và thêm các chi tiết của database .

Thay đổi folder vào ứng dụng:

  • cd movie-app

Bây giờ hãy mở file để chỉnh sửa:

  • sudo nano appsettings.json

Thêm thông tin đăng nhập database của bạn:

appsettings.json
{   "Logging": {     "LogLevel": {       "Default": "Warning"     }   },   "AllowedHosts": "*",   "ConnectionStrings": {     "MovieContext": "Server=localhost;User Id=movie-admin;Password=password;Database=MovieAppDb"   } } 

Với điều này tại chỗ, bạn đã tạo thành công kết nối với database của bạn . Bây giờ nhấn CTRL+X để lưu các thay đổi vào file và nhập Y để xác nhận. Sau đó nhấn ENTER để thoát trang.

Các ứng dụng ASP.NET Core sử dụng thư viện tiêu chuẩn .NET có tên Entity Framework (EF) Core để quản lý tương tác với database . Entity Framework Core là version nhẹ, đa nền tảng của công nghệ truy cập dữ liệu Entity Framework phổ biến. Nó là một trình ánh xạ quan hệ đối tượng (ORM) cho phép các nhà phát triển .NET làm việc với database bằng cách sử dụng bất kỳ nhà cung cấp database nào, chẳng hạn như MySQL.

Đến đây bạn có thể cập nhật database của bạn với các bảng từ ứng dụng demo được sao chép. Chạy lệnh sau cho mục đích đó:

  • dotnet ef database update

Điều này sẽ áp dụng một bản cập nhật cho database và tạo các schemas thích hợp.

Bây giờ, để xây dựng dự án và tất cả các phụ thuộc của nó, hãy chạy lệnh sau:

  • dotnet build

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

Output
Microsoft (R) Build Engine version 16.1.76+g14b0a930a7 for .NET Core Copyright (C) Microsoft Corporation. All rights reserved.    Restore completed in 95.09 ms for /var/www/movie-app/MvcMovie.csproj.   MvcMovie -> /var/www/movie-app/bin/Debug/netcoreapp2.2/MvcMovie.dll   MvcMovie -> /var/www/movie-app/bin/Debug/netcoreapp2.2/MvcMovie.Views.dll  Build succeeded.     0 Warning(s)     0 Error(s)  Time Elapsed 00:00:01.91 

Điều này sẽ xây dựng dự án và cài đặt bất kỳ phần phụ thuộc nào của bên thứ ba được liệt kê trong file project.assets.json nhưng ứng dụng vẫn chưa sẵn sàng để production . Để ứng dụng sẵn sàng triển khai, hãy chạy lệnh sau:

  • dotnet publish

Bạn sẽ thấy như sau:

Output
Microsoft (R) Build Engine version 16.1.76+g14b0a930a7 for .NET Core Copyright (C) Microsoft Corporation. All rights reserved.  Restore completed in 89.62 ms for /var/www/movie-app/MvcMovie.csproj. MvcMovie -> /var/www/movie-app/bin/Debug/netcoreapp2.2/MvcMovie.dll MvcMovie -> /var/www/movie-app/bin/Debug/netcoreapp2.2/MvcMovie.Views.dll MvcMovie -> /var/www/movie-app/bin/Debug/netcoreapp2.2/publish/ 

Điều này sẽ đóng gói và biên dịch ứng dụng, đọc qua các phần phụ thuộc của nó, xuất bản tập hợp file kết quả vào một folder để triển khai và tạo file .dll đa nền tảng sử dụng thời gian chạy .NET Core đã cài đặt để chạy ứng dụng.

Bằng cách cài đặt các phần phụ thuộc, tạo kết nối với database , cập nhật database với các bảng cần thiết và xuất bản nó để production , bạn đã hoàn thành cài đặt cho ứng dụng demo này. Trong bước tiếp theo, bạn sẽ cấu hình web server để làm cho ứng dụng có thể truy cập và bảo mật tại domain của bạn.

Bước 4 - Cấu hình Web Server

Bây giờ, sau khi làm theo hướng dẫn Cách bảo mật Nginx với Let's Encrypt , bạn sẽ có một server block cho domain của bạn tại /etc/nginx/sites-available/ your_domain với chỉ thị server_name đã được đặt phù hợp. Trong bước này, bạn sẽ chỉnh sửa server block này để cấu hình Nginx làm Reverse Proxy cho ứng dụng của bạn . Một Reverse Proxy là một server nằm trước các web server và chuyển tiếp mọi yêu cầu của trình duyệt web đến các web server đó. Nó nhận tất cả các yêu cầu từ mạng và chuyển tiếp chúng đến một web server khác.

Trong trường hợp ứng dụng ASP.NET Core, Kestrel là web server được ưu tiên đi kèm với nó theo mặc định. Nó rất tốt để cung cấp nội dung động từ ứng dụng ASP.NET Core vì nó cung cấp hiệu suất xử lý yêu cầu tốt hơn và được thiết kế để làm cho ASP.NET nhanh nhất có thể. Tuy nhiên, Kestrel không được coi là một web server đầy đủ tính năng vì nó không thể quản lý bảo mật và cung cấp các file tĩnh, đó là lý do tại sao bạn nên luôn chạy nó phía sau một web server .

Để bắt đầu, hãy đảm bảo bạn đang ở trong folder root của server :

  • cd ~

Mở server block để chỉnh sửa bằng:

  • sudo nano /etc/nginx/sites-available/your_domain

Như đã trình bày chi tiết trong Bước 4 của hướng dẫn Cách bảo mật Nginx với Let's Encrypt , nếu bạn chọn tùy chọn 2, Certbot sẽ tự động cấu hình server block này để chuyển hướng truy cập HTTP sang HTTPS chỉ với một vài sửa đổi.

Tiếp tục với cấu hình bằng cách chỉnh sửa hai khối đầu tiên trong file để phản ánh những điều sau:

/ etc / nginx / sites-available / your-domain
server {      server_name your-domain  www.your-domain;     location / {      proxy_pass http://localhost:5000;      proxy_http_version 1.1;      proxy_set_header Upgrade $http_upgrade;      proxy_set_header Connection keep-alive;      proxy_set_header Host $host;      proxy_cache_bypass $http_upgrade;      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;      proxy_set_header X-Forwarded-Proto $scheme;     }  listen [::]:443 ssl ipv6only=on; # managed by Certbot listen 443 ssl; # managed by Certbot ssl_certificate /etc/letsencrypt/live/your-domain/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/your-domain/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot   } ... 

Cấu hình trong server block này sẽ hướng dẫn Nginx lắng nghe trên cổng 443 , đây là cổng tiêu chuẩn cho các trang web sử dụng SSL. Hơn nữa, Nginx sẽ chấp nhận lưu lượng truy cập trên cổng 443 và chuyển tiếp mọi yêu cầu phù hợp tới server Kestrel tích hợp sẵn tại http://localhost:5000 .

Cuối cùng, sau server block mà bạn vừa chỉnh sửa trong file , hãy đảm bảo server block thứ hai trông giống như vậy:

/ etc / nginx / sites-available / your-domain
 ... server { if ($host = www.your-domain) {     return 301 https://$host$request_uri; } # managed by Certbot   if ($host = your-domain) {     return 301 https://$host$request_uri; } # managed by Certbot       listen 80;     listen [::]:80;      server_name your-domain  www.your-domain; return 404; # managed by Certbot } 

Server block này sẽ chuyển hướng tất cả các yêu cầu đến https:// your-domainhttps://www. your-domain với quyền truy cập HTTPS an toàn.

Tiếp theo, buộc Nginx nhận các thay đổi bạn đã thực hiện đối với server block bằng lệnh:

  • sudo nginx -s reload

Với cấu hình Nginx được hoàn tất thành công, server được cài đặt đầy đủ để chuyển tiếp tất cả các yêu cầu HTTPS được thực hiện đến https:// your-domain trên ứng dụng ASP.NET Core đang chạy trên Kestrel tại địa chỉ http://localhost:5000 . Tuy nhiên, Nginx không được cài đặt để quản lý quy trình server Kestrel. Để xử lý điều này và đảm bảo quy trình Kestrel tiếp tục chạy ở chế độ nền, bạn sẽ sử dụng các chức năng systemd .

Tệp Systemd sẽ cho phép bạn quản lý một quy trình bằng cách cung cấp các chức năng bắt đầu, dừng, khởi động lại và ghi log khi bạn tạo một quy trình làm việc được gọi là một đơn vị.

Di chuyển vào folder systemd :

  • cd /etc/systemd/systems

Tạo một file mới để chỉnh sửa:

  • sudo nano movie.service

Thêm nội dung sau vào nó:

movie.service
[Unit] Description=Movie app  [Service] WorkingDirectory=/var/www/movie-app ExecStart=/usr/bin/dotnet /var/www/movie-app/bin/Debug/netcoreapp2.2/publish/MvcMovie.dll Restart=always RestartSec=10 SyslogIdentifier=movie User=sammy Environment=ASPNETCORE_ENVIRONMENT=Production Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false  [Install] WantedBy=multi-user.target 

Tệp cấu hình chỉ định vị trí của folder của dự án với WorkingDirectory và lệnh thực thi khi bắt đầu quá trình trong ExecStart . Ngoài ra, bạn đã sử dụng chỉ thị RestartSec để chỉ định thời điểm khởi động lại dịch vụ systemd nếu dịch vụ thời gian chạy .NET gặp sự cố.

Bây giờ hãy lưu file và kích hoạt dịch vụ phim mới được tạo bằng:

  • sudo systemctl enable movie.service

Sau đó, tiến hành khởi động dịch vụ và xác minh nó đang chạy bằng cách khởi động dịch vụ:

  • sudo systemctl start movie.service

Sau đó kiểm tra trạng thái của nó:

  • sudo systemctl status movie.service

Bạn sẽ thấy kết quả sau:

Output
movie.service - Movie app    Loaded: loaded (/etc/systemd/system/movie.service; enabled; vendor preset: enabled)    Active: active (running) since Sun 2019-06-23 04:51:28 UTC; 11s ago  Main PID: 6038 (dotnet)     Tasks: 16 (limit: 1152)    CGroup: /system.slice/movie.service            └─6038 /usr/bin/dotnet /var/www/movie-app/bin/Debug/netcoreapp2.2/publish/MvcMovie.dll  

Kết quả này cung cấp cho bạn tổng quan về trạng thái hiện tại của movie.service được tạo để giữ cho ứng dụng của bạn tiếp tục chạy. Nó cho biết dịch vụ đã được kích hoạt và hiện đang hoạt động.

Điều hướng đến https:// your-domain từ trình duyệt của bạn để chạy và thử nghiệm ứng dụng.

Bạn sẽ thấy trang chủ của ứng dụng demo— Ứng dụng Danh sách Phim .

Ứng dụng danh sách phim

Với Reverse Proxy được cấu hình và Kestrel được quản lý thông qua systemd, ứng dụng web được cấu hình đầy đủ và có thể được truy cập từ trình duyệt.

Kết luận

Trong hướng dẫn này, bạn đã triển khai ứng dụng ASP.NET Core cho server Ubuntu. Để duy trì và quản lý dữ liệu, bạn đã cài đặt và sử dụng server MySQL và sử dụng web server Nginx làm Reverse Proxy để phục vụ ứng dụng của bạn .

Ngoài hướng dẫn này, nếu bạn quan tâm đến việc xây dựng một ứng dụng web tương tác bằng C # thay vì Javascript, bạn có thể thử một khung giao diện user web của Microsoft có tên Blazor . Nó là giao diện user web dựa trên thành phần hướng sự kiện để triển khai logic ở phía client của ứng dụng ASP.NET Core.

Nếu bạn muốn triển khai ứng dụng của riêng mình, bạn cần xem xét các thủ tục bắt buộc khác để triển khai ứng dụng của bạn . Bạn có thể tìm thấy mã nguồn hoàn chỉnh cho ứng dụng demo này tại đây trên GitHub .


Tags:

Các tin liên quan

Cách tối ưu hóa MySQL với Bộ đệm truy vấn trên Ubuntu 18.04
2019-06-12
Cách di chuyển database MySQL sang PostgreSQL bằng pgLoader
2019-05-28
Cách cấu hình SSL / TLS cho MySQL trên Ubuntu 18.04
2019-05-17
Cách thiết lập WordPress với MySQL trên Kubernetes bằng Helm
2019-05-07
Cách cho phép truy cập từ xa vào MySQL
2019-03-07
Cách sửa chữa bảng bị hỏng trong MySQL
2019-03-07
Cách khắc phục sự cố lỗi socket trong MySQL
2019-03-07
Cách giải quyết sự cố trong MySQL
2019-03-07
Cách khắc phục sự cố truy vấn MySQL
2019-03-07
Giới thiệu về Truy vấn trong MySQL
2018-10-17