作为前端开发者,服务器端的知识一直都是我们大部分人的弱项和硬伤。
不仅仅是对服务器端处理逻辑、数据库的操作、以及系统高可用架构的优化上缺少经验,连对对 Linux 的操作和对 Nginx 的熟悉程度也不够。
于是,我奔着成为全栈工程师的宏大目标,开启了后端之旅(第1篇)。
Nginx 的入门和简单应用,是我第一个打算探索的 。
Nginx 是一个异步框架的Web服务器。它正变得越来越热门和常用,因为它相对于 Apache 能更好的处理高并发,性能更优,也更加方便进行模块化扩展。
那 Nginx 能做什么呢?
- 反向代理
- 负载均衡
- HTTP服务器(包含动静分离)
- 正向代理
听起来非常的厉害!与其临渊羡鱼不如,退而结网,赶紧开始学习吧!
一、安装 brew
brew 又叫 Homebrew
,是Mac中的一款软件包管理工具,通过 brew 可以很方便的在Mac中安装软件或是卸载软件。
一般Mac电脑会默认内置安装 brew。
常用命令如下:
brew 搜索软件:
brew search nginx
brew 安装软件
brew install nginx
brew 卸载软件
brew uninstall nginx
brew 升级
sudo brew update
查看安装信息(经常用到, 比如查看安装目录等)
sudo brew info nginx
查看已经安装的软件
brew list
这工具使起来非常爽,跟我们前端开发中的 npm/yarn 功能很类似。只不过这个工具在整个 Mac 系统都可以用,而 npm 一般只能用在基于 node 开发的工程项目中。
二、安装 Nginx
所谓万事俱备,只欠东风。安装好了 brew,离安装好 Nginx 只差一步之遥。
只需要一句 sudo brew install nginx
即可搞定。
(sudo 是什么?如果对 Linux 还不太熟的前端小白,可以移步 我的知乎回答)
三、启动 Nginx
安装好了 Nginx 之后,只需要一句命令就能启动 Nginx 服务:
sudo brew services start nginx
此时,在浏览器访问 localhost:8080 就可看到 Nginx 的默认页面了。
如果想查看 Nginx 相关的具体进程,可以使用
ps -ef | grep nginx
使用效果如下:
其他 Nginx 日常命令:
关闭nginx服务
sudo brew services stop nginx
重新加载nginx
nginx -s reload
停止nginx
nginx -s stop
查看nginx版本
nginx -v
四、更改 Nginx 配置
Nginx 安装完以后,可以在终端输出的信息里看到一些配置路径:
-
/usr/local/etc/nginx/nginx.conf
(配置文件路径) -
/usr/local/var/www
(服务器默认路径) -
/usr/local/Cellar/nginx/1.15.0
(貌似是安装路径)
日常应用中,1和2两个路径会经常用到,因此很重要。最开始提到的 Nginx 几个作用中,反向代理、负载均衡、正向代理都需要更改配置文件。把 Nginx 当成 HTTP服务器来用,既需要更改配置文件,大概率还会使用到服务器的根目录路径。
1. 反向代理配置文件 demo
server {
listen 8080;
server_name localhost;
client_max_body_size 1024M;
location / {
proxy_pass http://localhost:9000;
proxy_set_header Host $host:$server_port;
}
}
我本地 node 起了9000端口,Nginx 起的服务是8080端口。实现了在本地浏览器访问8080端口,Nginx 会代理到9000端口(node 服务)。
如果想实现既能代理,又要访问到 Nginx 本身的服务端口,可以再写一个 server 配置对象,配置如下:
server {
listen 3333;
server_name localhost;
client_max_body_size 1024M;
location / {
root html;
index index.html index.htm;
}
}
这样再访问 localhost:3333 就能访问到 Nginx 自身启动的服务了。
2. 负载均衡配置文件 demo
负载均衡的意思就是分摊到多个任务单元上,来共同完成同一个任务。
当有2台或以上服务器时,根据规则随机的将请求分发到指定的服务器上处理,负载均衡配置一般都需要同时配置反向代理,通过反向代理跳转到负载均衡。
我这里用本地多个端口模拟代替多台服务器。
upstream test {
server localhost:8000;
server localhost:9000;
}
server {
listen 4444;
server_name localhost;
client_max_body_size 1024M;
location / {
proxy_pass http://test;
proxy_set_header Host $host:$server_port;
}
}
两 个 node 服务,一个是8000 端口,一个是9000 端口。
此时访问 localhost:4444 可以看到偶尔会代理到8000端口,偶尔会代理到9000端口。
由此说明,Nginx 的负载起了作用。
它根据两个服务的实际运行情况,将网络请求分配到了不同的业务逻辑服务器(这里只是不同端口,现实情况应该是多个不同的真是服务器)上处理。
原来,后端经常说的高大上的“负载均衡”其实也不过如此。当然这只是一个非常简单的例子,不过是为了熟悉一下 Nginx 的配置。
其实 upstream 配置中还可以设置 权重,来实现 Nginx 把流量打到到各台服务器的概率。
upstream test {
server localhost:8000 weight=9;
server localhost:9000 weight=1;
}
这样就实现了,每10次请求到 Nginx,一般只会有1次会访问到9000端口,而有9次会访问到8000。
3. HTTP服务器(包含动静分离)配置文件 demo
文章开头也提到过,Nginx 本身就是一个 web 服务器。所以当只有静态资源的时候,就可以用 Nginx 来返回一个你自己的 index.html 文件,实现一个纯静态服务器。
在 Nginx 的服务器根目录 /usr/local/var/www
,新建一个 test.html,内容如下:
<!DOCTYPE html>
<html>
<head>
<title>test nginx index page</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>test nginx index page!</h1>
</body>
</html>
将 server 配置项改成:
location / {
root html;
index test.html index.htm;
}
(index.html 变成了我们新建的 test.html)
此时访问 localhost:8080 可以看到:
说明我们已经可以来实现一个自定义的简单版静态网站了,如果是需要将默认页面设成是非根目录下的 index.html 文件,需要改动少量配置文件(参考如下图)。
location / {
root /root; #把默认路径更改为/root目录下下
index index.html index.htm;
}
纯静态的 web 服务器比较好配置,但是动静分离性的就会复杂一些。
什么是动静分离?
动静分离是将网站里的所有请求区分为不变的静态资源请求和动态的数据请求。Nginx遇到静请求会直接返回nginx根目录下的静态资源,遇到动态请求会直接转发给后台真实的服务器(如Apache、Tomcat等),这就是网站动静分离处理的核心思路。
upstream test{
server localhost:8000;
server localhost:9000;
}
server {
listen 8080;
server_name localhost;
location / {
root e:wwwroot;
index index.html;
}
# 所有静态请求都由nginx处理,存放目录为html
location ~ .(gif|jpg|jpeg|png|bmp|swf|css|js)$ {
root e:wwwroot;
}
# 所有动态请求都转发给tomcat处理
location ~ .(jsp|do)$ {
proxy_pass http://test;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root e:wwwroot;
}
}
这样我们就可以把 html、图片、css以及js放到wwwroot目录下,而tomcat只负责处理jsp和请求。例如当我们后缀为.gif的时候,Nginx默认会从wwwroot获取到当前请求的动态图文件返回。
当然,这里的静态文件跟Nginx是同一台服务器,我们也可以在另外一台服务器,然后通过反向代理和负载均衡配置过去就好了。只要搞清楚了最基本的流程,很多配置就很简单了。另外localtion后面其实可以是一个正则表达式,配置非常灵活。
4. 正向代理配置文件 demo
正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。当你需要把你的服务器作为代理服务器的时候,可以用Nginx来实现正向代理。
因为正向代理用得少一些,所以这个我没有亲自踩坑。贴出网上配置实例,供各位看官参考:
resolver 114.114.114.114 8.8.8.8;
server {
resolver_timeout 5s;
listen 81;
access_log e:wwwrootproxy.access.log;
error_log e:wwwrootproxy.error.log;
location / {
proxy_pass http://$host$request_uri;
}
}
发布
resolver 是配置正向代理的DNS服务器,listen 是正向代理的端口。配置好了就可以在ie上面或者其他代理插件上面使用服务器ip+端口号进行代理了。
题外话
后端开发其实也并没有想象中的难,只是跟我们前端的开发思路上会有一些较大的差异。当我们在更多的处理着页面上离用户很近的 bug 的时候,后端正在做很多用户可能都感知不到的事情。
作为一个软件开发工程师(虽然目前仍是一个前端开发),后端开发这个环节非常重要,我们每个开发者都没有理由不去掌握它。
友情提示
Nginx 在 Mac 系统上的安装和常用命令可能跟 Windows 上不大一样。几年都没碰 Windows 了,为了避免踩出不必要的坑,建议使用 Windows 的童鞋移步 windows下nginx的安装及使用方法入门 - 腾讯云社区 :)
Nginx 进阶配置,可参考 nginx快速入门之配置篇 - 知乎