提到部署,一眼望去这篇文章说的是运维的事儿
这篇文章讲述的是一个最基础的部署方法论。以下方法论也同样适用于容器和 DevOps,但配置方式上略有不同。
下面的内容分为以下几个部分
- 操作系统
- 服务端软件
- SSL 和 HTTPS
- 部署方法
如果对于前三个背景的介绍都比较了解,可以直接跳到最下面部署方法的部分阅读。
操作系统
通常来讲,为了保证服务器的稳定,操作系统通常来讲都会选择 Linux 的某个发行版本:
Linux 的发行版本有很多,其中也有一些系列。下表只做简单介绍,并不代表全部收集完整
linux 系 | 发行版本 | GUI | 简介 |
---|---|---|---|
Debian | Debian | 有 | 由开源社区维护的Debian系操作系统 |
Ubuntu | 有 | ||
Redhat | Redhat | 红帽系统,由公司维护,很贵的 | |
CentOS | 有 | 可以理解为红帽系统的免费版 | |
Fedora | 有 | 好像是 社区维护的红帽系操作系统 | |
SUSE | OpenSUSE | 在欧洲比较流行,吸取了红帽的很多特质 |
操作系统的选择,一方面考虑运维人员的习惯,另一方面,也考虑操作系统本身的性能以及需要运行的程序在操作系统上的支持情况。大多数时候,我都会偏向于选择 Debian
、Ubuntu
或者 CentOS
服务端软件
一个网站,需要通过 HTTP(80) 或者 HTTPS(443) 协议将内容抛给浏览器访问。这两个协议通过某个服务器软件来完成
Apache
Apache(阿帕奇)是世界排名第一(我怎么不觉得)
的 Web 服务端软件。跨平台,可以运行在几乎所有的电脑上,针对 Linux、Windows 和 MacOS 都有很好的支持。
Nginx 推荐
Nginx 是一个非常优秀的反向代理软件。占用系统资源小,同时也提供了IMAP/POP3/SMTP服务。是一个一次部署一劳永逸的软件。现在在国内的市场占有率非常大
Tengine 墙裂推荐
Tengine 是由淘宝网发起的 Web 服务器项目。它在 Nginx 的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine 的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。它的最终目标是打造一个高效、稳定、安全、易用的 Web 平台。
IIS 凑数的
IIS (Internet Information Service) 是微软研发的一套 Web 服务器,针对 asp、aspx 项目非常友好,只能运行在 Windows 上。
由于我一开始学习开发的时候用的是 IIS,所以还是让 IIS 拥有姓名
一般情况下,也会根据要部署的软件、服务来选择服务端软件,现在国内 Nginx 的占有率挺高的,Tengine 实际上也可以看作 Nginx 的一个变形,还支持邮件服务和反向代理,通常来讲选择 Nginx 的人会多一些
SSL 和 HTTPS
从协议理解
HTTP 是一种网络协议。这种协议用于把 HTML 的内容、图片、资源通过一种形式抛给浏览器。
SSL(Secure Sockets Layer)安全套接层,是用于安全传输的,但它有一点安全问题,后面出现了 TLS(Transport Layer Security)传输层安全协议
很多相关的文章都把这两者并列称呼(SSL/TLS),因为这两者可以视作同一个东西的不同阶段。
而 HTTPS 则可以理解成 HTTP over SSL 或者 HTTP over TLS
说人话
从端口上理解,HTTP 协议监听服务器 80 端口,HTTPS 协议监听 443 端口,通过相关端口把数据抛出
从表现上理解,HTTP 协议的网站会在浏览器 url 上最开头是 http://,HTTPS 协议的网站是 https:// 开头。使用了 HTTPS 的网站,还会在网址前面有一个小锁头,比如我的网站就是这样。
获取免费的证书
HTTPS 证书是需要付费购买的。现在有一些机构专门颁发这种证书。
但是也有免费的证书可以使用,访问 freessl.cn
注册一个用户,然后就可以在这个网站通过任何形式来申请证书。
部署方法
SSR 项目、Java 服务等的部署
SSR 项目需要 nodejs 环境支持,需要先安装最新版本的 nodejs 环境
Java 服务需要安装 Java Runtime Machine
前提是保证当前项目可以启动运行
nodejs 项目可以通过 pm2 管理器
来管理项目启停,也可以通过 screen 来管理进程。
Java 服务也需要通过相关的方法启动在后台,避免退出服务器管理时服务也被终止
新建网站
在 Nginx(或 Tengine)新建一个网站,配置网站域名,和将 https 证书进行配置和挂载
反向代理
启动项目后,项目可能运行在某一个端口上,假定运行在 http://localhost:8080 上
需要在 Nginx 当前网站的配置文件上配置反向代理,把 http://localhost:8080 代理到当前网站根目录
部署案例
server {
listen 80;
server_name mitkimi.com www.mitkimi.com; # 配置访问域名
rewrite ^(.*)$ https://$host$1 permanent; # 配置强制使用https
}
server {
listen 443 ssl;
server_name mitkimi.com www.mitkimi.com; # 配置域名
client_max_body_size 1024m;
ssl_certificate /home/www/blog@www.mitkimi.com/cert/cert.pem; # 配置SSL证书
ssl_certificate_key /home/www/blog@www.mitkimi.com/cert/private.key; # 配置私钥
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / { # 配置代理到 /
proxy_set_header HOST $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:8090/; # 配置代理到 / 的目标网址
}
}
PHP项目、SPA、静态网站的部署
PHP 是解释型语言,部署方法与静态网站十分类似。
不过前提是要安装 PHP 的支持
SPA 本质上是一个需要服务器的静态网站。和静态网站的部署没有区别
新建网站
在 Nginx(或 Tengine)新建一个网站,配置网站域名、指向本地地址,和将 https 证书进行配置和挂载(同上)
上传文件
将网站静态页面按照对应结构上传到上一步操作指向本地的地址
部署案例
server {
listen 80;
server_name elite.illiaccess.com;
rewrite ^(.*)$ https://$host$1 permanent;
}
server {
listen 443 ssl;
server_name elite.illiaccess.com;
ssl_certificate /home/www/elite@series/web/cert/cert.pem;
ssl_certificate_key /home/www/elite@series/web/cert/private.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root /home/www/elite@series/web/dist; # 配置当前网站根目录
index index.html; # 配置当前网站的默认文档
if (!-e $request_filename){
rewrite ^(.*)$ /index.html?s=$1 last; break; # 配置重写,覆盖掉入口文件在url上的现实: index.html(php 配置 index.php)
}
}
}
用反向代理解决跨域问题
至于什么是跨域问题,点击:黑米说:[Re]跨域和跨域问题的解决
上述文章中使用的方法,在生产环境中是无效的。
所以在生产环境中,应该使用反向代理的方法将服务端接口代理到本地,例如代理到本地的 /api
下面
假设服务端的地址是 http://api.mywebsite.com/
代理配置到 http://www.mywebsite.com/api
那么如果访问 http://www.mywebsite.com/api/user/token
就相当于访问到了 http://api.mywebsite.com/user/token
所以在前端开发的代理也要使用类似的方法来设置