Nginx,高性能HTTP服务器,介绍、快速部署及配置说明

Nginx的介绍

Nginx (engine x) :高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务,是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0,发布于2004年10月4日;源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名;2011年6月1日,nginx1.0.4发布。

Nginx支持:FastCGI、SSL、Virtual Host、URL Rewrite、Gzip等功能。

注:FastCGI是Web服务器和处理程序之间通信的一种协议,是CGI的一种改进,FastCGI类似一个常驻性的CGI,它可以一直执行,在请求到达时不会花费时间去fork一个进程进来处理。FastCGI是与语言无关的、可伸缩架构的CGI开发扩展,将CGI解释器进程保持在内存当中,可以获得较高的性能。

Nginx的版本

1、Mainline—主线版本

2、Stable—稳定版本,推荐使用

3、Legacy—历史版本(旧版本)

Nginx的安装(CentOS Linux安装)

1、gcc安装

安装nginx需要先将官网下载的源码进行编译,编译依赖 gcc 环境,如果没有gcc环境,则需要安装:

# yum install gcc-c++

2、PCRE pcre-devel 安装

PCRE(Perl Compatible Regular Expressions)是一个Perl库,包括perl兼容的正则表达式库。nginx的http模块使用pcre来解析正则表达式,所以需要在linux上安装pcre库,pcre-devel是使用pcre开发的一个二次开发库。

# yum install -y pcre pcre-devel

3、zlib安装

zlib库提供了很多种压缩和解压缩的方式, nginx使用zlib对http包的内容进行gzip。

# yum install -y zlib zlib-devel

4、OpenSSL 安装

OpenSSL是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。

nginx不仅支持http协议,还支持https(即在ssl协议上传输http)。

# yum install -y openssl openssl-devel

5、下载Nginx且安装

# wget

# tar zxvf nginx-1.18.0.tar.gz

# ./configure --with-http_stub_status_module --prefix=/usr/local/nginx

# cd nginx-1.18.0

# make && make install

Nginx的操作命令

检查配置: nginx -t

启动运行: nginx

重新加载配置启动(reloading the configuration file): nginx -s reload

重新打开日志文件(reopening the log files): nginx -s reopen

停止运行(fast shutdown): nginx -s stop

停止运行(graceful shutdown): nginx -s quit

Windows下杀死所有nginx进程: taskkill /fi "imagename eq nginx.exe" /f

配置样例(已经过测试)

#主模块指令,进程运行用户、用户组,默认由nobody账号运行 #user nobody; #主模块指令,指定开启的进程数,每个进程平均耗费10M~12M内存,建议指定和CPU的数量一致 worker_processes 4; #指定进程可以打开的最大描述符数目 worker_rlimit_nofile ; #主模块指令,全局错误日志文件,日志输出级别有:debug、info、notice、warn、error、crit #error_log logs/error.log error_log logs/error.log info; #主模块指令,指定进程pid的存储文件位置 pid logs/nginx.pid; #事件指令,设定Nginx的工作模式及连接数上限 events { #标准事件模型,linux建议epoll,FreeBSD建议采用kqueue,window下不指定 #use epoll; #工作进程的最大连接数量 #理论上nginx服务器的最大连接数为:worker_processes*worker_connections worker_connections1024; } # http { #配置文件所包含的文件的设定 include mime.types; #HTTP核心模块指令,设定默认类型为二进制流,当文件类型未定义时使用这种方式; default_type application/octet-stream; #HttpLog模块指令,用于指定Nginx日志的输出格式,main为此日志输出格式的名称; log_format #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。 sendfile on; #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。 sendfile_max_chunk 100k; #客户端连接保持活动的超时时间,在超过这个时间之后,服务器会关闭该连接; keepalive_timeout 1000; #客户端请求头读取超时时间,在超过这个时间,客户端还没有发送任何数据,Nginx将返回“Request time out(408)”错误; client_header_timeout 1000; #客户端请求主体读取超时时间,在超过这个时间,客户端还没有发送任何数据,Nginx将返回“Request time out(408)”错误,默认值是60; client_body_timeout 1000; #响应客户端的超时时间,超时仅限于两个连接活动之间的时间,如果超过这个时间,客户端没有任何活动,Nginx将会关闭连接; send_timeout 1000; #Gzip Settings gzip on; gzip_min_length 1; gzip_comp_level 2; gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png; #日志格式,main为此日志输出格式的名称 log_format main $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $http_x_forwarded_for "$upstream_addr" "$upstream_status" "$upstream_response_time" "$request_time"; #upstream模块 upstream upstream_name{ server 127.0.0.1:8001; server 127.0.0.1:8002; server 127.0.0.1:8003; } # server { #监听端口 listen 80; #基于名称的虚拟主机 server_name localhost; #日志 access_log logs/host.access.log main; # / location / { #可以是相对路径,也可以是绝对路径 #root D:/Apps/Nginx/nginx-1.18.0/html; root html; index index.html index.htm; } #访问报错500 502 503 504跳转到/50x.html error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } #请求以/image/开头 location /image { root D:/Apps/Images/; } #请求以/qa/开头 location ^~/qa/ { proxy_pass ; } #对以"json或xml"结尾的地址进行负载均衡 location ~*\.(json|xml)$ { proxy_pass http://upstream_name/agent/$request_uri; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } }

