Nginx服务器的强大之处
什么是Nginx
一款高性能的HTTP服务器软件
反向代理服务器软件
IMAP/POP3/SMTP代理服务器
可以运行在各类操作系统中(UNIX、GNU/Linux、BSD\Mac OS X、Solaris、Microsoft Windows)
为什么要选择Nginx
功能实现上都采用摸块化结构设计
支持通用的语言接口,PHP、Perl、Python等
支持正向代理、反向代理、虚拟主机、URL重写、压缩传输、SSL加密传输等
处理速度快、占用主机内存资源少
Nginx模块都是支持静态编译
Nginx支持epoll、Fcgi
Nginx安装包仅仅只有几百K
选择Nginx的优势
担任WEB服务器角色:
nginx处理静态文件、索引文件、自动索引的效率非常高。
担任代理服务器角色:
Nginx可以实现无缓存的反向代理加速、提高运行速度。
担任负载均衡服务器角色:
Nginx既可以在内部支持Rails和PHP,也可以支持HTTP代理服务器对外进行服务,同时还支持简单的容错和利用算法进行负载均衡
在性能方面,Nginx是专门为性能优化而开发,在实现上非常注重效率,它采用内核Poll模型,可以支持更多的并发连接,最大可以支持对50000个并发连接数的响应,而且只占用很低的内存资源
在稳定性方面,Nginx采取了分阶段资源分配技术,使得CPU与内存的占用率非常低
Nginx官方表示,Nginx保持10000个没有活动的连接,而这些连接只占用2.5MB内存,因此,类似DOS这样的攻击对Nginx来说基本上是没有任何作用
在高可用性方面,Nginx支持热部署,启动速度特别迅速,因此可以在不间断服务的情况下,对软甲按版本或者配置进行升级,即使运行数月也无需重新启动,几乎可以做到7X24小时不间断地运行。
Nginx的配置:个人选用编译安装方式
第一步:
确保系统已经安装gcc、gcc-c++、openssl-devel、pcre-devel、zlib-devel
我们可以使用光盘自带的安装包,进行yum安装、不过事先需要配置好系统yum源,以下我以前已经安装,所以有以下提示:
[root@frp ~]# yum -y install gcc
已加载插件:langpacks, product-id, search-disabled-repos, subscription-manager
This system is not registered with an entitlement server. You can use subscription-manager to register.
yum | 4.1 kB 00:00
软件包 gcc-4.8.5-16.el7.x86_64 已安装并且是最新版本
无须任何处理
[root@frp ~]# yum -y install gcc-c++
已加载插件:langpacks, product-id, search-disabled-repos, subscription-manager
This system is not registered with an entitlement server. You can use subscription-manager to register.
软件包 gcc-c+±4.8.5-16.el7.x86_64 已安装并且是最新版本
无须任何处理
[root@frp ~]# yum -y install openssl-devel
已加载插件:langpacks, product-id, search-disabled-repos, subscription-manager
This system is not registered with an entitlement server. You can use subscription-manager to register.
软件包 1:openssl-devel-1.0.2k-8.el7.x86_64 已安装并且是最新版本
无须任何处理
[root@frp ~]# yum -y install zlib-devel
已加载插件:langpacks, product-id, search-disabled-repos, subscription-manager
This system is not registered with an entitlement server. You can use subscription-manager to register.
软件包 zlib-devel-1.2.7-17.el7.x86_64 已安装并且是最新版本
无须任何处理
[root@frp ~]# yum -y install pcre-devel
已加载插件:langpacks, product-id, search-disabled-repos, subscription-manager
This system is not registered with an entitlement server. You can use subscription-manager to register.
软件包 pcre-devel-8.32-17.el7.x86_64 已安装并且是最新版本
无须任何处理
温馨提示:安装pcre-devel包目的是为了使Nginx支持HTTP Rewrite模块
第二步:
下载Nginx包:一定要确保系统已经连接网络、安装系统自带的wget下载器
或者:官网进行手动安装
官网地址:http://nginx.org/download/
根据业务需求下载版本:本次演示版本nginx-1.14.2.tar.gz
[root@frp ~]# yum -y install wget
已加载插件:langpacks, product-id, search-disabled-repos, subscription-manager
This system is not registered with an entitlement server. You can use subscription-manager to register.
软件包 wget-1.14-15.el7.x86_64 已安装并且是最新版本
无须任何处理
[root@frp ~]# wget http://nginx.org/download/nginx-1.14.2.tar.gz
第三步:
解压安装包:
tar -xf nginx-1.14.2.tar.gz
进入nginx主目录:
cd nginx-1.14.2
开始编译安装:
[root@frp nginx-1.14.2]# ./configure --prefix=/usr/local --with-http_stub_status_module
提示:–prefix= 表示编译安装到那个目录下面
–with-http_stub_status_module 安装的模块以监控Nginx的当前的状态
进行到这一步安装无报错基本配置已经完成了:
[root@frp nginx-1.14.2]# make && make install
调试Nginx
Nginx安装完毕,会产生响应的的安装目录,根据前面的安装路径,Nginx的配置文件路径为/usr/local/nginx/为nginx的主目录
主目录下conf目录中nginx.conf为Nginx的主配置文件
nginx.conf主配置文件中主要分为4个部分:
main (全局设置)
server (主机设置)
upstream (负载均衡服务器设置)
location (URL匹配特定位置的设置)
main部分设置的指令将影响其它所有设置
server部分的指令主要用于指定主机和端口
upstream指令主要用于负载均衡,设置一系列的后端服务器
location部分用于匹配网页位置
server 继承main
location 继承server
upstream 即不会继承其它设置也不会被继承
Nginx全局属性配置,代码展示:
user nobody nobody;
worker_processes 4;
error_log logs/error.log notice;
pid logs/nginx.pid;
worker_rlimit_nofile 65535;
events{
use epoll;
worker_connections 65536;
}
以上代码配置含义:
user是个主模块指令,指定Nginx Worker进程运行用户以及用户组,
默认nobody账号运行。
worker_processes是个主模块指令,指定了Nginx要开启的进程数。
每个Nginx进程平均耗费10MB~12MB内存。
根据经验,一般指定一个进程足够了,如果是多核CPU,建议指定和CPU的数量一样多的进程数即可。
error_log是个主模块指令,用来定义全局错误日志文件。
日志输出级别有debug、info、notice、warn、error、crit可供选择。
其中,debug输出日志最为详细,而crit输出日志最少。
pid是个主模块指令,用来指定进程id的存储文件位置。
worker_rlimit_nofile 用于绑定worker进程和CPU,Linux内核2.4以上可用。
events指令用来设定Nginx的工作模式及连接数上限。
use是个事件模块指令,用来指定Nginx的工作模式。
Nginx支持的工作模式有select、poll、kqueue、epoll、rtsig和/dev/poll。
其中select和poll 都是标准的工作模式,
kqueue和epoll是高效的工作模式,
不同的是epoll用在Linux平台上,
kqueue用在BSD系统中。
Linux系统中,epoll工作模式是首选。
worker_connections也是个事件模块指令,用于定义Nginx每个进程的最大连接数,
默认是1024.
最大客户端连接数由worker_processes和worker_connections决定,
即max_client=worker_processesworker_connections,
在作为反向代理时,变为
max_clients=worker_processesworker_connections/4.
进程的最大连接数受Linux系统进程的最大打开文件数限制,在执行操作系统命令:
ulimit -n 65536 后worker_connections的设置才能生效。
Nginx中HTTP服务器配置
Nginx相关配置代码如下:
http{
include conf/mime.type;
default_type application/octet-stream;
log_format main ' $remote_addr - $remote_user [$time_local] '
' "%request" $status $bytes_sent '
' "$http_referer" "$http_user_agent" '
' "$gzip_ratio" ';
log_format doload ' $remote_addr - $remote_user [$time_local] '
' "$request" $status $bytes_sent '
' "$http_referer"' "$http_user_agent" '
' "$http_range" "$sent_http_connent_range" ';
client_max_body_size 20m;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 60;
client_header_timeout 10;
client_body_timeout 10;
send_timeout 10;
}
以上代码解释:
include是个主模块指令,实现对配置文件所包含的文件设定,可减少著配置文件的复杂度。类似于Apache中的include方法。
default_type属于HTTP核心模块指令,这里设定默认类型为二进制流,也就是当文件类型未定义时使用这种方式,
例如,在没有配置PHP环境时,Nginx是不予解析的,此时,用浏览器访问PHP文件就会出现下载窗口。
client_max_body_size 用来设置允许客户端请求的最大的单个文件字节数。
client_header_buffer_size用于指定客户端 请求头的headerbuffer大小。
对于大多数请求,1KB的缓冲区大小已经足够,如果自定义消息头或有更大的cookies,可增加缓冲区大小,这里设置为32KB.
large_client_header_buffers用来指定客户端请求中较大的消息头的缓存最大数量和大小,"4"为个数,“128K”为大小,最大缓存为4个128KB.
sendfile参数用于开启高效文件传输模式,将tcp_nopush和tcp_nodely两个指令设置为on,用于防止网络阻塞。
keepalive_timeout用于设置客户端连接保持活动的超时时间 ,在超过这个时间之后,服务器会关闭该连接。
client_header_timeout用于设置客户端请求头读取超时时间,如果超过这个时间,客户端还没有发送任何数据,Nginx将返回 "Request time out (408)"错误 。
client_body_timeout用于设置客户端请求主体读取超时时间,默认值为60,如果超过这个时间,客户端还没有发送任何数据,Nginx将返回 “Request time out(408)”错误。
send_timeout用于指定响应客户端的超时时间。这个超时仅限于两个连接活动之间 的时间,如果超过这个时间,客户端没有任何活动,Nginx将会自动关闭连接。
下面的代码实现对日志格式的设定:
log_format main ' $remote_addr - $remote_user [$time_local] '
' "%request" $status $bytes_sent '
' "$http_referer" "$http_user_agent" '
' "$gzip_ratio" ';
log_format doload ' $remote_addr - $remote_user [$time_local] '
' "$request" $status $bytes_sent '
' "$http_referer"' "$http_user_agent" '
' "$http_range" "$sent_http_connent_range" ';
log_format是Nginx的HttpLog模块指令,用于指定nginx日志的输出格式。
main为此日志输出格式的名称,可以在下面的access_log指令中引用