Nginx的程序架构:
master/worker
一个master进程:---主进程
负载加载和分析配置文件、管理worker进程、平滑升级
一个或多个worker进程---子进程
处理并响应用户请求
缓存相关的进程:
cache loader:载入缓存对象
cache manager:管理缓存对象
特性:异步、事件驱动和非阻塞
并发请求处理:通过kevent、epoll、select、/dev/poll
文件io:高级io sendfile,异步,mmap
nginx模块:高度模块化,但其模块早期不支持dso机制(模块在编译支持时才能用),近期版本支持动态装载和卸载(只对特定模块);
模块分类:---主程序只是一个核心框架,其他功能包括web都是通过模块来实现
核心模块:core module
标准模块:
HTTP modules:
Standard HTTP modules---标准
Optional HTTP modules---可选
Mail modules
Stream modules---流模块,实现传输层4层负载均衡
传输层代理
3rd party modules---第三方模块,非标准,自己打补丁才能用
nginx的功用:
静态的web资源服务器;(图片服务器,或js/css/html/txt等静态资源服务器)
结合FastCGI(反代给fpmserver)/uwSGI/SCGI等协议反代动态资源请求;memcache反代给memcached server,http反代给web server,众多server都可以叫做后端服务器(backend)
http/https协议的反向代理;
imap4/pop3协议的反向代理;
tcp/udp协议的请求转发;
nginx的安装配置;
官方的预制包:
先使用yum info nginx查看一下有没有这个rpm包
http://nginx.org/packages/centos/7/x86_64/RPMS/---自己建立yum仓库指向这里(/etc/yum.repos.d/nginx.repo)
Fedora-EPEL
[nginx]
name=nginx repository
baseurl=http://nginx.org/packages/centos/7/x86_64/RPMS/
gpgcheck=0
yum repolist---查看仓库列表
yum install nginx
或者自己把官方的rpm包下载下来,在本地安装
编译安装:
~]#yum groupinstall "Development Tools" "Server Platform Development"---安装两个组,依然不能解决依赖关系
~]#yum install pcre-devel openssl-devel zlib-devel(网络通信压缩库)
~]#useradd -r nginx---主控进程以root身份运行,worker以普通用户身份运行
~]#./configure --prefix=/usr/local/nginx(默认安装目录) --conf-path=/etc/nginx/nginx.conf(主配置文件路径) --error-log-path=/var/log/nginx/error.log(错误日志路径) --http-log-path=/var/log/nginx/access.log(访问日志路径) --pid-
path=/var/run/nginx.pid(进程文件路径) --lock-path=/var/run/nginx.lock(锁文件路径) --user=nginx --group=nginx(以什么用户组身份运行) --with-http_ssl_module --with-http_v2_module --with_http_dav_module(分布式版本协作,支持put、delete方法的模块,不需要就不安装,不安全) --with-
http_stub_status_module(内建的状态页面类似httpd) --with-threads(线程池管理线程的逻辑,比默认的管理方式(work-process单个进程响应多少请求)更加高效 ) --with-file-aio(文件异步IO)(with额外装载的模块,nginx编译时,有些模块不会编译,会编译的不想使用就用without去掉)
#make&makeinstall
安装以后设置开机自启---自己写一个unitfile
复制一下/usr/lib/systemd/system/nginx.service这个文件(这是指定官方仓库安装后的文件),并修改一下就可以了
systemctl start nginx.service
使用ss -tnlp查看监听端口
使用ps -axu查看nginx有几个worker
程序环境:
配置文件的组成部分:
主配置文件:/etc/nginx/nginx.conf
Include conf.d/*.conf---把这个路径下所有以.conf结尾的配置文件都包含进来
fastcgi,uwsgi,scgi等协议相关的配置文件
mime.types:支持的mime类型---mime多用途互联网邮件扩展
主程序文件:/usr/sbin/nginx---这个主程序文件有很多参数,其中-V会显示编译的选项,我们可以复制,-s reload 可以重新装载配置文件不用重启服务-t可以测试配置文件语法
要想运行服务,可以直接使用命令也可以使用Unit File方式来启用(systemctl start nginx.service,ss -tnlp查看监听的端口,ps -aux查看启动的进程)
配置:
主配置文件的配置指令:
directive value [value2......];
注意:
(1)指令必须以分号结尾;
(2)支持使用配置变量;
内建变量:由nginx模块引入,可直接引用;
自定义变量:由用户使用set命令定义
set variable_name value;---也可以改内建变量的值
引用变量:$variable_name
主配置文件结构:
main block:主配置段,也即全局配置段;
event{
...
};事件驱动相关的配置
http{
...
};http/https协议相关的配置段;
mail{
...
};
stream{
...
};
http协议相关的配置结构---没有中心主机的概念,就算只有一个主机也要配置成虚拟主机
http{
...
...:各server的公共配置
server{
...
}:每个server用于定义一个虚拟主机;
server{
...
listen---监听地址端口
server_name---主机名
root---相当于document_root,指定站点根目录
alias---路径别名
location[OPERATOR] URL{---基于url限制能不能访问,不能基于文件系统(也就是文件路径)
...
if CONDITION{---基于条件来定义
...
}
}
}
}

nginx可以实现event-driven、asynchronous、non-blocking
针对网络IO:
收到用户请求以后,nginx还可以管理缓存,后端服务器响应内容可以保存在nginx本地,然后再给用户响应,第二个用户请求时,查询缓存,如果有直接返回(实现加速)
而这个缓存空间,nginx需要两个进程来管理cache loader,cache manager
针对磁盘IO:
可以是实现高级IO、sendfile、AIO(异步IO模型)、mmap(内存映射,在内存中开辟空间映射硬盘数据,直接访问硬盘数据,不用复制,想想上一节课的两阶段)、etc

nginx作为web server:是一个master/worker模型,master用来装载配置文件,启动worker进程,平滑升级(不用停nginx,就能升级版本)

每次更改nginx的配置以后,要检查一下有没有语法错误nginx -t,并重新载入一下配置nginx -s reload

然后详细讲解安装nginx以后的配置文件/etc/nginx/nginx.conf
user nginx;
worker_processes auto;---配置工作进程数量,这里一般是自动,对应cpu核心数,改为更多意义不大
error_log /var/log/nginx/error.log;---错误日志
pid /run/nginx.pid
worker_cpu_affinity auto;---把进程跟cpu自动一对一绑定

include /usr/share/nginx/modules/*.conf;---动态装载某些模块

events {
worker_connections 1024;---这里对应上边的worker_processes,这里不可随意更改
}

http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '---日志格式、日志的名称、内置的变量(客户端地址、远程用户(basic认证使用)、本地时间、请求报文的起始行)
'$status $body_bytes_sent "$http_referer" '---响应码、body部分字节数、引用(从上次访问跳转过来的,怎么到当前网页的)
'"$http_user_agent" "$http_x_forwarded_for" ';---什么浏览器、代理服务器在代理转发时会加一个真正客户端请求地址是谁
access_log /var/log/nginx/access.log main---访问日志、日志名称

sendfile    on;---发送文件,用户请求文件,由内核封装响应报文不用复制文件,提升性能
tcp_nopush  on;
tcp_nodelay on;
keepalive_timeout   65;保持连接的超时时长
types_hash_max_size 2048;

include /etc/nginx/mime.types;
default_type    application/octet-stream;---默认把每个文件识别成八进制的数据流
#load modular configuration files from the /etc/nginx/conf.d directory.
#see http://nginx.org/en/docs/ngx_core_module.html#include
#for more information.
include /etc/nginx/conf.d/*.conf;

server {
    listen      80 default_server;---基于域名的访问,默认虚拟主机,如果用户访问的虚拟主机找不到,就访问所有虚拟主机的第一个,不想第一个响应就设置默认的
    listen      [::]:80 default_server;---基于ipv6地址的访问
    server_name _;---下划线可以匹配所有主机名
    root        /usr/share/nginx/html;---默认网页根路径

    #load configuration files for the default server block.
    include /etc/nginx/default.d/*.conf;

    location / {
    }

    error page 404 /404.html;---自定义错误页
        location = /40x.html {
    }

    error page 500 502 503 504 /50x.html;
        location = /50x.html {
    }
}

#setting for a TLS enabled server.
}

那自己添加一个虚拟主机的做法
mkdir /data/nginx/vhost1 -pv ---最好和主机名一致
vim /data/nginx/vhost1/index.html
vim conf.d/vhost1.conf
server {
listen 80;
server_name www.ilinux.io;---给了主机名,访问的就是你定义的,不给访问的就是默认的
root /data/nginx/vhost1;
}
nginx -t测试语法
nginx -s reload重新载入配置文件不用重启

Nginx(2)
配置指令:
main配置段常见的配置命令:
分类:
正常运行必备的配置
优化性能相关的配置
用于调试及定位问题相关的配置
事件驱动相关的配置
正常运行必备的配置:
1、user
Syntax:user user [group]---组可以省略
Default:user nobody nobody;
Context:main

                Defines user and group credentials used by worker processes.If group is omitted,a group whose name equals that of user is used.
            2、pid/PATH/TO/PID_FILE:
                指定存储nginx主进程进程号码的文件路径
            3、include file | mask(掩码就是通配符)
                指明包含进来的其他配置文件片段
            4、load_module file
            指明要装载的动态模块
        性能优化相关的配置
            1、worker_processer number | auto;
                worker进程的数量;通常应该等于小于当前主机的cpu的物理核心数;
                auto:当前主机物理cpu核心数
            2、worker_cpu_affinity cpumask ...;---把进程跟cpu一对一绑定,可以提前隔离出cpu再绑定,也可以简单手工绑定(这种效果好),如果只运行nginx可以绑定,如果还要运行其他进程最好不要绑定
                worker_cpu_affinity auto [cpumask];
                cpu mask:---有4个cpu用4个0表示,有8个就用8个0
                    00000001:0号cpu
                    00000010:1号cpu
                    00000100:2号cpu
            3、worker_priority number:
                指定worker进程的nice值,设定worker进程优先级;[-20,20]
            4、worker_rlimit_nofile number;
                worker进程所能够打开的文件数量上限
        调试、定位问题: