Nginx是一款<strong>轻量级高性能的http和反向代理服务器</strong>,并且还是一个<strong>邮件代理服务器</strong>。
Nginx与apache的区别
1.Nginx默认是<strong>异步单进程非阻塞工作模式</strong>,一个进程连接多个线程,一个线程对应一个请求连接,采用<strong>epoll(事件驱动)IO模型</strong>,占用资源少,高性能高并发,最大可支持50000个并发连接。;apache是<strong>同步多进程阻塞型工作模式</strong>,采用<strong>select标准IO模型</strong>,一个进程对应一个请求连接,处理并发请求效果较差。
2.Nginx具有<strong>内置的健康检查模块</strong>,可以通过加载内置模块<strong>对后端服务器进行健康检查</strong>,达到<strong>负载均衡</strong>的效果。
3.Nginx<strong>静态页面处理效果比apache强</strong>,但其动态页面处理不如apache,原因是<strong>nginx与php的连接比较简单,可以使用fastcgi软件改善</strong>。
4.Nginx具有高可用性,支持<strong>热部署</strong>,启动速度迅速,可以在不间断服务的状态下,对软件版本进行升级。
5.Nginx所有模块都<strong>支持静态编译</strong>,而<strong>apache所有模块支持动静态编译</strong>。
6.Apache的<strong>rewrite模块功能较nginx强大</strong>。
7.Nginx的<strong>配置比较简单,代码简洁</strong>;apache配置比较复杂,模块的配置文件比较分散。
Nginx模块
Nginx由<strong>内核和模块</strong>组成。
内核的功能主要是通过查找配置文件将客户请求映射到一个location模块上(location是nginx的一个模块,用于URL匹配),根据location模块中配置的指令去启动不同的模块完成请求响应。
模块:
结构上:核心模块(http模块(处理请求时调用响应的模块指令处理);Main模块(定义全局设置);event模块(定义IO工作模式和服务器可连接的最大连接数));
基础模块(http access模块(http访问控制模块);http fastcgi模块(允许nginx同FastCGI协同工作,并且控制参数被安全传递);http proxy模块(代理模块,用于转发请求));
第三方模块(http upstream request hash模块(设置负载均衡);Notice模块(指定日志输出级别);http access key模块(用于限制某些客户端的访问))。
功能上:handlers模块:直接处理请求,并对输出内容进行修改,一般只有一个。
Filters模块:主要对其他处理器模块输出内容进行修改,最后由nginx输出。
Proxies模块:主要与后端服务器进行交互,实现代理和负载均 衡功能。
Nginx工作原理:
请求过程:客户端——》nginx内核(选择处理器模块)——》handlers模块(生成处理结果)——》filters模块(处理修改处理结果)——》nginx响应请求——》客户端。
数据包流向:
客户端(请求数据包)——》nginx服务器——》七层,逐层传递数据包——》处理器——》七层,逐层传递——》nginx服务器——》客户端
Nginx安装
软件:nginx-1.8.0.tar.gz
依赖性软件:gcc gcc-c++(设置编译环境) zlib-devel pcre-devel(支持nginx的http rewrite功能) openssl-devel(支持http ssl模块)
解压,编译,安装:
# tar zxf nginx-1.8.0.tar.gz
# /root/nginx-1.8.0/configure
--prefix=/usr/local/nginx ##nginx安装目录
--with-http_stub_status_module ##监控nginx状态模块
--with-http_ssl_module ##加密认证模块
## make && make install
设置nginx启动命令
# ln -s /usr/local/nginx/sbin/nginx /usr/sbin/nginx
开启ngixn服务:
# nginx
查看默认开启端口:
# netstat -anutpl
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 3410/nginx
查看nginx目录大小:
# du -sh /usr/local/nginx
5.3M /usr/local/nginx
查看本地站点信息
# curl -I localhost
HTTP/1.1 200 OK ##http请求返回状态及http版本
Server: nginx ##nginx版本信息(已经隐藏版本)
Date: Sat, 16 Apr 2016 11:07:09 GMT ##(请求时间)
Content-Type: text/html ##文本格式为text/html
Content-Length: 612 ##文本长度
Last-Modified: Fri, 15 Apr 2016 09:08:03 GMT ##nginx安装时间
Connection: keep-alive ##连接状态
ETag: "5710af73-264"
Accept-Ranges: bytes
检测:
浏览器“172.25.48.10”,结果显示nginx的主页面,表明访问成功。
Nginx编译优化(在编译过程前或者编译过程中进行)
1.站点信息优化
# curl -I localhost
Server: nginx/1.8.0
# vim /root/nginx-1.8.0/src/core/nginx.h
#define NGINX_VER "nginx" ##删除版本信息
检测:
# curl -I localhost
Server: nginx ##隐藏Nginx版本信息
2.目录编译优化
原理:在编译nginx时,默认以debug模式(输出级别)进行,而在debug模式下,会插入很多跟踪和ASSERT之类的信息,在编译前取消nginx
的debug模式,会极大减少nginx的占用资源。
# du -sh /usr/local/nginx
5.3M /usr/local/nginx
# vim /root/nginx-1.8.0/auto/cc/gcc
#debug ##注释debug,可缩小nginx目录所占内存
#CFLAGS="$CFLAGS -g"
# du -sh /usr/local/nginx
848k /usr/local/nginx
3.cpu编译类型优化
原理:编译nginx时,默认的GCC参数时“-O”。
查看cpu类型
# cat /proc/cpuinfo | grep "model name"
model name : QEMU Virtual CPU version 1.5.3
本机cpu为QEMU内型。
编译时加上以下参数:
--with-cc-opt=’-O3’
--with-cpu-opt=CPU
Nginx配置案例
1.设置nginx用户
# groupadd -g 48 nginx
# useradd -u 48 -g 48 -s /sbin/nologin -d /usr/local/lnmp/nginx -M nginx
# id nginx ##查看nginx用户信息
uid=48(nginx) gid=48(nginx) groups=48(nginx)
# vim /usr/local/lnmp/nginx/conf/nginx.conf
user nginx ## 指定nginx用户
Worker_processes 1|2 ##1|2为系统cpu数
events { ##event模块,指定IO的工作模式
use epoll; ##事件模型
worker_connections 1024;
}
# nginx -t ##检测配置是否正确
# nginx -s reload ##重新加载nginx
2.添加https认证
# cd /etc/pki/tls/certs/
# make nginx.pem ##生成ssl证书
Country Name (2 letter code) [XX]:CN ##国家
State or Province Name (full name) []:Shaanxi ##省份
Locality Name (eg, city) [Default City]:xi‘an ##城市
Organization Name (eg, company) [Default Company Ltd]:westos ##组织
Organizational Unit Name (eg, section) []:linux ##单位
Common Name (eg, your name or your server‘s hostname) []:vm4.example.com ##主机
Email Address []:[email protected] ##管理员邮箱
# mv nginx.pem /usr/local/lnmp/nginx/conf/ ##将证书移至nginx的配置目录下
# cd /usr/local/lnmp/nginx/conf/
# vim nginx.conf
http {
server {
listen 443 ssl; ##默认开启端口为443
server_name localhost; ##服务器名称
ssl_certificate nginx.pem; ## 认证文件
ssl_certificate_key nginx.pem; ##认证密钥文件
ssl_session_cache shared:SSL:1m; ##session保持时长
ssl_session_timeout 5m; ##session超时时长
ssl_ciphers HI504 Gateway TimeoutGH:!aNULL:!MD5; ##加密方式
ssl_prefer_server_ciphers on;
location / { ##URL模块
root html; ##默认发布目录
index index.html index.htm; ##默认人发布主页格式
}
}
}
# nginx -t
# nginx -s reload
打开浏览器,输入"https://172.25.48.10",j进入,会显示没有认证,认证完后,显示nginx主页则表明访问成功。
3.添加虚拟主机
首先要将虚拟主机在物理主机上解析。
# vim /etc/hosts
172.25.48.10 www.haha.com www.heihei.com www.linux.com
进入服务主机,设置nginx虚拟主机。
# vim /usr/local/lnmp/nginx/conf/nginx.conf
http {
server {
listen 80; ##默认端口为80;
server_name www.haha.com; ##指定主机域名
location / {
root /www; ##定义网站的发布目录
index index.html;
}
}
}
# nginx -t ##检测nginx语法
# nginx -s reload
建立虚拟主机默认发布目录,并设置发布主页
# mkdir /www
# cd /www
# vim index.html
vm10.example.com
打开浏览器,输入www.haha.com查看,结果显示:
vm10.example.com
表示设置正确,访问成功。
4.Nginx做负载均衡
# vim /usr/local/lnmp/nginx/conf/nginx.conf
http {
upstream westos { ##upstream负载均衡函数,默认为轮循模式
server 172.25.48.4:80;
server 172.25.48.7:80;
}
server {
listen 80; ##监听80端口
server_name www.heihei.com; ##指定网站
location / {
proxy_pass http://westos; ##反向代理到负载均衡器westos上。
}
}
}
# nginx -t
# nginx -s reload
结果验证
打开虚拟机172.25.48.10(desktop.example.com)和主机172.25.254.48 (www.zhuji.com)做负载均衡器,并且都下载http服务,并且分别在两个主机的Apache默认发布目录编写index.html主页。
# yum install httpd -y
# /etc/init.d/httpd start
# cd /var/www/html
# vim index.html
desktop.example.com ##172.25.48.7主机
www.zhuji.com ##172.25.48.4主机
打开浏览器,输入“www.qq.com”,不停按f5查看结果。结果会不停在desktop.example.com和www.zhuji.com之间重复出现,表明负载均
衡成功。
5.Nginx的负载均衡模块支持四种调度算法:
1.轮循(Nginx默认),每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器中某台服务器挂掉,系统会自动剔除故障服务器,是用户访问不受影响。
2.weight轮询权值,weight权值越大,分配到的访问机率越高,主要用于后端服务器性能不均的情况下。
3.ip_hash,每个请求按照访问ip的hash算法结果分配,可以实现来自东一个ip的客户端请求固定到同一台后端服务器,可以解决动态网页存在的session共享问题,。
4.第三方调度算法
(1).fair,较智能,可以根据页面大小和加载时间长短进行负载均衡,即根据后端服务器的响应时间来分配请求,响应时间段的服务器优先分配。<strong>nginx本身不支持fair算法,需要下载nginx的upstream_fair模块即可</strong>。
(2).url_hash,按照访问的url的hash结果分配请求,使每个url定向到后端同一个服务器,可以进一步提高后端缓存服务器的效率。需要安 装nginx的hash软件包。
6.Nginx的server模块支持设定后端服务器的状态。
1.down,表示当前的server不参与负载均衡,但服务器状态正常,只是不会被分配到任何请求。
2.backup,与刘的备份机器,当其他所有的非backup服务器出现故障或者忙的时候,backup服务器才会处理请求。
3.max_fails,允许请求失败的次数,默认为1,当超过最大次数时,返回proxy_next_upstream模块定义的错误。
4.fail_timeout,在经历了max_fails次失败后,暂停服务的时间。mail_fials和max_timeout可以结合使用。
7.Nginx的status状态监控模块
stubstatus模块能够获取nginx自上次启动以来的工作状态,非核心模块,需要在编译过程中编译此模块。“--with-http_stub_status_module”.
功能:可以检测某一时间段内服务器被访问的次数,以此来判断服务器的并发量。
# vim /usr/local/lnmp/nginx/conf/nginx.conf
http {
server{
listen 80;
server_name 172.25.48.10;
location /status {
stub_status on; ##激活状态
access_log off; ##日志接收关闭
}
}
}
# nginx -t
# nginx -s reload
打开浏览器,输入“172.25.48.9/status”,查看结果显示,并且用f5刷新,每刷新一次,访问值增加1.结果显示:
Active connections: 1
server accepts handled requests
10 10 126
Reading: 0 Writing: 1 Waiting: 0
8.Nginx重写模块
功能:在同一个公司内,会存在不同的公司主页网址。客户可以通过相同的网址访问不同的主页。
# vim /usr/local/lnmp/nginx/conf/nginx.conf
http {
server{
listen 80;
server_name 172.25.48.10;
location / {
root html;
index index.html index.htm;
rewrite ^(/.*)$ http://172.25.48.7;##将所有在浏览器上输入的网址全部重定向到http://172.25.48.7主页上。
}
}
}
# nginx -t
# nginx -s reload
打开浏览器,输入:172.25.48.10,均定向到“http://172.25.48.7”上面。
9.Nginx反向代理模块
功能:nginx做反向代理器,后台多个主机分别充当不同功能的服务器,达到数据有序存放的目的。
# vim /usr/local/lnmp/nginx/conf/nginx.conf
http {
server {
listen 80;
server_name 172.25.48.10;
#location /bbs {
# proxy_pass http://172.25.48.7/bbs; ##反向代理到其他主机的默认发布目录。
#}
location ~ ^/bbs { ##正则表达式,当使用正则表达式时,则反向代理所指定的网址不需要指定目录。
proxy_pass http://172.25.48.7;
}
}
}
# nginx -t
# nginx -s reload
在172.25.48.7主机中的nginx默认发布目录/var/www//html中建立bbs目录。在bbs目录中建立网页index.html.
# mkdir -p /var/www/html/bbs
# vim /var/www/html/bbs/index.html
bbs.site server3.example.com
打开浏览器,输入“172.25.48.10/bbs”,结果会显示172.25.48.7主机/var/www/html/bbs/index.html中的网页内容。
10.Nginx缓存机制+负载均衡
功能:当出现高并发访问时,利用此机制可以减小后台压力,在一定时间内,客户可以通过访问缓存来达到诉求。
级别:level级别 = 1:2 ##1表示一级目录,为一个字符。2表示2级目录,为两个字符。最多为三层目录。定义目录。
Keys_zone=one:10m ##定义一个缓存文件区域大小。
max_size=512m; ##设置缓存最大值为512m。
# mkdir -p /dev/shm/nginx/cache ##建立系统缓存目录。
# vim /etc/rc.local ##此脚本在系统开机时会自动执行,将建立缓存目录命令行写入此目录中,则会在系统开机时自动建立系统缓存目录。
mkdir -p /dev/shm/nginx/cache
# vim /usr/local/lnmp/nginx/conf/nginx.conf
http {
upstream westos { ##负载均衡
server 172.25.48.7:80; ##nginx轮循规则
server 172.25.48.4:80;
}
##cache缓存机制,分别指定
proxy_cache_path /dev/shm/nginx/cache levels=1:2 keys_zone=one:10m max_size=512m;
add_header X-Cache $upstream_cache_status;
server {
listen 80;
server_name www.heihei.com;
location / { ##正则表达式指定路径
proxy_pass http://redhat; ##westos为负载均衡名称,与upstream对应。
proxy_cache one; ##指定缓存区域,与keys_zone对应。
proxy_cache_valid 200 10s; ##指定缓存时间,超过缓存时间,缓存失效,请求重新从后端获取数据,200是http的状态
码,表示正确。100表示静态界面,300表示重定向。
}
}
}
# nginx -t
# nginx -s reload
分别在172.25.48.7和172.25.48.4主机的nginx的默认发布目录/var/www/html目录中分别建立网页,打开浏览器,输入“www.heihei.com”,
不停按f5,每隔10s,结果会在vm7.example.com和vm7.example.com之间变换,并且会在/dev/shm/nginx/cache目录中产生大量缓存文件。
并且不间断执行“curl -I localhost”命令会出现以下结果:
# curl -I localhost
HTTP/1.1 200 OK
Server: nginx
X-Cache: EXPIRED ##表示缓存已经失效,此次访问是直接访问后台。
立刻再次执行,会出现以下结果;
# curl -I localhost
HTTP/1.1 200 OK
Server: nginx
X-Cache: HIT ##表示此次访问是访问缓存,而不是直接访问后台.