首页 > 技术文章 > Linux----------nginx基础

wangchengshi 2019-06-04 15:56 原文

一、nginx简介

nginx(发音同engine x)是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like协议下发行。

nginx由俄罗斯的程序设计师Igor Sysoev所开发,最初供俄国大型的入口网站及搜寻引擎Rambler使用。

第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。

nginx的特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

nginx的官网:

1.1 nginx的特性:

nginx的特性:

  • 模块化设计,较好的扩展性
  • 外围支持好:文档全,二次开发和模块较多
  • 支持热部署:不停机更新配置文件,升级版本,更换日志文件
  • 低内存消耗:10000个keep-alive连接模式下的非活动连接,仅需要2.5M内存
  • 支持事件驱动、AIO(AsyncIO,异步IO)、mmap(Memory Map,内存映射)等性能优化
  • 配置通俗易懂
  • 稳定性高:用于反向代理,宕机的概率微乎其微
  • 在高连接并发的情况下,nginx是Apache服务器不错的替代品,能够支持高达50000个并发连接数的响应
  • 使用epoll and kqueue作为开发模型
  • nginx采用C进行编写,不论系统资源开销还是CPU使用效率都比Perlbal要好很多

1.2 nginx的基本功能

nginx的基本功能:

  • 静态资源的web服务器
  • http协议反向代理服务器
  • pop3/imap4协议反向代理服务器
  • FastCGI(LNMP),uWSGI(python)等协议
  • 模块化(非DSO),如zip,SSL模块

1.3 web服务相关的功能:

  • 虚拟主机(server)
  • 支持 keep-alive 和管道连接
  • 访问日志(支持基于日志缓冲提高其性能)
  • url rewirte
  • 路径别名
  • 基于IP及用户的访问控制
  • 支持速率限制及并发数限制
  • 重新配置和在线升级而无须中断客户的工作进程
  • Memcached 的 GET 接口

1.4 nginx的优点

nginx的优点:

  • 高并发连接:官方测试能够支撑5万并发连接,在实际生产环境中跑到2-3万并发连接数
  • 内存消耗少:在3万并发连接下,开启的10个nginx进程才消耗150M内存(15M*10=150M)
  • 配置文件非常简单:风格跟程序一样通俗易懂
  • 成本低廉:nginx为开源软件,可以免费使用。
  • 支持Rewrite重写规则:能够根据域名、URL的不同,将HTTP请求分到不同的后端服务器群组-
  • 内置的健康检查功能:如果Nginx Proxy后端的某台Web服务器宕机了,不会影响前端访问
  • 节省带宽:支持GZIP压缩,可以添加浏览器本地缓存的Header头
  • 稳定性高:用于反向代理,宕机的概率微乎其微
  • 模块化设计:模块可以动态编译
  • 外围支持好:文档全,二次开发和模块较多
  • 支持热部署:可以不停机重载配置文件
  • 支持事件驱动、AIO(AsyncIO,异步IO)、mmap(Memory Map,内存映射)等性能优化

二、nginx的组成

nginx由内核和模块组成。其中,内核的设计非常微小和简洁,完成的工作也非常简单,仅仅通过查找配置文件将客户端请求映射到一个location block(location是nginx配置中的一个指令,用于URL匹配),而在这个location中所配置的每个指令将会启动不同的模块去完成相应的工作。

2.1 nginx的程序结构

nginx的程序结构: master/worker结构

一个master进程:负责加载和分析配置文件、管理worker进程、平滑升级
一个或多个worker进程:处理并响应用户请求
缓存相关的进程:
cache loader:载入缓存对象
cache manager:管理缓存对象

2.2 nginx模块

nginx由内核和模块组成。其中,内核的设计非常微小和简洁,完成的工作也非常简单,仅仅通过查找配置文件将客户端请求映射到一个location block(location是nginx配置中的一个指令,用于URL匹配),而在这个location中所配置的每个指令将会启动不同的模块去完成相应的工作。

nginx模块分类: 模块分类:

  • 核心模块:core module(处理类)
  • 标准模块: (过滤类)
    HTTP 模块: ngx_http_*
    HTTP Core modules 默认功能
    HTTP Optional modules 需编译时指定
    Mail 模块 ngx_mail_*
    Stream 模块 ngx_stream_*
  • 第三方模块(代理类)

三、工作原理

  • nginx工作原理

  • nginx模块一次常规的HTTP请求和响应的过程

  • web服务请求过程

四、配置文件

Nginx的配置文件nginx.conf位于其安装目录的conf目录下。
nginx.conf由多个块组成,main(全局设置)、event(事件驱动设置)、server(主机设置)、upstream(负载均衡服务器设置)和 location(URL匹配特定位置的设置)。这五者之间的关系式:server继承main,location继承server,upstream既不会继承其他设置也不会被继承。

4.1 Main全局配置

Main 全局配置段常见的配置指令分类:

  • 正常运行必备的配置
  • 优化性能相关的配置
  • 用于调试及定位问题相关的配置
  • 事件驱动相关的配置

4.1.1 正常运行必备的配置

正常运行必备的配置:
帮助文档:http://nginx.org/en/docs/ngx_core_module.html
1、user
Syntax: user user [group];
Default: user nobody nobody;
Context: main
指定worker进程的运行身份,如组不指定,默认和用户名同名

2、pid /PATH/TO/PID_FILE
指定存储nginx主进程PID的文件路径

3、include file | mask
指明包含进来的其它配置文件片断

