常用功能

web服务器
web缓存服务器
反向代理:四层代理和七层代理
负载均衡

工作原理

nginx是由内核和一系列模块组成,内核提供了web服务的基本功能,如启用网络协议,创建运行环境,接收和分配客户端请求,处理模块之间的交互。
nginx的各种功能都是由模块来实现的,nginx的模块从结构上可分为核心模块、基础模块和第三模块

核心模块:HTTP模块、event模块和mail模块
基础模块:HTTP access模块,HTTP fastcgi模块,HTTP proxy模块以及HTTP rew模块
第三模块:HTTP upstream模块,以及用户自己提供的
官方文档:http://nginx.org/en/docs/

安装:使用Epel源进行安装
1.下载阿里源的EPEL源仓库
[root@node1 ~]# wget ‐O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel7.repo
2.安装nginx
[root@node1 ~]# yum install nginx ‐y
[root@node1 ~]# nginx ‐v
nginx version: nginx/1.12.2
3.启动服务,并测试
/usr/share/nginx/html/ —> 默认安装后的站点根目录
/var/www/html

[root@node1 ~]# systemctl start nginx.service
[root@node1 ~]# echo “hello” > /usr/share/nginx/html/index.html
[root@node1 ~]# nginx ‐s reload
[root@node1 ~]# curl 192.168.0.140
hello

配置文档

主配置文件:/etc/nginx/nginx.conf
[root@www html]# cat /etc/nginx/nginx.conf | grep -Ev “^$|^#”
user nginx; #运行用户
workerprocesses auto; #工作进程数,通常情况,设置为CPU数+核数
error_log /var/log/nginx/error.log; #错误日志文件
pid /run/nginx.pid; #PID
include /usr/share/nginx/modules/.conf; # 加载动态模块 /usr/share/nginx/modules/.conf: nginx动态模块配置文件
#工作模式
events {
#use epoll; 事件驱动模型:epoll / select / poll/ kqeue ….
worker_connections 1024; #单个进程的连接数
}
#HTTP全局配置
http {
#日志格式
log_format main ‘$remote_addr - $remote_user [$time_local] “$request” ‘
‘$status $body_bytes_sent “$http_referer” ‘
‘“$http_user_agent” “$http_x_forwarded_for”‘;
#访问日志
access_log /var/log/nginx/access.log main;
sendfile on; #允许sendfile方式传输文件
tcp_nopush on; #在sendfile启动下,使用TCP_CORK套接字
tcp_nodelay on; #使连接保持活动状态
keepalive_timeout 65; #连接超时时间,默认75s
types_hash_max_size 2048; #设置类型哈希表的最大大小
include /etc/nginx/mime.types; #文件类型名和文件类型映射表
default_type application/octet-stream; #默认文件类型,默认为text/plain
# 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;
server_name
; #域名/服务名
root /usr/share/nginx/html; #根目录
# Load configuration files for the default server block.
include /etc/nginx/default.d/.conf; #加载默认配置文件
#根据请求URL设置配置
location / {
}
errorpage 404 /404.html; # 错误页
location = /40x.html {
}
error_page 500 502 503 504 /50x.html; # 错误页
location = /50x.html {
}
}
}

HTTPS相关配置块
# Settings for a TLS enabled server.
#
# server {
# listen 443 ssl http2 default_server;
# listen [::]:443 ssl http2 default_server;
# server_name
;
# root /usr/share/nginx/html;
#
# ssl_certificate “/etc/pki/nginx/server.crt”;
# ssl_certificate_key “/etc/pki/nginx/private/server.key”;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 10m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
#
# # 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 {
# }
# }

日志格式说明

$remote_addr:记录客户端IP地址
$remote_user:记录客户端用户名称
$time_local:记录访问时间和时区
$request:记录请求url和HTTP协议
$status:记录请求状态
$body_bytes_sent:记录发送给客户端文件主题内容的大小
$http_referer:记录从哪个页面链接访问
$http_referer: 记录从哪个页面链接访问
$http_user_agent:记录客户端浏览器的相关信息

location表达式

~:表达执行一个正则匹配,区分大小写
~:表达执行一个正则匹配,不区分大小写
^~:表示普通字符匹配,使用前缀匹配,如果匹配成功,则不再匹配其他location
=:表示普通字符精确匹配(完全匹配)
@:定义一个命名为location,使用在内部定向时,例如:error_pag , try_files

