入职半年来,一直在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下载源码包,安装方式如下:

// 下载源码
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安装成功没,如下

/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的基本启动、关闭等命令

// 启动
/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进程,可以看到:

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块。具体含义我们继续往下看。

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文件中添加如下:

location / {
            root   html;
            index  index.html index.htm;
        }

然后,重启服务器

/usr/local/bin/nginx -s reload

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

反向代理服务器

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

location / {
            proxy_pass https://zcheng.ren
        }

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

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

负载均衡

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

例如:

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支持多种负载均衡模式,如

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

    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值来选择访问哪台服务器

    upstream http_server {
    	ip_hash;
    server 127.0.0.1:8080;
    server 127.0.0.2:8080;
    server 127.0.0.3:8080;
    }
    
  • fair(第三方) 按后端服务器的响应时间来分配请求,响应时间短的优先分配

    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 于工位上