Nginx快速上手

入职半年来,一直在Nginx的基础上做模块开发,学到了很多东西,也碰到了很多坑。在业务开发的同时,由于对Nginx本身也是一知半解,造成了很多不必要的Bug。痛定思痛,很早以前就想系统的学习一下Nginx,迟迟没有抽出时间下定决心,我知道和以前浅析Redis一样,那是一个一旦开始了就停不下来的旅程。好勒,别立flag了,一篇一篇写下去吧。

Nginx简介

Nginx(“engine X”)是一个高性能、轻量级的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。

Nginx具有处理响应请求快、支持高并发、内存消耗低,高可靠、高扩展性和支持热部署等特点。

Nginx能运行在Linux、各类BSD系统、Mac osX等各种类unix系统下,Nginx有自由的BSD协议,能够自由的在其基础上开发模块,以作商用。

Nginx可以用作静态HTTP服务器,代理服务器,负载均衡,虚拟主机,FastCGI等。

更多的用法和介绍可以移步Nginx官网查看。

Nginx安装和运行

Nginx的安装一般采取源码的方式,可以从Download Nginx下载源码包,安装方式如下:

1
2
3
4
5
6
7
8
9
10
11
12
// 下载源码
wget http://nginx.org/download/nginx-1.12.2.tar.gz
// 解压缩包
tar zxvf nginx-1.12.2.tar.gz
// 进入源码文件夹
cd nginx-1.12.2
// 运行configure,此处简化了后面的参数
./configure
// 编译
make
// 安装
make install

安装好之后,我们可以通过命令查看Nginx安装成功没,如下

1
2
3
4
5
6
/usr/local/bin/nginx -t
// 输出以下代表安装成功
nginx version: nginx/1.12.2
built by clang 9.0.0 (clang-900.0.39.2)
configure arguments:

接下来,我们可以启动Nginx,下面列出Nginx的基本启动、关闭等命令

1
2
3
4
5
6
7
8
// 启动
/usr/local/bin/nginx
// 自定义配置文件启动
/usr/local/bin/nginx -c /tmp/nginx.conf
// 停止
/usr/local/bin/nginx -s stop
// 重启
/usr/local/bin/nginx -s reload

启动Nginx之后,打开网站http://localhost:80,可以看到如下界面

Welcome Nginx

当Nginx主进程意外挂掉后,可以采取暴力措施,杀死Nginx进程,sudo pkill nginx,不过要慎用。

Nginx进程初识

开启Nginx后,通过ps命令查看nginx进程,可以看到:

1
2
3
nobody 31546 0.0 0.0 4296816 1492 ?? S 8:50PM 0:00.00 nginx: worker process
nobody 31545 0.0 0.0 4296816 1492 ?? S 8:50PM 0:00.00 nginx: worker process
root 31544 0.0 0.0 4287116 528 ?? Ss 8:50PM 0:00.00 nginx: master process /usr/local/nginx/sbin/nginx

Nginx的进程是有一个主进程,多个工作进程组成,他们的关系如下:

主进程用于管理工作进程,包括创建和销毁进程等;工作进程用于处理用户请求。这样可以大大提高Nginx处理请求的效率。

Nginx初体验

接下来,我们来看看Nginx的配置文件nginx.conf,它是Nginx的核心之一。首先我们来看一个示例。

Nginx配置

Nginx采取块配置,块与块之间可以嵌套。大体上可以分为四种块,全局,HTTP/EXENT/MAIL块,erver块,Location块。具体含义我们继续往下看。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
user nobody; // 用户名
worker_processes 1; // 工作进程数
master_process off; // 关闭主进程,即主进程和工作进程合为一个
daemon off; // 不以daemon模式运行
events {
worker_connections 768; // 设置最大事件连接数
}
error_log /var/log/nginx/notice.log notice; // 错误日志位置
http {
sendfile on; // 开启sendfile
keepalive_timeout 65; // 连接超时时间
server {
listen 80; // 监听80端口
server_name localhost; // 虚拟机名称
location / { // 具体处理的链接
// 处理http://localhost:80/
}
}
}

静态文本服务器

前面我们提到,Nginx可以做静态文本服务器。此时只需要在Nginx.conf文件中添加如下:

1
2
3
4
location / {
root html;
index index.html index.htm;
}

然后,重启服务器

1
/usr/local/bin/nginx -s reload

最后再Nginx工作目录中新建html文件夹,文件夹下新建index.html即可(其实这些都是Nginx自带的),那么在访问http://localhost:80/时,我们就能看到index.html中的内容了。

反向代理服务器

这里可以举例说明,当客户端访问服务器的时候,服务器自动获取我博客的内容,然后转发给客户端,在这个过程中,Nginx服务器扮演着传递的功能。要想实现这个简单的反向代理只需要增加一行配置文件。

1
2
3
location / {
proxy_pass https://zcheng.ren
}

更新:坑爹的是访问https需要ssl,这里大家还是改成http://www.baidu.com勉强感受一下吧。

再次重启服务器,输入http://localhost:80/,页面自动跳转到我的个人博客主页。

负载均衡

Ngin另一个比较大的用途是负载均衡,在Nginx中提供了负载均衡模块,可以很方便进行配置,完成这一需求。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
upstream http_server {
server 127.0.0.1:8080;
server 127.0.0.2:8080;
server 127.0.0.3:8080;
}
http {
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://http_server;
}
}
}

如上配置,代表着在进行请求的时候,会按照轮询的方式访问后端服务器,做到负载均衡的效果,另外Nginx支持多种负载均衡模式,如

  • 指定权重
    根据权重随机来选择访问哪台服务器

    1
    2
    3
    4
    5
    6
    upstream http_server {
    server 127.0.0.1:8080 weight = 10;
    server 127.0.0.2:8080 weight = 1;
    server 127.0.0.3:8080 weight = 1;
    }
  • ip_hash
    根据客户端ip的hash值来选择访问哪台服务器

    1
    2
    3
    4
    5
    6
    upstream http_server {
    server 127.0.0.1:8080 weight = 10;
    server 127.0.0.2:8080 weight = 1;
    server 127.0.0.3:8080 weight = 1;
    }
  • fair(第三方)
    按后端服务器的响应时间来分配请求,响应时间短的优先分配

    1
    2
    3
    4
    5
    6
    7
    upstream http_server {
    server 127.0.0.1:8080;
    server 127.0.0.2:8080;
    server 127.0.0.3:8080;
    fair;
    }

到这里,你就能简单用Nginx来做点事了,要想更进一步的了解Nginx,敬请期待下一篇。

2018.01.29
于工位上

文章作者: Zeech
文章链接: https://zcheng.ren/2018/01/29/NginxSource-quickstart/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 「 Zeech 」