您的位置:首页 > 运维架构 > Nginx

Nginx基础配置详解

2017-09-05 19:00 555 查看

Nginx的功能特性

基本Http服务,可以作为Http代理服务器和反向代理服务器,支持通过缓存加速访问,可以完成简单的负载均衡和容错,支持包过滤功能,支持SSL

高级Http服务,可以进行自定义配置,支持虚拟主机,支持URL重定向,支持网络监控,支持流媒体传输等

邮件代理服务器,支持IMAP/POP3代理服务功能,支持内部SMTP代理服务功能

基本HTPP服务

处理静态文件,如HTML网页以及请求

打开并自行管理文件描述符缓存

提供反向代理服务,并且可用缓存加速反向代理

提供远程
FastCGI(通用网关接口)
服务的缓存机制

模块化提供过滤器功能,
gzip压缩 ranges支持 chunked响应 XSLT SSI 图像缩放
针对包含多个SSI的页面,经由反向代理SSI过滤器可并行处理

支持安全套接协议SSL

高级HTTP服务

支持基于名字和IP的虚拟主机设置

支持HTTP/1.0 中的keep-alive模式和管线模型(PipelLined)连接

支持重新升级时,无需中断正在处理的请求

自定义访问日志格式、带缓存的日志写操作以及快速日志轮转

提供3xx 5xx错误代码重定向功能

支持重写模块扩展

支持HTTP DAV模块,从而为HTTP DAV模块提供
PUT DELETE MKCOL COPY MOVE
方法

支持
FLV
流和
MP4
流传输

支持网络监控,访问控制、速度限制或请求限制等

支持嵌入
perl
语言

邮件代理服务

支持使用外部HTTP认证服务器重定向用户到IMAP/POP3后端,并支持
IMAP
认证方式和
POP3
认证方式

支持使用外部HTTP认证服务器器认证用户后重定向连接到内部SMTP后端,并支持SMTP认证方式

支持邮件代理服务下的安全套接层安全协议SSL

支持纯文本通信协议的扩展协议
STARTTLS


常用功能

HTTP代理和反向代理

请求稳定,后端转发与业务配合分离,配置灵活,支持判断表达式

负载均衡

1. 将单一的重负载分担到多个网络节点上做并行处理,每个节点处理结束后将结果汇总给用户
提高网络系统的处理能力


2. 将大量的前端并发访问或者数据流量分担到多个后端网络节点上分别处理

- nginx的负载均衡策略

-
内置策略
:
轮询
加权轮询
IP HASH


-
扩展策略
主要通过第三方模块实现,常见有
url hash


WEB缓存

主要由
Proxy_Cache
(提供代理服务时,对后端服务器返回内容进行URL缓存) 和
FastCGI_Cache
(对FastCGI程序缓存)指令集构成

安装部署

编译

下载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}


信号作用
TERM 或 INT快速停止服务
QUIT平缓停止服务
HUP平滑重启
USR1重新打开日志文件
USR2平滑升级
WINTH平缓停止Worker Process
- 常用命令

#检查配置文件是否有错误
./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

#必须
4000
包含文件名称
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同事开启的最大连接数。此值不能大于操作系统支持的打开的最大文件句柄数.

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_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$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] [ssl];


配置Unix Domain Socket
很少用


listen unix:path [default_server] [setfib=number] [backlog=number] [rcvbuf=size]
[sendbuf=size] [accept_filter=filter] [deferred] [bind] [ssl];


平常使用:

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)

- rcvbuf 设置监听socket接受缓存区大小

- sendbuf 设置监听socket发送缓存区大小

- deferred 标识符,将
accept()
设置为Deferred模式

- bind 标识符,使用独立的
bind()
处理此adress:port,一般情况下端口相同而IP地址不同,只使用一个

- ssl 标识符,设置会话使用ssl模式(https)

- accept_filter 设置监听端口的请求过滤,被过滤的内容不能被接受和处理(只在FreeBSD NetBSD中有用)

- setfib 为监听socket关联路由表,只对
FreeBSD
起作用

基于名称的虚机主机设置

可以配置多个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
;

一个名称若被多次匹配的访问优先级


- 匹配方式不同时

1. 精确匹配

2. 通配符在开始

3. 通配符在结尾

4. 正则表达式匹配

- 相同匹配方式时,首次处理优先(顺序)

基于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预设的大多变量,唯
$document_root $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;[/code] 
如果希望错误路径指向自定的位置:

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;
}

}
}


参考资料
《nginx高性能web服务器讲解》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  nginx