测试地址列表:

1、访问,首页:http://localhost/

2、访问,图片:http://localhost/image/nginx.png

3、访问,/qa/:http://localhost/qa/java.html

4、访问,后缀:、

基于名称的虚拟主机(server_name)

指令server_name,主要用于配置基于名称的虚拟主机,server_name指令在接到请求后的匹配顺序分别为:

1、准确的server_name匹配 server { listen 80; server_namedomain.comwww.domain.com; ... } 2、以*通配符开始的字符串: server { listen 80; server_name*.domain.com; ... } 3、以*通配符结束的字符串: server { listen 80; server_namewww.*; ... } 4、匹配正则表达式: server { listen 80; server_name~^(?.+)\.domain\.com$; ... }

访问路径location配置

location表达式类型:

1、~,表示执行一个正则匹配,区分大小写;

2、~*,表示执行一个正则匹配,不区分大小写;

3、^~,表示普通字符匹配,使用前缀匹配,如果匹配成功,则不再匹配其他location;

4、=,进行普通字符精确匹配。也就是完全匹配;

5、@,定义一个命名的location,使用在内部定向时,例如:error_page, try_files;

例如:

location = / ,仅仅匹配请求 /;

location / ,匹配所有以 / 开头的请求;

location /documents/,匹配所有以 /documents/ 开头的请求;

location ^~/images/,匹配所有以 /images/ 开头的表达式;

location ~*\.(gif|jpg|jpeg)$,匹配所有以gif jpg jpeg结尾的请求;

语法规则: location [=|~|~*|^~]/uri/ { … }

其中location匹配的指是path部分的值,不包括主机名(域名、端口号等)、查询字符串(第一个问号后面的)等其他部分;

1、=开头,表示精确匹配;

2、^~开头,表示uri以某个常规字符串开头(不使用正则匹配),理解为匹配url路径即可。

注:nginx不对url做编码,因此请求为/static/20%/xfd,可以被规则^~ /static/ /xfd匹配到(是空格)。

3、~开头,表示区分大小写的正则匹配,后跟着正则表达式;

4、~*开头,表示不区分大小写的正则匹配,后跟着正则表达式;

配置示例:

1、表示访问:http://127.0.0.1:8000/dsad_1231/publish/dsdsd/dsad.html时,再去访问本地8000端口上的server/publish/dsdsd/dsad.html的地址; location ~^(/([0-9a-zA-Z\_])*)/publish/(.*) { proxy_pass http://127.0.0.1:8000/server/publish/$3; } 2、表示访问:http://127.0.0.1/12eee_345/test/HQ.png时,去访问d盘的目录下“(.*)”这个目录的下的文件; location ~^(/([0-9a-zA-Z\_])*)/(.*){ alias D://$3; } 3、表示访问:http://127.0.0.1/12eee_345/test/HQ.png时,去访问d盘的目录下“/test/HQ.png”这个目录再加上“12eee_345/test/HQ.png”这个目录的下的文件; location ~^(/([0-9a-zA-Z\_])*)/{ root D://$3; }

Nginx的日志

日志级别:

error_log日志级别:debug(调试), info(信息), notice(通知), warn(警告), error(错误), crit(暴击),默认为crit;

日志格式:

log_format mylogformat $http_x_forwarded_for_$remote_user [$time_local]

‘"$request"$status $body_bytes_sent’

‘"$http_referer" "$http_user_agent"’

在日志格式样式中,变量$remote_addr和$http_x_forwarded_for用于记录IP地址;

$remote_user用于记录远程客户端用户名称;

$time_local用于记录访问时间与时区;

$request用于记录请求URL与HTTP协议;

$status用于记录请求状态,例如成功时状态为200,页面找不到时状态为404;

$body_bytes_sent用于记录发送客户端的文件主体内容大小;

$http_referer用于记录是从哪个页面链接访问过来的;

$http_user_agent用于记录客户浏览器的相关信息。

参数 说明示例 $remote_addr 客户端地址211.28.65.253 $remote_user客户端用户名称-- $time_local访问时间和时区18/Jul/2012:17:00:01 +0800 $request 请求的URI和HTTP协议 "GET /article-10000.html HTTP/1.1" $http_host请求地址,即浏览器中你输入的地址(IP或域名) www.wang.com 192.168.100.100 $statusHTTP请求状态200 $upstream_status upstream状态 200 $body_bytes_sent 发送给客户端文件内容大小 1547 $http_referer url跳转来源 $http_user_agent 用户终端浏览器等信息 "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; SV1; GTB7.0; .NET4.0C; $ssl_protocolSSL协议版本 TLSv1 $ssl_cipher交换数据中的算法 RC4-SHA $upstream_addr 后台upstream的地址,即真正提供服务的主机地址 10.10.10.100:80 $request_time整个请求的总时间 0.205 $upstream_response_time请求过程中,upstream响应时间0.002