前言
对于个人网站开发者来说,开发完网站并不意味着万事大吉,而是一个新的开始。刚开始,面临的一个最大的挑战是生产服务器的环境搭建。除此之外,还有网站的部署,运营,维护。在这篇文章,我将讲述生产服务器的环境配置,还有以Node服务为例,讲述项目一键部署。
吐槽一下:这篇文章的产生缘由是我要独立开发一个易班轻应用。对于为何要使用易班开放平台而不是其他如微信开放平台,人家的解释是:上面领导要求的嘛。人家要一个五彩斑斓的黑你有什么办法。整个部门就你会开发,你不搞谁搞。所以,就知难而上了,用了两个月,前端后端都搞了一遍,终于上线了一个全校用的轻应用,还别说,日均有200-300的独立用户,周五的话就有800多独立用户了,感觉服务器2核4G4M还行,Node可以开两个集群。话说我一个前端为何要搞全栈emmmmmm。我只想安安静静地做一个前端。
备注1:
这篇文章的所有配置都基于阿里云服务器,服务器配置:2核CPU,4G内存,4M宽带,系统:ubantu14.04。
备注2:
这篇文章的教程操作环境是在windows10电脑。
备注3:
这篇文章的服务器是指阿里云服务器。也许你得去购买一台。
备注4:
这篇文章假定我们拥有一台公网IP为123.456.789.1的服务器
文章目录
一,服务器登录以及安全
0. 服务器是什么?
服务器说白了,就是一台没有显示器的电脑。可以接入各种外界设备,像你的电脑一样用。但是,个人电脑并不能24小时开机,也不能永远保持网络连接,很少用于对外提供在线服务,当然,也不安全。所以,服务器就是最佳选择了。那么,提供对外服务,首先你得把你的服务器环境搭建好。就像酒店提供住宿服务,得把房间打扫好,热水wifi准备好,客人享受你的服务才会舒舒服服的。
1. 服务器登录
服务器通常不和你在一个地方的。你要用你自己的电脑远程连接服务器。这是服务器登录。
通常我们用windows登录linux系统的服务器的时候,要用到命令行窗口
。你可以用putty
或者xshell
等软件。但是最初,最好还是用windows自带cmd来进行远程登录。下面是步骤(假设你是第一次登陆)
- 打开cmd窗口
- 在命令行中输入
ssh -o ServerAliveInterval=30 root@123.456.789.1
,回车,成功连接就会出现密码输入。
(-o ServerAliveInterval=30
是为了让window定时刷新连接,要是登录后,我们很久不输入新命令,就会断开连接。所以加上这句,防止断开连接,也可以不加)
C:\User\PC> ssh -o ServerAliveInterval=30 root@123.456.789.1
- 输入密码,这里输入你的root账号登陆密码。当然,Linux下输入密码
光标不移动
。
root@123.456.789.1's password:
这样我们就成功登陆了。
2. 添加新用户
root用户权限是超级用户,所以可以使用很多敏感命令,要是一不小心让别人登录了,那就麻烦大了。所以添加一个用户作为我们日常开发用很有必要,也提高了我们服务器的安全。
思路:
- 创建用户
- 将用户添加到sudo组里面,便于像root一样使用命令,又不会产生安全问题
下面是我们的操作。当你登录之后,就会看到如下命令行:
root@iZwz9bq2dcwm9smklir3ntZ:~$
这是我们的服务器的命令行界面,在这里输入正确的命令就能对服务器进行各种操作。
- 添加用户
adduser userName
,其中userName是你要创建的用户名字,比如yban。再输入这个用户的密码,回车,再输入一遍,回车,用户就创建好了。命令如下:
root@iZwz9bq2dcwm9smklir3ntZ:~$ adduser yban
- 创建成功后, 为用户添加
sudo
角色权限,之后这个用户使用sudo命令时候,隔一段时间就要输入用户密码密码。其中userName是你创建的用户名字。命令如下:
root@iZwz9bq2dcwm9smklir3ntZ:~$ gpasswd -a userName sudo
- 添加成功后,就进入
visudo
的nano窗口,添加相应的用户配置。命令如下:
root@iZwz9bq2dcwm9smklir3ntZ:~$ sudo visudo
- 在nano编辑器里面你可以随意编辑,然后按,编辑visudo ,添加你新建的用户(如yban)到权限组里面。
找到下面的root ALL=(ALL:ALL) ALL
,在这行下面添加一行userName ALL=(ALL:ALL)ALL
,其中userName要替换成你新增用户名(如yban)。这行代码中的第一个ALL
是说对所有的用户生效,第二个ALL
是说yban可以以任何用户执行命令,第三个ALL
是说yban可以以任何组执行命令,最后一个ALL
是说这个规则适合所有命令。
#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults env_reset
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
# Host alias specification
# User alias specification
# Cmnd alias specification
# User privilege specification
root ALL=(ALL:ALL) ALL
yiban ALL=(ALL:ALL) ALL
# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
# See sudoers(5) for more information on "#include" directives:
#includedir /etc/sudoers.d
- 保存,退出编辑。当你在nano界面辑好之后,在保证输入法是英文的状态下,同时按下
Ctrl+X
,就会在下面出现一个语句。
意思是你要保存更改吗,回答NO不会改变任何东西(保持原状)
Save modified buffer (ANSERING "NO" WILL DESTROY CHANGES)?
Y Yes
N NO ^C Cancel
按shift+y
(大写的Y)就是确定,按shift+n
(大写的N)就是退出,按Ctrl+C
就是取消退出,继续编辑。
当你选择了以上三个中的一个之后,按下回车,就回到命令行界面了。
添加用户操作完成。
- 测试一下新加的用户是否能够登录。在保持原窗口不变的情况下,新开一个cmd窗口。接着输入
ssh yban@123.456.789.1
,如果出现提示输入密码,那么就成功了。在这里输入你刚才创建用户的密码
,而不是root密码
C:\User\PC>ssh yban@123.456.789.1
yban@123.456.789.1's password:
3. 本地免密登录服务器
由于每次登录服务器都要输入密码太麻烦了,能不能输入一行命令就能够登录呢?答案是可以的。
在这里我们要明白一个概念,什么是基于密匙的登录。如果依靠账号跟密码登录服务器,那么只要有人知道你的账号跟密码,那么就能够登录你的服务器。这不太安全。也有可能你连接不是你想连接的服务器。如果使用密匙,那么只要你登录时,电脑上有私钥,服务器上有公钥,两者一对比,就能够确认你是该用户而且较为安全。
思路以及原理:
- 本地电脑生成公钥和私钥,开启ssh服务。
- 登录服务器,将公钥上传到指定目录,开启ssh服务。
- 每次登录,本地电脑会向服务器请求用密匙进行安全验证。
- 服务器收到请求,会在服务器目录下寻找你的公钥,然后把他和你发过来的公钥进行比对。
- 如果比对一致,那么服务器就把公钥加密发送到本地电脑。
- 本地电脑收到之后就把自己的私钥解密后发送到服务器。
图解:
操作流程:
1. 生成密钥
这一步要先下载git,使用git bash命令行窗口在window下运行linux命令。
- 打开git bash窗口。
- 进入
C:/User/PC
目录。下载安装好git之后,在桌面右击鼠标,就会出现git 窗口选项,点击git bash Here
,就会出现下面的窗口
- 然后在命令行中输入
cd ~
就会进入用户目录
PC@DESKTOP-S4IM1EA MINGW64 ~/Desktop
$ cd ~
- 在这里查看是否有.ssh文件夹。如果没有则创建。如果有则进入
cd .ssh
。下面命令是创建文件夹。创建完成后进入该文件夹。
PC@DESKTOP-S4IM1EA MINGW64 ~
$ mkdir .ssh
PC@DESKTOP-S4IM1EA MINGW64 ~
$ cd .ssh
- 第一次创建之前
.ssh
文件夹应该为空。在这里输入ssh-keygen -t rsa -b 4096 -C "你的邮箱或github邮箱"
PC@DESKTOP-S4IM1EA MINGW64 ~
$ ssh-keygen -t rsa -b 4096 -C "你的邮箱或github邮箱"
- 然后出现确认创建(回车确定),输入密码(回车为空,不创建密码)
- 最后就成功创建密钥(注意,如果原来有密钥,创建则会覆盖原来的密钥),会在
.ssh
文件夹中出现两个文件id_rsa
和id_rsa.pub
私钥和公钥。除了ssh免密登录服务器之外,我们还可以把公钥放在github账户下,方便我们远程上传代码。 - 开启本地ssh代理。输入
eval "$(ssh-agent -s)
,回车
PC@DESKTOP-S4IM1EA MINGW64 ~
$ eval "$(ssh-agent -s)"
- 将私钥加入ssh代理中。输入
ssh-add ~/.ssh/id_rsa
,回车
PC@DESKTOP-S4IM1EA MINGW64 ~
$ ssh-add ~/.ssh/id_rsa
到此,本地的公钥和私钥就配置完成,ssh服务也开启了。
2. 上传公钥到服务器
- 账号登录远程连接服务器。进入用户目录下的
.ssh
文件夹。如果没有则新建,如第一步。
yban@iZwz9bq2dcwm9smklir3ntZ:~$ cd .ssh
- 如果没有公钥和私钥,按照第一步生成。
- 复制本地的公钥写入
authorized_keys
这个文件中,步骤如下:- 本地使用nodepad++打开
C:/Users/PC/.ssh/id_rsa.pub
,全部复制。 - 服务器上使用
sudo vi authorized_keys
,新建并打开该文件。 - 按
I
键编辑。光标应该在左上角,按右键粘粘。 - 粘贴完成后,按键盘左上角的
Esc
键退出编辑。 - 再
shift+;
,按出来冒号:
- 在冒号后面输入小写的
wq!
,就像:qw!
。回车保存退出。
- 本地使用nodepad++打开
- 修改
authorized_keys
文件的读写权限。在你用sudo命令的时候有时候会提示输入密码。那就输入该用户的密码就是。命令如下:
yban@iZwz9bq2dcwm9smklir3ntZ:~$ sudo chmod 600 authorized_key
- 重启ssh服务,命令如下:
yban@iZwz9bq2dcwm9smklir3ntZ:~$ sudo service ssh restart
最后,保证该窗口不关闭。新开一个窗口,输入下列命令,不会出现输入密码可以直接登录,即为成功设置。
C:\User\PC> ssh -o ServerAliveInterval=30 userName@你的公网IP
4. 加强安全等级
1) 修改默认端口
防火墙是为了拒绝恶意访问。但是连接服务器呢?所以我们要防止我们自己之外的人连接我们的服务器。
我们可以通过修改ssh连接的默认端口来达到我们的目的,减少被别人扫描和猜测的概率。如果在阿里云购买的服务器,可以修改安全组中的22端口白名单,只允许我们电脑的Ip登录。
修改默认端口步骤如下:
- 打开配置文件
yban@iZwz9bq2dcwm9smklir3ntZ:~$ sudo vi /etc/ssh/sshd_config
- 修改22默认端口为其他端口,通常在1024到六万之间。
# what ports,IPS and protocols we listen for
Port 22
- 在最下面加入一行
AllowUsers: userName
,添加你的用户名。 - 然后按下
Esc
,输入冒号加wq!:wq!
回车保存退出 - 重启ssh服务
yban@iZwz9bq2dcwm9smklir3ntZ:~$ sudo service ssh restart
- 在连接的时候要加上端口参数
C:\User\PC> ssh -p 你修改的端口 -o ServerAliveInterval=30 userName@你的公网IP
2) 关闭root密码登录
因为购买服务器或初始化服务器的时候,通常第一个用户名就是root。别人可以去扫描root下所有的端口的权限。所以我们要关闭root的密码登录,减少风险。
步骤如下:
- 打开配置文件
yban@iZwz9bq2dcwm9smklir3ntZ:~$ sudo vi /etc/ssh/sshd_config
- 修改最下面的
PermitRootLogin yes
修改为no
,还有PasswordAuthentication yes
更改为no
# Set this to 'yes' to enable PAM authentication, account processing,
# and session processing. If this is enabled, PAM authentication will
# be allowed through the ChallengeResponseAuthentication and
# PAM authentication via ChallengeResponseAuthentication may bypass
# If you just want the PAM account and session checks to run without
# and ChallengeResponseAuthentication to 'no'.
UsePAM yes
UseDNS no
AddressFamily inet
PermitRootLogin yes
SyslogFacility AUTHPRIV
PasswordAuthentication yes
AllowUsers:yban
- 然后按下
Esc
,输入冒号加wq!:wq!
回车保存退出 - 重启ssh服务
yban@iZwz9bq2dcwm9smklir3ntZ:~$ sudo service ssh restart
- 测试一下能不能登录root
C:\User\PC> ssh -p 你修改的端口 -o ServerAliveInterval=30 root@你的公网IP
ssh: connect to host 你的公网IP port 你修改的端口 : Connection refused
出现拒绝就是成功。
5. iptables防火墙
虽然服务器是给别人访问的,但是也有好人访问和坏人访问的区别。我们得拒绝坏人的访问。所以防火墙的配置是必须的。
下面是配置防火墙的步骤。首先你得连接上服务器。
- 刷新一下系统(ubantu14.04)的包
yban@iZwz9bq2dcwm9smklir3ntZ:~$ sudo apt-get update && sudo apt-get upgrade
- 清空
iptables
所有规则,再去进行配置
yban@iZwz9bq2dcwm9smklir3ntZ:~$ sudo iptables -F
- 进入配置文件,默认是空的。
yban@iZwz9bq2dcwm9smklir3ntZ:~$ sudo vi /etc/iptables.up.rules
- 配置规则如下:
# 允许所有建立起来的连接
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 允许所有出去的流量
-A OUTPUT -j ACCEPT
# 允许HTTPS和HTTP请求下的连接
-A INPUT -p tcp --dport 443 -j ACCEPT
-A INPUT -p tcp --dport 80 -j ACCEPT
# 为远程连接建立通道
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT
# 允许ping
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
# 记录拒绝的请求
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied:" --log-level 7
# 拦截恶意,频繁请求
-A INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --set
-A INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --update --seconds 60 --hitcount 150 -j DROP
# 拒绝其他请求
-A INPUT -j REJECT
-A FORWARD -j REJECT
COMMIT
- 然后按下
Esc
,输入冒号加wq!(:wq!
)回车保存退出 - 刷新
iptables
yban@iZwz9bq2dcwm9smklir3ntZ:~$ sudo iptables-restore < /etc/iptables.up.rules
- 查看防火墙状态,如果没有开启,则开启。
yban@iZwz9bq2dcwm9smklir3ntZ:~$ sudo ufw status
- 开启防火墙
yban@iZwz9bq2dcwm9smklir3ntZ:~$ sudo ufw enable
- 新建重启脚本,在服务器重启的时候一起重启.
yban@iZwz9bq2dcwm9smklir3ntZ:~$ sudo vi /etc/network/if-up.d/iptables
- 输入下面语句
#!/bin/sh
iptables-restore /etc/iptables.up.rules
- 然后按下
Esc
,输入冒号加wq!(:wq!
)回车保存退出 - 增加文件权限
yban@iZwz9bq2dcwm9smklir3ntZ:~$ sudo chmod +x /etc/network/if-up.d/iptables
至此,防火墙基本配置已经完成,你的服务器不再是裸奔了。
6. Fail2Ban
fail2ban是一个防御性的工具库,通过系统的日志文件,根据检测到的任何可疑行为,触发不同的防御动作。比如将可疑的目标ip进行拒绝访问。可以防御一些等级的可疑行为。
下载安装配置如下:
- 刷新一下系统(ubantu14.04)的包
yban@iZwz9bq2dcwm9smklir3ntZ:~$ sudo apt-get update && sudo apt-get upgrade
- 下载
yban@iZwz9bq2dcwm9smklir3ntZ:~$ sudo apt-get install fail2ban
- 下载完成后,打开编辑配置文件
yban@iZwz9bq2dcwm9smklir3ntZ:~$ sudo vi /etc/fail2ban/jail.conf
- 在102行,更改
action = %(action_)s
为action = %(action_mw)s
- 然后查看fail2ban的状态,如果是启动着就好。
yban@iZwz9bq2dcwm9smklir3ntZ:~$ sudo service fail2ban status
- 其他命令如停止
stop
,启动start
7. 总结
以上的配置都是为了更加安全的服务器环境,我们能够方便登录操作,服务器能够在别人的恶意试探和攻击中仍然可以提供稳定的线上服务。
二,服务器环境
0. web服务器是什么?
百度上介绍是这样的:
Web服务器一般指网站服务器,是指驻留于因特网上某种类型计算机的程序,可以向浏览器等Web客户端提供文档,也可以放置网站文件,让全世界浏览;可以放置数据文件,让全世界下载。
所以说,web服务器可以被用户请求资源,可以是网页,数据,文件,图片等。作为
服务提供方的我们,就要使用服务器上的应用提供服务给用户。
下面是服务器常见应用配置,分三类
- 脚本环境:Node,PHP,JDK(没有列出来的Python,ASP等)
- web服务器程序:Nginx,Tomcat(java)(没有列出来的Apache,IIS等)
- 数据库:Mysql,MongoDB,Redis(没有列出来的Oracle等)
下面就是服务器环境的介绍以及下载安装配置运行。
在此之前,请按照下面语句:
- 刷新一下系统(ubantu14.04)的包
yban@iZwz9bq2dcwm9smklir3ntZ:~$ sudo apt-get update
- 安装对应的安装包
yban@iZwz9bq2dcwm9smklir3ntZ:~$ udo apt-get install vim openssl build-essential libssl-dev wget curl git
1. Nginx
百度上是这样说的:
nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好。
所以,一般我们把Nginx作为网站的前置服务器处理所有用户请求,再根据请求的不同分发到不同的web服务器中。可以做负载均衡。在我们的服务器中,80端口只有一个,但是我们想在一台服务器跑很多服务,怎么办。那就用反向代理。比如你有一个主域名,下面很多二级域名,你就可以在nginx做反向代理,每个二级域名对应一个web服务。但是用户最先都是请求80端口的。
下面是基本配置:
1)下载安装配置
因为阿里云个的服务器刚开始有apache,为了不影响我们的安装,我们先把他卸载掉。
- 关闭apache应用,未开启则会提示没有这个服务
yban@iZwz9bq2dcwm9smklir3ntZ:~$ sudo service apache2 stop
- 从系统启动项中删除apache
yban@iZwz9bq2dcwm9smklir3ntZ:~$ update-rc.d -f apache2 remove
- 移除apache
yban@iZwz9bq2dcwm9smklir3ntZ:~$ sudo apt-get remove apache
- 接下来是安装nginx ,首先是刷新包
yban@iZwz9bq2dcwm9smklir3ntZ:~$ sudo apt-get update
- 安装nginx
yban@iZwz9bq2dcwm9smklir3ntZ:~$ sudo apt-get install nginx
- 进入配置,你会发现这是一个空的文件夹,我们要新建一个文件,作为我们web服务的配置文件。其中test是服务名字,3000是你要反向代理的端口。当然文件名可以随便,这样命名不过是为了方便看。
yban@iZwz9bq2dcwm9smklir3ntZ:~$ cd /etc/nginx/conf.d
yban@iZwz9bq2dcwm9smklir3ntZ:~$ sudo vi test-3000.conf
- 配置文件如下:
upstream test {
server 127.0.0.1:3000;
}
server {
listen 80;
server_name 你的公网IP或网址(不含http或https);
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Nginx-Proxy true;
proxy_pass http://test;
proxy_redirect off;
}
}
- 然后按下
Esc
,输入冒号加wq!(:wq!
)回车保存退出 - 接着编译
yban@iZwz9bq2dcwm9smklir3ntZ:~$ sudo nginx -t
- 重启服务
yban@iZwz9bq2dcwm9smklir3ntZ:~$ sudo nginx -s reload
至此,nginx反向代理就开启了。当你在网页地址栏输入http://你的公网IP
的时候,就会将80端口的请求转接到3000端口。
- 为了隐藏掉我们的nginx版本信息,需要执行以下步骤。先进入nginx配置目录
yban@iZwz9bq2dcwm9smklir3ntZ:~$ cd /etc/nginx/nginx.conf
- 找到
server_tokens off
,去掉前面的#
注释,保存 - 然后重启Nginx服务,这样就不会在请求不存在的端口时,报错页面会出现nginx的版本号了。也是为了安全考虑。
yban@iZwz9bq2dcwm9smklir3ntZ:~$ sudo service nginx reload
2)https服务
https
是超文本加密传输协议,简而言之,https比http好在安全。而且现在google浏览器都把http协议的网址域名标记为不安全了。所以https是正规网址的标配了。
其实为我们的网址配置https并不麻烦,也不难。现在很多云服务厂商都提供免费的ssl证书。不过时间短,只有一年。但也够用了。
这里配置https的前提是你已经购买了一个域名,并且实名认证通过了。
配置https思路:
- 申请ssl证书。
- 在nginx配置ssl证书,将http请求转为https请求。
申请SSL证书:
我们在腾讯云上面申请亚洲诚信的SSL证书。
- 用微信登录腾讯云。
- 点击右上角的【控制台】
- 在【控制台】点击左上边的【云产品】
4. 点击【域名与网站】下的【SSL证书管理】
5. 点击【申请免费证书】
6. 选择免费的亚洲诚信证书,点确定
7. 填写相关信息,在【通用名称】中填写你的网址(全称),填写完成后下一步。
8. 域名认证,选择【手动DNS验证】
9. 到【域名解析】中添加相应的记录。
10. 复制【主机记录】和【记录值】到【域名解析】中。
10. 添加记录,保存。
11. 然后就等待CA机构验证
12. 验证成功,SSL证书申请成功。
Nginx配置Https:
- 下载证书到本地,解压之后你会发现里面有各个服务器相应的证书文件,我们需要的是
nginx
的。
- 打开cmd,上传这两个证书文件到服务器的相应目录。(如果你有FTP传输那更好)我在服务器上存放ssl证书的目录是
home/yban/www/ssl
,本地存放目录是F:\下载\你申请的网址\Nginx
。每次传输一个,把下面的file替换成你的文件名。
F:\下载\你申请的网址\Nginx> scp ./file yban@xxx.xxx.xxx.xxx:/home/yban/www/ssl
- 证书和key上传成功后,就到服务器上配置Nginx。
yban@iZwz9bq2dcwm9smklir3ntZ:~$ sudo vi /etc/nginx/conf.d/test-3000.conf
- 配置如下:
upstream test {
server 127.0.0.1:3000;
}
server {
listen 80;
server_name 你申请的证书的域名;
#rewrite ^(.*) https://$host$1 permanent;
return 301 https://你申请证书的域名$request_uri;
}
server{
listen 443;
server_name 你申请证书的域名; #填写绑定证书的域名
ssl on;
ssl_certificate /home/yiban/www/ssl/1_你申请证书的域名_bundle.crt;
ssl_certificate_key /home/yiban/www/ssl/2_你申请证书的域名.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照这个协议配置
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置
ssl_prefer_server_ciphers on;
if ($ssl_protocol = ""){
rewrite ^(.*) https://$host$1 permanent;
}
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Nginx-Proxy true;
proxy_pass http://test;
proxy_redirect off;
}
}
- 然后按下
Esc
,输入冒号加wq!(:wq!
)回车保存退出。 - 重新编译
yban@iZwz9bq2dcwm9smklir3ntZ:~$ sudo nginx -t
- 重启服务
yban@iZwz9bq2dcwm9smklir3ntZ:~$ sudo nginx -s reload
至此,https申请和配置完成。当然,别忘了,这是一个前置服务,作为反向代理用的。你真正的服务还在其他地方。那些服务的端口,按照上面iptables(防火墙)的配置,是不能通过。除非,你的web服务也是通过80端口的。但是,和nginx抢位置可不好。在下面,我们会让防火墙允许其他端口的访问,比如3000端口。
2. Node
1)Node是什么?
node官方介绍:
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。
非常简单地一句话。换句话说,你能够像在浏览器一样在服务器和本地电脑上运行js脚本。
2)服务器Node环境搭建
- 刷新一下系统(ubantu14.04)的包
yban@iZwz9bq2dcwm9smklir3ntZ:~$ sudo apt-get update
- 安装
node
之前,需要安装nvm
【Node Version Manager(Node版本管理器),用它可以方便的在机器上安装并维护多个Node的版本】。上github,搜索nvm
,进入该项目,下拉到安装步骤。复制过来代码,回车。
yban@iZwz9bq2dcwm9smklir3ntZ:~$ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.34.0/install.sh | bash
- 安装完毕后,会提示你新打开窗口安装node
- 新打开窗口,查看Node官网上的node稳定版本。
- 安装最新稳定版本的稳定版本
yban@iZwz9bq2dcwm9smklir3ntZ:~$ nvm install v10.15.1
- 使用该版本
yban@iZwz9bq2dcwm9smklir3ntZ:~$ nvm use v10.15.1
- 指定默认版本
yban@iZwz9bq2dcwm9smklir3ntZ:~$ nvm alias default v10.15.1
- 使用国内镜像下载npm
yban@iZwz9bq2dcwm9smklir3ntZ:~$ npm --registry=https://registry.npm.taobao.org install -g npm
- 增加系统文件监控数目(别忘了最后加这句话)
yban@iZwz9bq2dcwm9smklir3ntZ:~$ echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p
- 如果npm下载慢,可以安装cnpm
yban@iZwz9bq2dcwm9smklir3ntZ:~$ npm --registry=https://registry.npm.taobao.org install -g cnpm
至此,node环境已经搭建完成。
3) 测试Node服务是否开启
编写脚本
- 在根目录下创建一个脚本
app.js
yban@iZwz9bq2dcwm9smklir3ntZ:~$ sudo vi app.js
- 进入编辑页面,添加如下语句:
const http = require('http');
const app = http.createServer((req, res) => {
res.writeHead(200, {'Content-Type':'text/plain'});
res.end('This is a server');
});
app.listen(3000);
console.log('server running on http://localhost:3000');
- 然后按下
Esc
,输入冒号加wq!(:wq!
)回车保存退出。 - 输入如下语句运行,出现输出语句就是成功运行
yban@iZwz9bq2dcwm9smklir3ntZ:~$ node app.js
server running on http://localhost:3000
4) 测试Node服务是否能够访问
基于【3)测试Node服务是否开启】,我们执行下列步骤:
- 在本地电脑上的浏览器地址栏输入
http://你的服务器公网ip地址
,访问服务器的80端口。但是,输入后一回车,会跑得很慢很慢,最后超时,显示不能访问。或者直接是503错误。确实,Nginx忠实地转发了我们的请求到3000端口,但是我们的防火墙不允许我们访问,所以我们要开启防火墙相应的端口。 - 首先打开防火墙iptables配置
yban@iZwz9bq2dcwm9smklir3ntZ:~$ sudo vi /etc/iptables.up.rules
- 增加下面的语句,意思是说:允许300端口的tcp请求,因为是在nginx在本地进行反向代理,所以填127.0.0.1。
# test page
-A INPUT -s 127.0.0.1 -p tcp --destination-port 3000 -m state --state NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -d 127.0.0.1 -p tcp --source-port 3000 -m state --state ESTABLISHED -j ACCEPT
- 然后按下
Esc
,输入冒号加wq!(:wq!
)回车保存退出。 - 刷新防火墙规则
yban@iZwz9bq2dcwm9smklir3ntZ:~$ sudo iptables-restore < /etc/iptables.up.rules
- 接着就可以访问我们Node服务了。
至此,Node服务就能够在我服务器上跑起来,并且能够访问了。但是一个node app.js
是远远不够我们稳定地对外提供服务的,在后面,我们会讲到怎么用pm2持久运行Node服务。
3. MongoDB
1)MongoDB是什么?
看官网简介:
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB是一个介于关系数据库和非关系数据库(nosql)之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
其实,相比于mysql,mongodb让我喜欢的是可扩展性。使用Json格式的数据,跟node可以很好的配合,取出来就能够马上使用。而mysql你还得提前建表。
下面是mongodb的安装步骤:
2)MongoDB服务器安装
- 打开浏览器,搜索
mongodvb install on ubantu doc
,进入安装步骤文档 - 文档第一步是导入
public_key
,我们直接复制粘粘到服务器,回车
yban@iZwz9bq2dcwm9smklir3ntZ:~$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 9DA31620334BD75D9DCB49F368818C72E52529D4
- 文档第二步,为mongodb创建一个列表,也是直接复制粘粘.,回车运行.
yban@iZwz9bq2dcwm9smklir3ntZ:~$ echo "deb [ arch=amd64 ] https://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/4.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.0.list
- 按照第3步,刷新一下系统(ubantu14.04)的包
yban@iZwz9bq2dcwm9smklir3ntZ:~$ sudo apt-get update
-
安装mongodb,按照第4步
-
如果遇到安装错误,可能阿里云的安装源有问题,所以先把阿里云的安装源屏蔽掉,打开配置后加上注释。这可能会导致安装很慢
yban@iZwz9bq2dcwm9smklir3ntZ:~$ sudo vi /etc/apt/apt.conf
- 如果安装很慢,那么就指定安装源
yban@iZwz9bq2dcwm9smklir3ntZ:~$sudo vi /etc/apt/sources.list.d/mongodb-org-4.0.list
- 第7步打开文件后,指定安装源如下
更改deb [ arch=amd64 ] https://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/4.0 multiverse
为deb [ arch=amd64 ] https://mirrors.aliyun.com/mongodb/apt/ubuntu trusty/mongodb-org/4.0 multiverse
- 如果有错误,排查无误后,再次安装
yban@iZwz9bq2dcwm9smklir3ntZ:~$ sudo apt-get install -y mongodb-org
- 安装完毕之后检查一下日志,如果看到mongodb start等字样,就是安装成功了。
yban@iZwz9bq2dcwm9smklir3ntZ:~$ cat /var/log/mongodb/mongod.log
- 然后打开防火墙,增加端口,防止数据库连接错误
yban@iZwz9bq2dcwm9smklir3ntZ:~$ sudo vi /etc/iptables.up.rules
- 增加下面代码
-A INPUT -s 127.0.0.1 -p tcp --destination-port 27017 -m state --state NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -d 127.0.0.1 -p tcp --source-port 27017 -m state --state ESTABLISHED -j ACCEPT
- 然后按下
Esc
,输入冒号加wq!(:wq!
)回车保存退出。 - 刷新防火墙
yban@iZwz9bq2dcwm9smklir3ntZ:~$ sudo iptables-restore < /etc/ipdtables.up.rules
- 接着就可以输入在命令行输入
mongo
,进入数据库
yban@iZwz9bq2dcwm9smklir3ntZ:~$ mongo
> 在这里输入mongodb命令
- 你可以到
/etc/mongd.conf
下修改Mongodb的配置文件,比如把默认端口修改为其他端口,但是记得更改防火墙规则。 - 还有一些其他操作(下面4个命令连起来就是完全移除Mongodb的操作)
sudo service mongod stop
sudo apt-get purge mongodb-org*
sudo rm -r /var/log/mongodb
sudo rm -r /var/lib/mongodb
以上就是服务器上安装配置mongodb的操作。
4. Redis
1)Redis是什么?
看一下介绍
REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。
Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。
所以,这是一个key-value键值对数据库。redis通常在内存中储存数据。因为内存的读写速度非常快,所以,redis的读写速度也非常快。通常,在web应用中,我们会拿redis作为session持久化的解决方案。
2) Redis服务器安装
- 刷新一下包
yban@iZwz9bq2dcwm9smklir3ntZ:~$ sudo apt-get update
- 下载redis
yban@iZwz9bq2dcwm9smklir3ntZ:~$ sudo apt-get install redis-server
- 开启redis
yban@iZwz9bq2dcwm9smklir3ntZ:~$ sudo redis-server /etc/redis/redis.conf
- 开启客户端测试。如果访问拒绝很大可能是防火墙没有开启相应的端口
yban@iZwz9bq2dcwm9smklir3ntZ:~$ redis-cli
127.0.0.1:6379> 输入redis命令
- 添加防火墙规则
yban@iZwz9bq2dcwm9smklir3ntZ:~$ sudo vi /etc/iptables.up.rules
- 增加下面代码
-A INPUT -s 127.0.0.1 -p tcp --destination-port 6379 -m state --state NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -d 127.0.0.1 -p tcp --source-port 6379 -m state --state ESTABLISHED -j ACCEPT
- 然后按下
Esc
,输入冒号加wq!(:wq!
)回车保存退出。 - 刷新防火墙
yban@iZwz9bq2dcwm9smklir3ntZ:~$ sudo iptables-restore < /etc/ipdtables.up.rules
- 更改配置,可以更改默认端口。(可略过)
yban@iZwz9bq2dcwm9smklir3ntZ:~$ sudo vi /etc/redis/redis.conf`
- 查看redis系统进程(可略过)
yban@iZwz9bq2dcwm9smklir3ntZ:~$ ps -aux|grep redis
- 通过启动命令检查redis服务器状态(可略过)
yban@iZwz9bq2dcwm9smklir3ntZ:~$ netstat -nlt|grep 6379
5. Mysql
1)Mysql是什么?
简而言之
MySQL 是最流行的关系型数据库管理系统
所以服务器上就算是不用也安装一个,以防不时之需
2)Mysql服务器安装
- 刷新一下包
yban@iZwz9bq2dcwm9smklir3ntZ:~$ sudo apt-get update
- 下载mysql
yban@iZwz9bq2dcwm9smklir3ntZ:~$ sudo apt-get install mysql-server
- 生成存储数据库和信息所需的目录结构
yban@iZwz9bq2dcwm9smklir3ntZ:~$ sudo mysql_install_db
- 运行脚本,修改不安全设置。就像是向导一样,你一步一步照着来就可以。会提示你是否改密码,如果你按下"N"或者是回车,那么root就不设密码。然后,会提示是否删除测试用户和数据库,确定就好。接着,会提示是否删除不安全的默认设置,确定就好。
yban@iZwz9bq2dcwm9smklir3ntZ:~$ sudo mysql_secure_installation
- 脚本运行后,mysql就可以使用了。输入下面命令.
yban@iZwz9bq2dcwm9smklir3ntZ:~$ mysql -u root -p 你的密码或者为空
mysql >
- 其他的命令(下面是完全删除mysql的命令)
// 删除mysql的数据文件
sudo rm /var/lib/mysql/ -R
//删除mqsql的配置文件
sudo rm /etc/mysql/ -R
//自动卸载mysql的程序
sudo apt-get autoremove mysql* --purge
sudo apt-get remove apparmor
6. PHP
1)PHP是什么?
看介绍
PHP 是一种创建动态交互性站点的强有力的服务器端脚本语言。
PHP 是免费的,并且使用非常广泛。同时,对于像微软 ASP 这样的竞争者来说,PHP 无疑是另一种高效率的选项。
其实php文件里面可以完全是html和javascript,不过作为一个动态脚本,就可以运行在服务器上向外提供服务了。
2)PHP服务器安装
- 刷新一下包
yban@iZwz9bq2dcwm9smklir3ntZ:~$ sudo apt-get update
- 安装php5-fpm(php进程管理器),和php5连接数据库插件
yban@iZwz9bq2dcwm9smklir3ntZ:~$ sudo apt-get install php5-fpm php5-mysql
- 安装完毕,配置php。打开配置文件,找到
;cgi.fix_pathinfo=0
,去除分号,并且设置为0,因为这个配置在默认下会让用户执行强制执行Php脚本。这不安全。
yban@iZwz9bq2dcwm9smklir3ntZ:~$ sudo nano /etc/php5/fpm/php.ini
- 然后重启php服务
yban@iZwz9bq2dcwm9smklir3ntZ:~$ sudo service php5-fpm restart
- 让nginx可以代理php服务,打开设置
yban@iZwz9bq2dcwm9smklir3ntZ:~$ sudo nano /etc/nginx/sites-available/default
- 更改该文件对应位置如下
server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
root /usr/share/nginx/html;
index index.php index.html index.htm;
server_name server_domain_name_or_IP;
location / {
try_files $uri $uri/ =404;
}
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
- 测试php文件能否跑起来,增加测试文件
sudo nano /usr/share/nginx/html/info.php
,测试代码如下
<?php
phpinfo();
?>
- 在本地浏览器打开
http://你的服务器ip地址/info.php
能够看到php信息也就是成功了。测试完成后记得把测试文件删除。
7. JDK
1)JDK是什么?
JDK就是java的开发工具包,也是环境包,跑Java虚拟机,javac编译器都要用到的。你要在服务器上用java脚本提供web服务,那么JDK必不可缺。通常我用jdk8。
2)JDK服务器安装
- 在oracal官方网站下载jdk(.tar.gz结尾的)
- 传输到服务器某一个文件夹中(scp)。解压到某一个文件夹
sudo tar -xf 文件名 -C 解压的文件夹路径
sudo vi /etc/profile
配置相应的环境变量,增加下面语句
JAVA_HOME=/usr/lib/jvm/jdk1.8.0_131# 这里是相应的文件路径
JRE_HOME=$JAVA_HOME/jre
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME CLASSPATH PATH
- 保存退出
source /etc/profile
刷新- 测试一下能不能跑java虚拟机
java -version
和javac -version
有出现相应信息就是成功了
8. Tomcat
1)Tomcat是什么?
Tomcat说白了就是以java为脚本的web服务器。你要用java提供web服务,一定少不了Tomcat。
2)Tomcat服务器安装
- 在tomcat官方网站下载对应版本的压缩文件(.tar.gz)
- 传输到服务器上,解压到你自定义的目录
/usr/local/tomcat
最好是把文件命名为tomcatsudo mv tomcat-xxxx tomcat
- 增加自启动脚本
1. cp -p /usr/local/tomcat/bin/catalina.sh /etc/init.d/tomcat
2. vim /etc/init.d/tomcat
增加下面语句
JAVA_HOME=/usr/local/jdkxxxx/#对应文件路径
CATALINA_HOME=/usr/local/tomcat
- 增加自启动文件的权限
chmod 755 /etc/init.d/tomca
- 添加tomcat服务到系统自启动服务中
update-rc.d –f tomcat defaults
- 启动tomcat服务
service tomcat start
- 查看是否启动成功
ps aux |grep tomcat
- 测试是否能够连接
curl http://localhost:8080
如果有页面抛出,则为成功 - 额外
- 修改tomcat服务默认端口
默认是8080,如果你想修改为80,则需要修改server.xml文件。
找到 <Connector port="8080" protocol="HTTP/1.1"
修改为:<Connector port="80" protocol="HTTP/1.1"
- 配置新的虚拟主机
cd /usr/local/tomcat/conf/
vim server.xml
找到,下一行插入新的,内容如下:
<Host name="www.example.cn" appBase="/data/tomcatweb"
unpackWARs="false" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
<Context path="" docBase="./" debug="0" reloadable="true" crossContext="true"/>
完成后,重启tomcat
service tomcat stop; service tomcat start
测试新建的虚拟主机,首先需要修改你电脑的hosts文件
vim /data/tomcatweb/test.jsp
加入以下内容:
<html><body><center>
Now time is: <%=new java.util.Date()%>
</center></body></html>
保存后,在你的浏览器里输入 http://www.example.cn/test.jsp
看是否访问到如下内容:
Now time is: Thu Jun 02 14:32:34 CST 2011
上面的test.jsp就是要显示当前系统的时间。
- 如果想要在外部访问,就需要修改防火墙和nginx配置,方法如上。也需要添加相应的域名
三,写在最后
本来还想写关于PM2一键部署Node项目的。但是觉得跟题目不搭边就另开一篇吧。还有配置服务器的同时,还需要申请域名和实名认证,备案。这些没有写上去。但是阿里云上有相关的文档,这里就不再赘述了。
如果要提供web服务的话,光是配置好生产环境是远远不够的。这个以后再说。
最后祝各位身体健康。