介紹#
vue在國內的前端地位可謂是如日中天,由於目前主流的前后端分離式開發,讓許多前端小伙伴不太了解服務器操作特別是Linux,而許多后台開發人員雖然精通服務器,卻不懂前端框架如何發布。本篇將詳細介紹vue構建靜態文件發布至Linux並配置Nginx服務代理https,在發布前我們先需要准備以下環境:
- Linux服務器:CentOS、Ubuntu
- 域名:雲服務商處購買域名
- SSL證書:雲服務商購買或Open SSL
配置服務器#
下面以阿里雲服務為例,介紹Linux服務搭建過程,購買過程省略
安裝Nginx#
使用SSH工具進入服務器(推薦XShell),安裝Nginx: CentOS使用以下命令: yum update
yum install nginx
Ubuntu使用命令: sudo apt update
sudo apt install nginx
安裝完成后啟動nginx並配置開機自動啟動 sudo systemctl start nginx
sudo systemctl enable nginx
瀏覽器輸入服務IP查看nginx是否成功啟動,出現以下界面說明安裝成功(Ubuntu有差異),需要先開啟80端口,參考下面端口配置
發布vue靜態文件#
在vue項目目錄下輸入npm run build:prod
,復制dist打包文件上傳至Linux服務器,上傳成功后復制文件所在路徑,最后配置nginx服務 輸入以下命令進入配置nginx vi /etc/nginx/nginx.conf
nginx配置大致如下:
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/ # * Official Russian Documentation: http://nginx.org/ru/docs/ user nginx; worker_processes auto; error_log /var/log/nginx/error.log; pid /run/nginx.pid; # Load dynamic modules. See /usr/share/doc/nginx/README.dynamic. include /usr/share/nginx/modules/*.conf; events { worker_connections 1024; } http { log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; include /etc/nginx/mime.types; default_type application/octet-stream; # Load modular configuration files from the /etc/nginx/conf.d directory. # See http://nginx.org/en/docs/ngx_core_module.html#include # for more information. include /etc/nginx/conf.d/*.conf; server { listen 80 default_server; listen [::]:80 default_server; server_name _;
配置文件較長,主要配置server節點的內容,其他給中配置都是默認不需要修改,將第一個server節點中的root路徑改為復制的dist路徑
server {
listen 80 default_server;
listen [::]:80 default_server; server_name _; root /home/dist; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { } error_page 404 /404.html; location = /404.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } }
修改完成后退出vi並保存,然后刷新瀏覽器IP訪問頁面,可以看到nginx服務已經使用http成功代理vue發布文件
圖中可以看到http代理下chrome自動提示連接不安全
域名配置#
域名配置以阿里雲域名服務為例,其他供應商均大同小異,購買過程省略。
注:域名服務最好和雲服務使用同一供應商,如阿里雲域名代理會對其服務器進行優化,速度更優,域名購買后需要實名認證才能使用。
域名解析#
1. 進入阿里雲域名管理控制台-域名列表,選擇你需要解析的域名#
2. 在解析設置中添加一條IPV4記錄#
保存成功后域名解析配置完成
SSL證書配置#
SSL證書同樣以阿里雲為例,購買過程省略,開發者可以選擇購買個人免費證書。
SSL證書下載#
1. 進入阿里雲SSL證書管理控制台-證書列表,選擇你購買的證書並按步驟提交申請-審核驗證。#
2. 審核通過后在證書列表下載項中選擇Nginx服務器下載#
3. 下載完成后上傳至Linux服務器並解壓#
解壓文件后復制文件路徑,可以根據需要修改文件名,如文件名太長。
Nginx配置#
修改Nginx默認配置#
進入nginx按照目錄並修改nginx.conf默認配置 cd /etc/nginx
vi nginx.conf
1. 開啟nginx 443端口監聽#
將nginx.conf中http節點第二個server配置注釋解除,也就是開啟nginx 443端口監聽。
2. 將ssl_certificate、ssl_certificate_key配置更換為上傳的SSL證書#
3. 修改https代理根目錄文件#
將root替換發布的vue靜態文件目錄
4. 配置http請求自動跳轉https#
在nginx 80端口配置中,也就是第一個server節點配置添加一行自動跳轉 rewrite ^(.*)$ https://$host$1 permanent;
完整配置如下#
server {
listen 80 default_server;
listen [::]:80 default_server; server_name xucz.vip; rewrite ^(.*)$ https://$host$1 permanent; root /usr/share/nginx/html; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { } error_page 404 /404.html; location = /404.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } } # Settings for a TLS enabled server. server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name xucz.vip; root /home/doc; ssl_certificate "/var/lib/nginx/xucz.vip.pem"; ssl_certificate_key "/var/lib/nginx/xucz.vip.key"; ssl_session_cache shared:SSL:1m; ssl_session_timeout 10m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; error_page 497 301 =307 # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { } error_page 404 /404.html; location = /404.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } }
端口配置#
1. 以上配置完成后需要開發端口才能正常訪問,阿里雲中端口不能在服務器防火牆中配置,只能在雲服務管理控制台-實例中添加安全組#
2. 在安全組配置規則中選擇快速添加,並將http和https加入安全組#
完成#
可以看到連接自動啟用https,如果將連接改為http同樣會自動跳轉至https
注:使用域名訪問80端口需要進行備案,我的域名暫時沒有備案所有使用端口進行訪問,效果同80端口訪問一致