Example:
location = / {
[ configuration A ]
}
location / {
[ configuration B ]
}
location /documents/ {
[ configuration C ]

}
location ^~ /images/ {
[ configuration D ]
}
location ~
.(gif|jpg|jpeg)$ {
[ configuration E ]
}
优先级: =/ >> ^~ >> ~ >> ~* >> /常规字符串
匹配示例:
The “/” request will match configuration A,
the “/index.html” request will match configuration B,
the “/documents/document.html” request will match configuration C,
the “/images/1.gif” request will match configuration D
the “/documents/1.jpg” request will match configuration E.
192.168.10.10
192.168.10.10/index.html
192.168.10.10/documents/document.html
192.168.10.10/images/1.gif
192.168.10.10/documents/1.jpg

配置指令

正常运行相关配置

user #运行用户
pid #指定ngainx主进程存储位置
include #包含进来的其他配置片段
load_module #指明状态的动态模块

优化性能相关配置

worker_processes #工作进程数量
worker_cpu_affinity #CPU绑定
worker_priory #指明worker进程优先级
worker_rlimit_nofile #指明进程所能打开的文件数量上限值

用于调试及定位问题相关配置

daemon #是否以守护进程运行nginx
master_process #是否以master/worker模型运行nginx
error_log #错误日志

事件驱动相关配置

event{

use # 指明时间驱动模型 epoll poll select ….
worker_connections # 每个worker进程的最大并发连接数
accept_mutex #处理新的连接请求方法; 轮询|所有
}

套接字相关配置

server{ #配置一个虚拟主机
……
listen #设置监听端口
server_name #指定虚拟主机的主机名称
tcp_nodelay #在keepalive模式下的连接时是否启用TCP_NODELAY选项
tcp_nopush #在sendfile模式下,是否启用TCP_CORK选项
sendfile #是否启用sendfile功能
}

定义路径相关配置

root #设置web资源映射的根目录路径
location #可以存在多个
alias #定义别名
index #默认资源
try_file #判断指定目录是否存在

客户端请求相关配置

keepalive_timeout # 保持连接的超时时长
keepalive_requests # 一次连接允许请求资源的最大数量
keepalive_dsiable # 对某种浏览器禁用长连接
send_timeout # 向客户端发送响应报文的超时时长
client_body_buffer_size # 设置客户端请求报文的body部分的缓冲区大小
client_body_temp_path # 设定用于存储客户端请求报文的body部分的临时存储路径及子目录
结构和数量

客户端限制相关配置

limit_rate rate # 限制响应给客户端的传输速率
limit_except # 限制对指定的请求方法之外的其它方法的使用客户端

文件操作优化相关配置

aio # 是否启动aio功能
derectio # 在Linux主机启用O_DIRECT标记
文件缓存相关配置:
open_file_cache
open_file_cache_vaild time
open_file_cache_min_uses number
open_file_cache_errors

HTTP相关模块介绍

ngx_http_access_module模块:实现基于IP的访问控制功能
location / {
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
allow 2001:0db8::/32;
deny all;
}

ngx_http_auth_basic_module模块:实现基于用户的访问控制,使用basic机制进行用户认证
location / {
auth_basic “closed site”;
auth_basic_user_file conf/htpasswd;
}

ngx_http_stub_status_module模块:用于输出nginx的基本状态信息
location = /basic_status {
stub_status;
}
输出信息说明:
http://nginx.org/en/docs/http/ngx_http_stub_status_module.html

ngx_http_log_module模块:相关日志设置
log_format compression ‘$remote_addr - $remote_user [$time_local] ‘
‘“$request” $status $bytes_sent ‘
‘“$http_referer” “$http_user_agent” “$gzip_ratio”‘;
access_log /spool/logs/nginx-access.log compression buffer=32k;
配置说明:http://nginx.org/en/docs/http/ngx_http_log_module.html#access_log

ngx_http_gzip_module模块:是一个使用“gzip”方法压缩响应的过滤器
gzip on;
gzip_min_length 1000;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain application/xml;
配置说明:http://nginx.org/en/docs/http/ngx_http_gzip_module.html

ngx_http_ssl_module模块:定义https相关配置
官方示例:
worker_processes auto;
http {

server {
listen 443 ssl;
keepalive_timeout 70;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5; # 密码套件
ssl_certificate /usr/local/nginx/conf/cert.pem;
ssl_certificate_key /usr/local/nginx/conf/cert.key;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;

}

ngx_http_rewrite_module模块:将用户请求的URI基于regex所描述的模式进行检查,然后完成替换
示例及配置说明:http://nginx.org/en/docs/http/ngx_http_rewrite_module.html
ngx_http_refer_module模块:定义refer首部的合法可用值
示例:
valid_referers none blocked server_names
.example.com example. www.example.org/galleries/
~.google.;
if ($invalid_referer) {
return 403;
}
配置说明:http://nginx.org/en/docs/http/ngx_http_referer_module.html

课后了解:ssl协议

握手协议 | 密码变更协议 | 记录协议 | 报警协议
握手协议的过程
记录协议运行过程