作为一个前端开发人员,懂点服务器端的知识也是必不可少的,毕竟,我们可不想为了做一个简单的测试还得去麻烦别人,自给自足,没什么不好。如果你有时间和精力,向全栈迈进也未尝不可。
我最近正在做一个仿iOS端微信的聊天App-WChat,从前端到后台,全都是靠自己来实现。所以最近也接触了一些服务器知识,后面还准备了一篇关于Node.js
的文章。该项目的WebSocket
是通过Node.js
来实现的,后期的数据请求可能也是基于Node.js
实现。
Nginx介绍
Nginx(engine x
)是一个高性能的HTTP服务器(其实不止HTTP服务器),一般主要用作负载均衡和反向代理(如果你不清楚什么是反向代理,可以阅读我的另一篇文章)。
Nginx有一个主进程和很多工作进程,主进程的作用只有一个:通过读取配置文件(nginx.conf
)来维持工作进程正常工作。工作进程对应的才是实际的请求(request
),Nginx会自动将客户端的请求高效的分发给工作进程。工作进程的数量在配置文件中定义,或者通过CPU的核心数自动调整。(可参考官方文档)
在Linux系统下,Nginx的配置文件默认在/usr/local/nginx/conf/nginx.conf
、/etc/nginx/nginx.conf
或/usr/local/etc/nginx/nginx.conf
中。我是在CentOS
系统下使用的Nginx,本篇就基于CentOS
来介绍。
Nginx安装
对于Nginx的安装,官方的文档在这里,建议参阅官方说明(比较考验英文)。我是一路上踏过很多坑才把Nginx安装好(主要是由于Nginx版本和Linux版本都在不断更新,而百度出来的大多数教程都是过时的,或多或少都会有些问题)。
yum安装
推荐使用yum
来安装,简单省事。官方链接
方法很简单,首先创建/etc/yum.repos.d/nginx.repo
文件,然后写入以下内容:
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/OS/OSRELEASE/$basearch/
gpgcheck=0
enabled=1
其中的OS
是你的Linux版本,我的是centos
,直接替换就好。OSRELEASE
是版本号,6.x就写6
,7.x就写7
。比如我的baseurl
就是http://nginx.org/packages/centos/6/$basearch/
。
然后就可以直接使用yum install -y nginx
命令来一建安装,搞定。
通过yum安装的Nginx的配置文件可能位于/etc/nginx/nginx.conf
。
源码安装
不推荐使用这种方法,对于新手来说太折腾了。首先要安装依赖包:gcc
、g++
、PCRE
、zlib
、openSSL
。
安装依赖
- 安装
gcc
、g++
,用来编译源码;
$ yum install -y gcc gcc-c++
-
PCRE
,Perl正则表达式;
$ yum install pcre pcre-devel
-
zlib
,gzip压缩;
$ yum install zlib zlib-devel
-
OpenSSL
,SSL协议。
$ yum install openssl openssl-devel
如果你爱折腾,这些依赖包也可以下载源码,通过编译来安装。这里最头疼的就是版本之间的差异,涉及到的依赖包太多,有时候版本之间就会不兼容,或者需要其他的一些配置。
安装Nginx
去官网下载Nginx,最好不要下载最新版本,如果最新版本跟网上大多数教程说的有差异的话,真的很折腾人。
Linux下命令行操作:
# 下载源码
$ wget http://nginx.org/download/nginx-1.13.0.tar.gz
# 解压源码
$ tar xvf nginx-1.13.0.tar.gz
# 进入源码目录
$ cd nginx-1.13.0
# 配置、编译、安装
$ ./configure
$ make
$ make install
如果顺利的话,Nginx就已经安装完成啦。如果不顺利的话,就自行百度去或直接采用上面介绍的yum
来安装。./configure
命令可以带很多参数进行配置,我记不住那么多,需要的话还是自行百度。
这就是安装Nginx大概的流程,先安装依赖,再安装Nginx。不同系统不同版本之间可能会有差异,按照上面的方法你也不一定会成功。起初我在./configure
这一步就总是失败,就算带上详细的参数(--sbin-path
之类的)也是失败。
Nginx基本使用
如果你已经成功安装Nginx,那么你现在直接在命令行中敲入nginx
,然后回车,即可启动Nginx服务器。这时,你就可以在客户端输入你服务器的IP地址,就可以访问服务器默认的页面了。
启动、停止、重新加载配置信息
启动Nginx之后,你就可以使用下面的命令格式进行简单的操作了。
$ nginx -s signal
其中,signal
可以是以下指令:
-
stop
:关闭Nginx,会立刻终止所有的客户端请求。 -
quit
:关闭Nginx,直接翻译过来就是优雅的关闭。它会等当前所有的请求完成之后再关闭Nginx。 -
reload
:重新加载配置文件。一般当你修改配置文件后,使用它可以让修改的配置生效。 -
reopen
:重新打开日志文件,目前还没用到它。
官方还介绍了通过kill
指令来向Nginx进程发送这些操作信号。
配置文件简单说明
打开配置文件vim /usr/local/nginx/conf/nginx.conf
,文件结构大致如下:
http {
server {
listen 80;
server_name www.mohng.com;
location / {
root html;
index index.html index.htm;
}
location /wchat {
root html;
index index.html;
}
}
server {
listen 8080;
serer_name mail.mohng.com;
location / {
index index.html;
}
}
}
其中,一个server
就相当于一个服务器,你可以配置多个server
模块来虚拟多个服务器。listen
表示该服务器监听哪个端口,默认是80
端口。server_name
表示匹配主机名,比如我的server_name
是www.mohng.com
,那么,当客户端通过域名www.mohng.com
(前提是该域名已经正确解析到该服务器的IP地址)来访问的时候,就是匹配到这个服务器。如果客户端通过域名mail.mohng.com:8080
来访问的时候,就会匹配到下面那个服务器。如果你通过IP直接访问,会默认访问第一个服务器。
location
就是匹配的路由,root
是返回给客户端资源文件的根目录,它是相对nginx
路径的,也可以指定绝对路径(比如:/usr/local/nginx/www
)。index
就是默认返回的文件名(比如index.html
,index.php
,index.asp
等)。
配置简单的反向代理服务器,只需在匹配到的路由location
模块中,使用proxy_pass
来转到真实的服务器。
location / {
proxy_pass http://www.baidu.com;
}
更多配置文件的详细说明请参阅官方文档。
总结
其实,Nginx本身不难,难的是操蛋的英文。现在大多数工具、框架、技术文档,都是大篇大篇的英文,看起来实在痛苦。就比如React
和Vue
,我相信在国内,学好Vue
比学好React
要容易的多吧。
不管什么东西,最好的学习途径还是官方文档,毕竟,官方的文档永远都是最新的。就拿webpack
来说,现在网络上大部分教程都还是基于1.x
的,如果直接拿来在2.x
中使用全是坑。