考慮咱們爲何要選擇.NET Core?
由於它面向的是高性能服務器開發,拋卻了 AspNet 的臃腫組件,很是輕量,加上微軟的跨平臺戰略,對 Docker 的親和性,對於開發人員也很是友好,因此總體環境來講是健康發展的,將來技術決策時 .Net Core 也有很大的優點。那既然.NET Core 自己具備跨平臺 (Windows、Mac OSX、Linux) 特性,而以前咱們的網站一直是部署在 Windows Server 服務器上,這個章節咱們不妨學習在生產環境下,怎麼將咱們的網站應用程序切換部署在Linux系統上。
html
這裏數據庫由SQL Server改成MySQL,由於SQL Server 2017對運行環境要求的配置比較高,我這1G內存的低端雲服務器傷不起,o(╥﹏╥)omysql
首先將雲服務器,從新安裝操做系統,選擇CentOS / 7.1 x86_64 (64bit)版本的鏡像,並設置訪問用戶名和密碼,系統會幫咱們自動安裝好CentOS系統。接下來咱們配置一下Xshell和WinSCP,使得這2個工具能正常訪問並管理操做系統,相關的配置和使用方法,請你們自行百度。
完成上述操做後,首先查看一下硬盤狀況:linux
fdisk -l
發現咱們的第二塊磁盤雲磁盤(/dev/vdb)並無被加載。
在掛載以前,首先要格式化這塊硬盤。咱們選擇的是ext4格式:nginx
mkfs.ext4 /dev/vdb
硬盤格式化後,建立一個掛載目標目錄,並將磁盤掛載該目錄上:git
mkdir /data mount /dev/vdb /data
這時候,咱們再查看下系統磁盤狀況:github
df -h
能夠看到,雲磁盤能夠正常的被掛載了。可是若是重啓系統的話,磁盤仍舊會丟失,咱們還必須在每次啓動的時候將磁盤掛載。
修改/etc/fstab文件,須要在該文件的最後添加一行,具體以下:
至此,咱們重啓系統,發現磁盤能夠正常掛載使用了。sql
參考官方文檔:Prerequisites for .NET Core on Linux
第1步,註冊Microsoft簽名密鑰,而後添加Microsoft產品Feed:shell
sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc sudo sh -c 'echo -e "[packages-microsoft-com-prod]\nname=packages-microsoft-com-prod \nbaseurl=https://packages.microsoft.com/yumrepos/microsoft-rhel7.3-prod\nenabled=1\ngpgcheck=1\ngpgkey=https://packages.microsoft.com/keys/microsoft.asc" > /etc/yum.repos.d/dotnetdev.repo'
第2步,更新可用於安裝的產品列表,安裝.NET Core所需的組件,而後安裝.NET Core SDK:數據庫
sudo yum update sudo yum install libunwind libicu sudo yum install dotnet-sdk-2.0.0
第3步,設置環境變量:json
export PATH=$PATH:$HOME/dotnet
以上,.NET Core環境已配置完成,能夠新建一個項目HelloWorld,執行命令:dotnet run,正常運行,並使用localhost:5000正常訪問,這裏就再也不多述。
第1步,下載MySQL Yum倉庫的RPM安裝包:
在MySQL官網中下載YUM源rpm安裝包:http://dev.mysql.com/downloads/repo/yum/
第2步,安裝MySQL RPM安裝包:
yum localinstall mysql57-community-release-el7-11.noarch.rpm
第3步,安裝MySQL服務器:
yum install mysql-community-server
安裝完畢後,咱們啓動MySQL,並查看運行狀態,並設置開機啓動:
service mysqld start service mysqld status systemctl enable mysqld
mysql安裝完成以後,在/var/log/mysqld.log文件中給root生成了一個默認密碼。經過下面的方式找到root默認密碼:
grep 'temporary password' /var/log/mysqld.log
咱們獲取了默認密碼,就能夠進行一些安全設置,輸入命令:
mysql_secure_installation
最後設置遠程訪問權限:
mysql -u root -p mysql mysql> grant all privileges on *.* to 'root'@'%' identified by 'password' with grant option;
默認狀況,MySQL的字符集爲lanti,考慮咱們使用中文的習慣,修改mysql配置文件/etc/my.cnf,增長以下一行,把默認的字符集改爲utf8:
[mysqld] character-set-server=utf8
由於.NET Core自己就是支持跨平臺,因此程序邏輯不用進行任何調整,可是咱們已將數據庫切換成MySQL,因此針對這塊,稍微調整下。
首先,將appsettings.json中的數據庫鏈接字符串修改成新的鏈接;
而後,Startup.cs文件啓動配置修改以下:
services.AddDbContext<ApplicationDbContext>(options => options.UseMySQL(Configuration.GetConnectionString("DefaultConnection")));
從新編譯發佈到目錄:/data/wwwroot/MyWebSite
進入該目錄,執行:
dotnet MyWebSite.dll
如今咱們的項目就正常的部署並運行在localhost:5000上了。
Nginx是一個高性能的HTTP和反向代理服務器,在CentOS中很容易安裝和配置,接下來進行以下操做:
yum install nginx
安裝完成後,咱們啓動Nginx,並將它設置爲開機啓動:
service nginx start systemctl enable nginx.service
要使得Nginx代理外網80端口,訪問咱們內部5000端口監聽的網站程序,須要修改Nginx配置文件/etc/nginx/nginx.conf:
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; }
最後,咱們從新啓動restart nginx.service,並經過外網連接,發現能夠正常訪問咱們的網站了。
其實,通過以上的步驟,已經完成基本的移植和部署,網站訪問也沒有問題了。可是,.NET Core應用程序運行在shell之中,若是shell關閉,.NET Core應用程序也隨之關閉,致使應用沒法訪問。並且.NET Core進程意外終止或者服務器宕機或重啓,都會致使服務不可用,這是咱們不想看到的。
爲了解決這個問題,咱們須要有一個守護進程來監聽ASP.NET Core 應用程序的情況,在應用程序中止運行的時候當即從新啓動。
這裏利用Supervisor工具幫咱們建立這樣的守護進程,先安裝:
easy_install supervisor
安裝完畢後,以下操做
mkdir /etc/supervisor echo_supervisord_conf > /etc/supervisor/supervisord.conf
修改supervisord.conf文件,將文件尾部的配置修改:
[include] files = conf.d/*.conf
再建立一個/etc/supervisor/conf.d/ MyWebSite.conf文件,內容大體以下:
[program:MyWebSite] command=dotnet .dll ; 運行程序的命令 directory=/data/wwwroot/MyWebSite/ ; 命令執行的目錄 autorestart=true ; 程序意外退出是否自動重啓 stderr_logfile=/var/log/MyWebSite.err.log ; 錯誤日誌文件 stdout_logfile=/var/log/MyWebSite.out.log ; 輸出日誌文件 environment=ASPNETCORE_ENVIRONMENT=Production ; 進程環境變量 user=root ; 進程執行的用戶身份 stopsignal=INT
運行supervisord,查看是否生效:
supervisord -c /etc/supervisor/supervisord.conf ps -ef | grep MyWebSite
最後,咱們要配置Supervisor開機啓動,新建一個「/usr/lib/systemd/system/supervisord.service」文件
# dservice for systemd (CentOS 7.0+) # by ET-CS (https://github.com/ET-CS) [Unit] Description=Supervisor daemon [Service] Type=forking ExecStart=/usr/bin/supervisord -c /etc/supervisor/supervisord.conf ExecStop=/usr/bin/supervisorctl shutdown ExecReload=/usr/bin/supervisorctl reload KillMode=process Restart=on-failure RestartSec=42s [Install] WantedBy=multi-user.target
執行命令,使得服務開機啓動:
systemctl enable supervisord
CentOS中防火牆程序主要是firewall和iptables,CentOS7中firewall服務已經默認安裝好了。因此,這裏介紹一下firewall相關配置。
默認防火牆是關閉的,爲了訪問的安全性,咱們首先將防火牆開啓,並設置開啓啓動:
systemctl start firewalld.service systemctl enable firewalld.service
這時候,咱們訪問網站連接,發現已經端口屏蔽沒法正常訪問。因此接下來,咱們要開放http(80端口)、https(443端口)、MySQL(3306端口):
firewall-cmd --zone=public --add-port=80/tcp --permanen firewall-cmd --zone=public --add-port=443/tcp --permanen firewall-cmd --zone=public --add-port=3306/tcp --permanen
重啓服務器,從新打開網站連接,能夠正常訪問。
在以前Windows Server服務器上,已經配置過FTP服務器,項目部署時,經過VS能夠很方便的一鍵部署,那CentOS上該如何配置呢?
第1步,安裝一下ftp服務:
yum -y install vsftpd
第2步,打開/etc/vsftpd/vsftpd.conf配置文件,修改以下2處:
anonymous_enable=NO chroot_local_user=YES
第3步,打開ftp服務,並設置開機啓動,並開放遠程訪問端口:
systemctl restart vsftpd.service systemctl enable vsftpd.service firewall-cmd --permanent --add-service=ftp firewall-cmd --reload setsebool -P ftp_home_dir on
最後,增長一個ftp訪問用戶,配置發佈目錄,並提供寫權限和設置密碼:
useradd -d /data/wwwroot -m ftpuser -s /sbin/nologin cd /data/wwwroot/ chmod -R 777 * passwd ftpuser
VS2017中,修改ftp部署配置以下圖:
爲了實現數據信息在客戶端和服務器之間的加密傳輸,防止數據信息的泄露,保證雙方傳遞信息的安全性,咱們須要HTTP下加入SSL層,我以前已經申請過Symantec免費的SSL證書,因此就簡單說明一下怎麼配置。
前面咱們的網站應用程序,已經經過Nginx反向代理來訪問,那其實只用經過配置Nginx來管理咱們申請的證書文件。首先下載證書文件,包括.crt和.key兩個文件,而後拷貝到目錄:/etc/nginx/ssl下,接着編輯Nginx配置文件,找到相關地方作以下修改:
listen 80 default_server; listen [::]:80 default_server; listen 443 ssl; #若是硬性要求所有走https協議,這裏去除ssl server_name _; root /usr/share/nginx/html; #ssl on; #若是硬性要求所有走https協議,這裏開啓ssl on ssl_certificate /etc/nginx/ssl/www.lancel0t.cn.crt; ssl_certificate_key /etc/nginx/ssl/www.lancel0t.cn.key; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_protocols SSLv2 SSLv3 TLSv1.2; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf;
最後,咱們重啓一下Nginx,輸入咱們的網站地址:https://www.lancel0t.cn/ ,看到可以正常訪問。
至此,網站應用程序移植到Linux環境中完美完成!固然,實施的過程當中筆者也踩過很多的坑,這裏但願能拋磚引玉,有什麼問題歡迎給我博客留言,一塊兒討論。