序言
Nginx功能丰富,可作为HTTP服务器,也可作为反向代理服务器,邮件服务器。支持FastCGI、SSL、Virtual Host、URL Rewrite、Gzip等功能。并且支持很多第三方的模块扩展。
Nginx常用功能
1、Http代理,反向代理:作为web服务器最常用的功能之一,尤其是反向代理。
这里我给来2张图,对正向代理与反响代理做个诠释
Nginx在做反向代理时,提供性能稳定,并且能够提供配置灵活的转发功能。Nginx可以根据不同的正则匹配,采取不同的转发策略,比如图片文件结尾的走文件服务器,动态页面走web服务器,只要你正则写的没问题,又有相对应的服务器解决方案,你就可以随心所欲的玩。并且Nginx对返回结果进行错误页跳转,异常判断等。如果被分发的服务器存在异常,他可以将请求重新转发给另外一台服务器,然后自动去除异常服务器。
2、负载均衡
Nginx提供的负载均衡策略有2种:内置策略和扩展策略。
- 内置策略:轮询 加权轮询 IP HASH
- 扩展策略 主要通过第三方模块实现,常见有url hash
上3个图,理解这三种负载均衡算法的实现
Ip hash算法,对客户端请求的ip进行hash操作,然后根据hash结果将同一个客户端ip的请求分发给同一台服务器进行处理,可以解决session不共享的问题。
3、web缓存
Nginx可以对不同的文件做不同的缓存处理,配置灵活。
主要由Proxy_Cache(提供代理服务时,对后端服务器返回内容进行URL缓存) 和FastCGI_Cache(对FastCGI程序缓存)指令集构成。
配合着第三方的ngx_cache_purge模块,对指定的URL缓存内容进行增删管理。
4、Nginx相关地址
源码:https://trac.nginx.org/nginx/browser
官网:http://www.nginx.org/
Nginx配置文件结构
如果你下载好了你的安装文件,不妨打开conf文件夹的nginx.conf文件,Nginx服务器的基础配置,默认的配置也存放在此。
安装部署
编译
下载nginx-1.12.1.tar.gz
解压后进入nginx-1.12.1目录执行
./configure --prefix=/usr/local/nginx-1.12
需要安装gcc等编译工具
yum -y install gcc openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel
执行make编译,等待编译结束后执行make install安装至指定目录
进入/usr/local/nginx-1.12,可以看到具有4个目录:
conf 存放了所有配置文件
html 运行中的html文件
logs 日志目录
sbin 服务主程序
启停
nginx服务在运行时会保持一个主进程和一个或者多个worker process工作进程,通过给主进程发送信号控制服务的启停。
- nginx可接受的信号 kill -USR1 ${nginx.pid}
常用命令
#检查配置文件是否有错误
./nginx -t
#指定配置文件
./nginx -c conf_file
#优雅停止
./nginx -s stop
配置
主要描述nginx.conf文件的内容
nginx.conf文件结构
主要由三块组成 全局块 events块 http块,http块中包含http全局块和多个server块,每个server块中包含server全局块和多个location块,采用就近原则生效
全局块
配置一些影响整体运行的指令,通常有服务器用户组 允许生成的worker process nginx.pid存放路径 日志存放路径 类型 配置文件引入
events块
影响nginx服务器与用户的网络连接,这一块的设置对服务的性能影响较大。通常有是否开启对WP下的网络进行序列化 是否允许同时接受多个网络连接 事件驱动模型 每个WP可以同时支持处理的最大连接数
http块
重要组成部分,代理、缓存和日志定义、第三方模块的配置。 通常配置文件引入 MIME-TYPE定义 日志自定义 是否使用sendfile传输文件 连接超时时间 单连接请求数上限
具体配置
由于nginx的配置大部分是不限定具体位置的(可以在多个地方配置),所以此处将依次进行列举
配置用户组
配置alleyz用户 admin组下有启停权限
user alleyz [admin];
所有用户具有启停权限
user nobody nobody;
配置运行生成的worker process
如果设置为数字,启动以后就具有多少个worker process
设置为auto则自动检测
worker_processes number | auto;
配置pid文件存放路径
默认存放在logs/nginx.pid
必须包含文件名称
pid logs/nginx_alleyz.pid;
配置错误日志文件的存放路径
可在全局块、http块 server块 location块配置
error_log file | stderr [ DEBUG | info | notice | warn | error | crit | alert | emerg];
配置文件引入 任意地方
include file;
设置网络连接的序列化
惊群问题:当某刻只有一个请求进来时,会唤醒多个睡眠的进程,但只会分配到一个进程中请求,造成性能的损耗。
accept_mutex on | off;
设置是否允许同时接受多个连接 events
multi_accept on | off; #默认关闭
事件驱动模型的选择 events
可选择的内容有:select poll kqueue epoll rtsig /dev/poll eventport
use epoll;
配置最大连接数 events
允许每一个WP同时开启的最大连接数。此值不能大于操作系统支持的打开的最大文件句柄数. ulimit -c
worker_connections number; #默认值 512
MIME-Type http server location
default_type mime-type; #默认为 text/plain
自定义服务日志
access_log 可在http server location中配置; log_format只能在http中配置。
注意 前文提到的error_log 配置的是nginx的运行日志,此处指的是应答前端请求的服务日志。可以对日志的格式、大小、输出进行配置,有access_log log_format指令, log_format 的string整体需要用'括起来,变量名称使用双引号括起来
log_format name string;
access_log path [format [buffer=size]];
log_format main 'remote_user [request" '
'body_bytes_sent "http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
如果取消日志记录
access_log off;
配置sendfile方式传输文件
相关指令 sendfile sendfile_max_chunk,默认开启
sendfile on | off;
sendfile_max_chunk size; #设置为0为无限制
配置连接超时时间
http块 server块 location块,设置用户会话连接的保持时间
keepalive_timeout timeout[header_timeout];
单连接请求上限
server location 用户与服务端建立连接后,通过此连接发送的请求次数
keepalive_requests number;
配置网络监听
配置监听IP地址
listen address[:port] [default_server] [setfib=number] [backlog=number]
[rcvbuf=size] [sendbuf=size] [deferred] [accept_filter=filter] [bind] [ssl];
配置监听端口
listen port [default_server] [setfib=number] [backlog=number] [rcvbuf=size]
[sendbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on | off]
平常使用:
listen 3021;
listen 10.8.177.21;
listen 10.8.177.21:3022 default_server backlog==1024;
参数说明:
- address ip地址,如果是ipv6需要使用[fe13:..]格式
- port 端口号,如果只有ip则默认80
- path socket文件路径
- default_server, 标识符,将ip:port设置为默认的虚拟主机
- backlog 设置监听函数listen()最多允许多少网络连接同时处于挂起的状态,默认511(FreeBSD 为-1)
基于名称的虚机主机设置
可以配置多个name
server_name name name1 name2 ....;
可以使用通配符* 只能位于三段字符串组成的首尾或者两段字符串的尾部
server_name .alleyz.com www.alleyz.
使用正则表达式,~作为正则开始的标记,并且正则支持捕获
server_name ~([a-zA-Z\d]{1,4}).alleyz.com$;
此时,如果通过xisuo.alleyz.com访问的话,可使用$1捕获xisuo;
一个名称若被多次匹配的访问优先级:
- 匹配方式不同时
- 精确匹配
- 通配符在开始
- 通配符在结尾
- 正则表达式匹配
- 相同匹配方式时,首次处理优先(顺序)
基于IP的虚拟主机设置
需设置网卡能监听多个IP地址
临时生效
ifconfig em1:0 10.8.177.21 netmask 255.255.0.0 up
ifconfig em1:1 10.8.177.22 netmask 255.255.0.0 up
永久生效
echo "ifconfig em1:0 10.8.177.21 netmask 255.255.0.0 up" >> /etc/rs.local
vi nginx.conf
server {
listen 3022;
server_name 10.8.177.32;
...
}
server {
listen 3022;
server_name 10.8.177.21;
...
}
kill -HUP `cat ../logs/nginx_alleyz.pid`
配置location块
location [ = | ~ | ~* | ^~] uri {...}
=用于普通uri之前,表示严格匹配
~ uri包含正则表达式,并且区分大小写
~* 表示包含正则表达式,并且不区分大小写
^~ 如果找到与uri匹配度最高的location,立即处理请求。 会对uri进行反编码
配置请求的根目录 http server location
服务器收到请求后查找资源的根目录路径,可以使用nginx预设的大多变量,唯realpath_root不能使用;通常在location块中使用。
root path;
更改location的URI
除了使用root指定根目录,还可以使用alias指令改变location接收到的请求路径
alias path;
location ~ ^/data/(.+\.(htm|html))${
alias html/data/other/$1;
}
设置网站的默认首页
可以针对不同的访问设置不同的首页
index index.html index.htm;
设置网站的错误页面 http server location
如果uri是path的话,则path是以nginx的安装目录为根路径的;
error_page code ... [=[response]] uri;
error_page 404 /404.html;
error_page 404 http://someone.com/404.html;
如果希望错误路径指向自定的位置:
error_page 404 /404.html
location /404.html{
root /home/alleyz/html;
}
基于IP配置访问权限 http server location
allow address | CIDR | all;
deny address | CIDR | all;
location / {
root html;
index index.html;
deny 10.8.177.26;
}
基于密码配置访问权限
基于HTTP Basic Authentication 协议认证;文件中密码得加密!
# 生成密文,-c创建密码文件 -d采用crypt加密 -b 命令行指定密码
htpasswd -cdb passwd alleyz 123456
# string 开启认证功能,并设置提示信息
auth_basic string | off;
#file 包含用户名信息的文件路径
auth_basic_user_file file;
我自己的测试配置
user alleyz;
worker_processes 2;
pid logs/nginx_alleyz.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main1 '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main1;
sendfile on;
keepalive_timeout 65;
server {
listen 3022;
server_name 10.8.177.32;
deny 10.8.177.26;
location / {
auth_basic "it`s auth test msg!";
auth_basic_user_file passwd;
root html/22;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 3022;
server_name 10.8.177.21;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}