Linux----------nginx基础

1、nginx简介

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

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

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

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

nginx的官网:c++

1.1 nginx的特性:

nginx的特性:web

  • 模块化设计,较好的扩展性
  • 外围支持好:文档全,二次开发和模块较多
  • 支持热部署:不停机更新配置文件,升级版本,更换日志文件
  • 低内存消耗: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的基本功能:sql

  • 静态资源的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,内存映射)等性能优化

2、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_*
  • 第三方模块(代理类)

3、工做原理

  • nginx工做原理

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

  • web服务请求过程

4、配置文件

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
一、user
Syntax: user user [group];
Default: user nobody nobody;
Context: main
指定worker进程的运行身份,如组不指定,默认和用户名同名

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

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

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

4.1.2 性能优化相关的配置

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

二、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;

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

四、worker_rlimit_nofile number
worker进程所可以打开的文件数量上限,如65535

4.2 事件驱动相关的配置

events {
         ...
}

一、worker_connections number
每一个worker进程所可以打开的最大并发链接数数量,如10240
总最大并发数:worker_processes * worker_connections

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

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

  • 调试和定位问题:
    一、daemon on|off 是否以守护进程方式运行nignx,默认是守护进程方式
    二、master_process on|off 是否以master/worker模型运行nginx;默认为on,off 将不启动worker
    三、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的服务链接,即工做于传输层的反代或调度器

  • 一、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;
       }
}
  • 二、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为最高优先级

5、编译安装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
相关文章
相关标签/搜索