nginx简介及特性
1.)nginx是一个高性能的web服务器和反向代理服务器,也是一个邮件代理服务器。具有高并发,开销小的特性。性能稳定,采用异步I/O处理机制。配置简洁。
2.)nginx特性:
基本功能:
静态资源的web服务器,能缓存打开的文件描述符
反向代理服务器,缓存、负载均衡
支持FastCGI
模块化,非DSO机制,过滤器gzip,SSI和图像大小调整等
支持SSL
扩展功能:
基于名称和IP做虚拟主机
支持keepalive
支持平滑配置更新或程序版本升级
定制访问日志,支持使用日志缓存以提高性能
支持url rewrite
支持路径别名
支持基于IP及用户的认证
支持速率限制,并发限制等
1.)nginx编译安装
安装nginx准备工作
创建nginx userand group
# useradd -r -s /sbin/nologin nginx
安装nginx sslproxy 需要的开发依赖包
# yum installopenssl-devel pcre-devel
解压nginx
tar xf nginx-1.6.1.tar.gz
编译安装
# ./configure--prefix=/usr/local/nginx #指定nginx安装目录 --sbin-path=/usr/sbin/nginx #指定nginx管理命令目录,也可以不知道而后连接到/usr/sbin下 --conf-path=/etc/nginx/nginx.conf #指定nginx主配置文件存放位置 --error-log-path=/var/log/nginx/error.log #指定nginx错误日志存放位置 --http-log-path=/var/log/nginx/access.log #指定nginx访问日志存放位置 --pid-path=/var/run/nginx/nginx.pid #指定nginx的PID存放位置 --lock-path=/var/lock/nginx.lock #指定nginx锁文件存放位置 --user=nginx #指定nginx的启动用户 --group=nginx #指定nginx的用户组 --with-http_ssl_module #指定nginx支持ssl模块 --with-http_flv_module #指定nginx流媒体模块 --with-http_stub_status_module #开启nginx的状态查看模块 --with-http_gzip_static_module #开启nginx压缩功能模块 --http-client-body-temp-path=/var/tmp/nginx/client #指定客户端请求主体临时存放目录 --http-proxy-temp-path=/var/tmp/nginx/proxy #指定客户端请求数据,而后端服务器先加载到nginx代理服务器的目录 --http-fastcgi-temp-path=/var/tmp/nginx/fastcgi #指定客户端请求的CGI相关的缓存存放路径 --http-uwsgi-temp-path==/var/tmp/nginx/uwsgi #指定客户端请求python开发相关页面的缓存路径 --http-scgi-temp-path=/var/tmp/nginx/scgi #scgi,对cgi的扩展 --with-pcre #指定代理模块 # make &&make install 注释:nginx是异步服务器,如果客户端上传一个数据,并且nginx作为代理服务器,需要先将客户端上次的数据保存到nginx的指定存放路径,等客户端上传完成后才交给后端服务器。如果客户端下载一个文件,也需要在后端服务器加载到前端nginx代理服务器后才响应给客户。也就是为什么要指定上面几个temp-path的原因。
2.)创建编译安装时指定/var/tmp/nginx这个目录
mkdir -pv/var/tmp/nginx/
3.)启动nginx,检查端口
# nginx
4.)输入IP地址,访问测试页
5.)nginx编译安装的时候是没有提供启动控制脚本的
# /usr/sbin/nginx #启动nginx # kill `cat/var/run/nginx/nginx.pid` #停止nginx # kill -HUP `cat/var/run/nginx/nginx.pid` #平滑重启nginx # nginx -t -c/etc/nginx/nginx.conf #检查nginx配置文件
6.)提供Sys风格启动控制脚本,加入开机启动。脚本的提供是由rpm软件包安装生成的,需要修改一些参数就可以使用
# chkconfig --addnginx # chkconfig nginxon # chkconfig --listnginx nginx 0:off 1:off 2:on 3:on 4:on 5:on 6:off
7.)正常情况下,nginx配置文件是没有语法高亮的,如果需要可以下载nginx.vim来修改
下载地址:http://www.vim.org/scripts/script.php?script_id=1886
# mkdir -pv.vim/syntax mkdir: createddirectory `.vim' mkdir: createddirectory `.vim/syntax' # cp nginx.vim~/.vim/syntax/ # vim~/.vim/filetype.vim auBufRead,BufNewFile /etc/nginx/* if &ft == '' | setfiletype nginx | endif
这次nginx.conf里面就是高亮显示的了。
8.)nginx配置文件
全局配置段 events{ … } http{ … } ################################################################ 全局配置段默认设置。 user nginx; #nginx的启动用户 worker_processes 1; #worker的进程数,一般是CPU的物理核心数 #error_log logs/error.log; # 错误日志 #error_log logs/error.log notice; #日志级别 #error_log logs/error.log info; pid /var/run/nginx/nginx.pid; # nginx进程的PID worker_rlimit_nofile65535; # worker进程可打开的文件数 worker_rlimit_sigpending # 设定每个用户能够发往worker进程信号队列的数量 #ssl_enginedevice; # 在存在ssl硬件加速器上的服务器,指定锁使用的ssl硬件加速设备 #timer_resolutiontime; # 每次内核事件调用返回时,都会使用gettimeofday()来更新nginx缓存时钟,time_resolution用于定义每隔多久才会更新一次缓存时钟。 worker_priority-10; # 指定worker进程的nice值,值越小调度就会越优先 daemon on; # 是否开启nginx调试功能,默认为on,off后可以将所有信息输出到控制台。 master_process on; # 是否以master/worker模式运行nginx,默认为on,调试时可以设置off以方便追踪。
9.)nginx提供了可以绑定进程运行在指定CPU上,就是所谓的CPU亲缘性。这是属于nginx优化的一部分,尽可能的避免进行来回活动在其他的核心上
查看主机CPU的核心数
# cat /proc/cpuinfo| grep 'processor' processor : 0 processor : 1 processor : 2 processor : 3
在配置文件中绑定CPU。全局配置段
worker_cpu_affinity0001 0010 0100;
查看nginx绑定在哪个CPU上
# ps -eopid,args,psr | grep nginx 1449 nginx: master process /usr/ 0 1450 nginx: worker process 0 1451 nginx: worker process 1 1452 nginx: worker process 2
可以看下我做的测试
下面是没绑定的时候nginx进程运行在哪个CPU上
下面是我绑定CPU后的测试
10.)events配置段
events{ #accept_mutex on; # 是否打开nginx负载均衡锁,此锁能够让多个worker进程轮流序列化的与新的客户端连接。功能默认是打开的。 #lock_file /path/to/lock.file; # lock文件 #accept_mutex_delay#ns; # 一个worker进程为取得accept锁的等待时长 multi_sccept on; # 是否允许一次性响应多个用户请求,默认为off。 woker_connections ; #每个worker最大并发响应最大请求数,如果为代理服务器,应该是worker_rlimit_nofile数值的2倍。 } http{ … server { # 定义一个虚拟主机,nginx支持使用基于域名IP的虚拟主机。 listen 80; #nginx监听的端口 server_name localhost; #定义主机名,可以跟多个主机名。当nginx收到一个请求后,会取出首部的server值,而后跟其他server_name进行比较 #比较方式: #精确匹配:www.test.com #左侧通配符匹配:*.test.com #右侧通配符匹配:www.* #正则表达式匹配:~^.*\.test\.com$ server_name_hash_bucket_size 64; # 为了实现快速查找,nginx使用hash表来保存主机名 #charset koi8-r; #access_log logs/host.access.log main; #location匹配设置,根据用户请求指定URI来匹配指定的location以进行匹配 #= :精确匹配,如果匹配到,则退出匹配。 #~ :正则表达式匹配模式,匹配时区分字符大小写 #~*:正则表达式匹配模式,匹配时忽略大小写 #^~: URI的前半部分匹配,禁止正则表达式 location / { root html; # 文件路径定义 # root html : 设置web资源路径,用户指定请求的网页存放路径 index index.html index.htm; # 定义默认页面 } #error_page 404 /404.html; # 错误页面重定向 #try_file $uri paht2 : 自左向右读取path所指定路径,在第一次找到即停止并返回,如果path不存在,则返回最后一个uri # redirect server error pages to thestatic page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; }… } 定义基于IP的虚拟主机 server { listen 80; server_name 192.168.122.135; location / { root html/web1; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } server { listen 80; server_name 192.168.122.136; location / { root html/web2; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
11.)创建网站跟目录
# mkdir /usr/local/nginx/html/{web1,web2} # vim/usr/local/nginx/html/web1/index.html # vim/usr/local/nginx/html/web2/index.html # ifconfig eth1:0192.168.122.136/24 # ifconfig | grep'inet addr' inetaddr:192.168.122.135 Bcast:192.168.122.255 Mask:255.255.255.0 inetaddr:192.168.122.136 Bcast:192.168.122.255 Mask:255.255.255.0
测试访问
12.)location 匹配设置
server { listen 80; server_name 192.168.122.135; location / { root html/web1; index index.html index.htm; } location ^~/images/ { root html/web3; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } # mkdir/usr/local/nginx/html/web3 # vim/usr/local/nginx/html/web3/index.html
# mkdir/usr/local/nginx/html/web3/images # cp/usr/local/nginx/html/web3/index.html /usr/local/nginx/html/web3/images/
第一个输入192.168.133.135/images没有匹配到是因为在web3下没有images这个目录,而roothtml/web3下指明了是应该访问的html/web3/images下的内容
13.)目录文件别名
location^~/images/ { alias html/web3; index index.html index.htm; }
# cp/usr/local/nginx/html/web3/images/index.html /usr/local/nginx/html/web3/
14.)错误页面重定向
server { listen 80; server_name 192.168.122.135; error_page 404 /404.html; #error_page 404 =200 /404.html; … } # vim/usr/local/nginx/html/web1/404.html
15.)页面不存在,定向到首页去
location /newweb { root html/web3; try_files $uri /index.html; } # mkdir /usr/local/nginx/html/web3/newweb
16.)访问控制,我的无线网络是172网段的,虚拟机是192网段的,就禁止172网段进行访问
server { listen 80; server_name 192.168.122.135; allow 172.16.0.0/16; deny all; … }
17.)性能监控模块status
server { location /status { stub_status on; access_log off; allow all; #deny all; } }
18.)用户认证模块
server { … location /status { stub_status on; access_log off; auth_basic "nginxstatus"; auth_basic_user_file/etc/nginx/.nginxpass; } … } # htpasswd -c -m/etc/nginx/.nginxpass admin
19.)防盗链
server { location ~* \.(jpg|png|gif)$ { root html/web2; valid_referers none blockedwww.a.com *.a.com; if ($invalid_referer) { rewrite ^/http://www.a.com/403.html; } }
上面的主机名已经不再是基于IP的虚拟主机,而是修改成了www.a.com
通过web1的主机访问测使用图片
通过www.a.com使用图片
日志已经显示给重定向了
20.)URL地址重写 rewrite
last: 一旦被当前规则匹配并重写后立即停止检查后续的其它rewrite的规则,而后通过重写后的规则重新发起请求 break: 一旦被当前规则匹配并重写后立即停止后续的其它rewrite的规则,而后继续由nginx进行后续操作 redirect: 返回302临时重定向 permanent: 返回301永久重定向
# mkdir/usr/local/nginx/html/web2/{jpg,images} # mv 123.jpg/usr/local/nginx/html/web2/images/ server{ … location /jpg/ { root html/web2; rewrite ^/jpg/(.*\.(jpg|gif|png))$/images/$1 last; } … }
正常的访问也是可以进行的
总结:基本配置只是做出了一部分示例,还有很多功能和参数没有介绍,官方网站上也是有中文的nginx的文档