4、load_module file
模块加载配置文件:/usr/share/nginx/modules/*.conf
指明要装载的动态模块路径: /usr/lib64/nginx/modules

4.1.2 性能优化相关的配置

性能优化相关的配置:
1、worker_processes number | auto
worker进程的数量;通常应该为当前主机的cpu的物理核心数

2、worker_cpu_affinity cpumask ...
worker_cpu_affinity auto [cpumask] 提高缓存命中率
CPU MASK: 00000001:0号CPU
00000010:1号CPU
10000000:8号CPU
worker_cpu_affinity 0001 0010 0100 1000;
worker_cpu_affinity 0101 1010;

3、worker_priority number
指定worker进程的nice值,设定worker进程优先级:[-20,20]

4、worker_rlimit_nofile number
worker进程所能够打开的文件数量上限,如65535

4.2 事件驱动相关的配置

events {
         ...
}

1、worker_connections number
每个worker进程所能够打开的最大并发连接数数量,如10240
总最大并发数:worker_processes * worker_connections

2、use method
指明并发连接请求的处理方法 ,默认自动选择最优方法
use epoll;

3、accept_mutex on | off 互斥
处理新的连接请求的方法;on指由各个worker轮流处理新请求,Off指每个新请求的到达都会通知(唤醒)所有的worker进程,但只有一个进程可获得连接,造成“惊群”,影响性能

  • 调试和定位问题:
    1、daemon on|off 是否以守护进程方式运行nignx,默认是守护进程方式
    2、master_process on|off 是否以master/worker模型运行nginx;默认为on,off 将不启动worker
    3、error_log file [level] 错误日志文件及其级别;出于调试需要,可设定为debug;但debug仅在编译时使用了“--with-debug”选项时才有效
    方式:file /path/logfile;
    stderr:发送到标准错误
    syslog:server-address[,parameter=values]:发送到syslog
    memory:size 内存
    level:debug|info|notice|warn|error|crit|alter|emerg

4.3 http协议的相关配置

http协议的相关配置:

http {
          ... ...
         server {
                       ...
                      server_name
                      root
                     location [OPERATOR] /uri/ {
                                    ...
                     }
        }
        server {
                        ...
}

此配置请看随笔----nginx-http协议具体配置

4.4 stream服务器相关配置段

nginx的其它的二次发行版:
Tengine:由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。它的最终目标是打造一个高效、稳定、安全、易用的Web平台。从2011年12月开始,Tengine成为一个开源项目,官网 http://tengine.taobao.org/
OpenResty:基于 Nginx 与 Lua 语言的高性能 Web平台

nginx_stream_core_module模块
模拟反代基于tcp或udp的服务连接,即工作于传输层的反代或调度器

  • 1、stream { ... }
    定义stream相关的服务;Context:main
stream {
       upstream mysqlsrvs {
           server 192.168.22.2:3306;
           server 192.168.22.3:3306;
           least_conn;
       }
      server {
           listen 10.1.0.6:3306;
            proxy_pass mysqlsrvs;
       }
}
  • 2、listen
    listen address:port [ssl] [udp] [proxy_protocol][backlog=number] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];

  • 可实现代理基于TCP,UDP (1.9.13), UNIX-domain sockets的数据流
    1 proxy_pass address; 指定后端服务器地址
    2 proxy_timeout timeout; 无数据传输时,保持连接状态的超时时长,默认为10m
    3 proxy_connect_timeout time; 设置nginx与被代理的服务器尝试建立连接的超时时长,默认为60s

  • 示例:

stream {
            upstream mysqlsrvs {
                       server 192.168.0.10:3306;
                       server 192.168.0.11:3306;
                       hash $remote_addr consistent;
            }
            server {
                      listen 172.16.100.100:3306;
                      proxy_pass mysqlsrvs;
                      proxy_timeout 60s;
                      proxy_connect_timeout 10s;
            }
}

4.5 常需要调整的参数

  • worker_processes //启动n个worker进程,这里的n为了避免上下文切换,通常设置为cpu总核心数-1或等于总核心数
  • worker_connections //进程能够接受的最大连接数(最大32000)
  • worker_cpu_affinity 01 10 //表示开启两个进程,第一个进程对应着第一个CPU内核,第二个进程对应着第二个CPU内核
  • worker_priority 0 //进程的静态优先级,范围在-20~19,-20为最高优先级

五、编译安装nginx

//创建系统用户nginx
[root@localhost ~]# useradd -r -M -s /sbin/nologin nginx

//安装依赖环境
[root@localhost ~]# yum -y install pcre-devel openssl openssl-devel gd-devel gcc gcc-c++
[root@localhost ~]# yum -y groups mark install 'Development Tools'

//创建日志存放目录
[root@localhost ~]# mkdir -p /var/log/nginx
[root@localhost ~]# chown -R nginx.nginx /var/log/nginx

//下载nginx
[root@localhost ~]# cd /usr/src/
[root@localhost src]# wget http://nginx.org/download/nginx-1.12.0.tar.gz

//编译安装
[root@localhost src]# ls
debug  kernels  nginx-1.12.0.tar.gz
[root@localhost src]# tar xf nginx-1.12.0.tar.gz
[root@localhost src]# cd nginx-1.12.0
[root@localhost nginx-1.12.0]# ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-debug \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_image_filter_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_stub_status_module \
--http-log-path=/var/log/nginx/access.log \
--error-log-path=/var/log/nginx/error.log

[root@localhost nginx-1.12.0]# make -j 2 && make install

//设置环境变量
[root@localhost ~]# echo 'export PATH=/usr/local/nginx/sbin:$PATH' > /etc/profile.d/nginx.sh
[root@localhost ~]# . /etc/profile.d/nginx.sh

//启动nginx 
[root@localhost ~]# nginx   -t           //j检查配置文件是否有问题
[root@localhost ~]# nginx                //启动nginx
[root@localhost ~]# nginx -s stop    //停止nginx

推荐阅读