Mac OS X 下的 Nginx 使用(后端之旅I)

image.png

作为前端开发者,服务器端的知识一直都是我们大部分人的弱项和硬伤。

不仅仅是对服务器端处理逻辑、数据库的操作、以及系统高可用架构的优化上缺少经验,连对对 Linux 的操作和对 Nginx 的熟悉程度也不够。

于是,我奔着成为全栈工程师的宏大目标,开启了后端之旅(第1篇)。

Nginx 的入门和简单应用,是我第一个打算探索的 。

Nginx 是一个异步框架的Web服务器。它正变得越来越热门和常用,因为它相对于 Apache 能更好的处理高并发,性能更优,也更加方便进行模块化扩展。

那 Nginx 能做什么呢?

  1. 反向代理
  2. 负载均衡
  3. HTTP服务器(包含动静分离)
  4. 正向代理

听起来非常的厉害!与其临渊羡鱼不如,退而结网,赶紧开始学习吧!

一、安装 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

image.png

这工具使起来非常爽,跟我们前端开发中的 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 的默认页面了。

image.png

如果想查看 Nginx 相关的具体进程,可以使用

ps -ef | grep nginx

使用效果如下:

image.png

其他 Nginx 日常命令:

  • 关闭nginx服务
    sudo brew services stop nginx

  • 重新加载nginx
    nginx -s reload

  • 停止nginx
    nginx -s stop

  • 查看nginx版本
    nginx -v

四、更改 Nginx 配置

Nginx 安装完以后,可以在终端输出的信息里看到一些配置路径:

  1. /usr/local/etc/nginx/nginx.conf (配置文件路径)
  2. /usr/local/var/www (服务器默认路径)
  3. /usr/local/Cellar/nginx/1.15.0 (貌似是安装路径)
image.png

日常应用中,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 服务)。

image.png

如果想实现既能代理,又要访问到 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端口。

image.png
image.png

由此说明,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 可以看到:

image.png

说明我们已经可以来实现一个自定义的简单版静态网站了,如果是需要将默认页面设成是非根目录下的 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+端口号进行代理了。

image.png

题外话

后端开发其实也并没有想象中的难,只是跟我们前端的开发思路上会有一些较大的差异。当我们在更多的处理着页面上离用户很近的 bug 的时候,后端正在做很多用户可能都感知不到的事情。

作为一个软件开发工程师(虽然目前仍是一个前端开发),后端开发这个环节非常重要,我们每个开发者都没有理由不去掌握它。


友情提示
Nginx 在 Mac 系统上的安装和常用命令可能跟 Windows 上不大一样。几年都没碰 Windows 了,为了避免踩出不必要的坑,建议使用 Windows 的童鞋移步 windows下nginx的安装及使用方法入门 - 腾讯云社区 :)

Nginx 进阶配置,可参考 nginx快速入门之配置篇 - 知乎

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,406评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,976评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,302评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,366评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,372评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,457评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,872评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,521评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,717评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,523评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,590评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,299评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,859评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,883评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,127评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,760评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,290评论 2 342