与LVS区别
LVS四层,Nginx七层且只支持80和25端口, 反向代理、web、mail代理,通过keepalive做nginx的HA 选择Nginx的理由 高并发连接:Nginx能够支撑5万并发连接,实际测试可以达到3万左右,按照这样计算,每天可以处理亿次访问量,采用最新epoll(linux2.6内核)和kqueue(fressbsd)网络I/O模型,而Apache则使用的是传动的select模型 内存消耗小 Nginx+PHP(FastCFI)服务器在3万并发连接下,开启10个Nginx进程消耗150MB内存(15MB*10),开启64个Php-cgi进程消耗128MB内存(20MB*64),使用Webbench做压力测试,-在3万并发量下速度依然很快。 Nginx支持负载均衡、反向代理、相对于F5BIG-IP、NetScaler等硬件负载均衡交换机动辄10多万甚至几十万,可以免费试用、并且可以用于商业用途。 Memcached(软件) 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap。其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。 Memcache则是一个模块(功能),想要实现这个功能、PHP需要支持这个功能。 varnish做nginx和apache之间的缓存 memcache做php和mysql时间的缓存 nginx nginx[发动机]是使用HTTP和反向代理服务器,以及一个邮件代理服务器,由Igor Sysoev所编写的。很长一段时间,它已经运行了很多重仓俄罗斯网站,包括 Yandex的, Mail.Ru, VKontakte等, 蓝巴勒。根据Netcraft的nginx的服务或代理的 13.54%,2013年5月最繁忙的站点。下面是一些成功的故事: Netflix公司, Wordpress.com,FastMail.FM。 2条类似BSD的许可证 下发行的源代码和文档 。 基本HTTP服务器功能 服务指数和静态 文件, 自动索引, 缓存打开的文件描述符 ; 缓存的反向代理加速, 简单的负载均衡和容错 ; 加速与uwsgi 的FastCGI,SCGI, memcached 服务器的缓存的支持 , 简单的负载均衡和容错 ; 模块化的结构。过滤器包括 gzip压缩,字节范围,分块响应, XSLT, SSI,和图像转换过滤器。在一个页面内的多个SSI,可以并行地处理,是当它们存在代理或FastCGI服务器处理; SSL和TLS SNI支持。 其他的HTTP服务器功能 基于名称和基于IP的 虚拟服务器 ; 保持活动 和流水线连接支持; 灵活的配置; 重新配置 和升级一个可执行的客户服务不中断; 访问日志格式, 日志写入缓冲, 快速旋转日志 ; 3XX-5xx错误代码 重定向 ; 重写模块: 使用正则表达式的URI变化 ; 执行不同的功能,根据 客户端地址 ; 根据客户端IP地址 和HTTP基本认证的访问控制 ; 验证 HTTP引用 ; PUT,DELETE,MKCOL,复制和移动的方法; FLV 和 MP4 串流; 响应速率限制 ; 来自一个地址 同时连接请求的数量限制 ; 嵌入式的Perl。 邮件代理服务器功能 用户重定向到 IMAP 或 POP3 服务器使用外部HTTP 认证 服务器; 用户认证使用外部HTTP 认证 服务器和连接重定向到内部 SMTP服务器; 认证方式: POP3:用户名/密码,APOP,AUTH LOGIN/PLAIN/CRAM-MD5; IMAP:LOGIN,AUTH LOGIN/PLAIN/CRAM-MD5; SMTP AUTH LOGIN/PLAIN/CRAM-MD5; SSL支持; STARTTLS和STLS支援。 建筑和可扩展性 一个主站和多个工作进程;一个非特权用户下运行的工作进程; 支持的kqueue(FreeBSD的4.1 +),epoll的(LINUX 2.6 +),RT信号(Linux的2.2.19 +),为/ dev /民调(Solaris 7 11/99 +的),事件端口(Solaris 10)中,选择和投票表决; kqueue的各种功能包括EV_CLEAR,EV_DISABLE的支持(暂时停用事件),NOTE_LOWAT EV_EOF,可用的数据,错误代码的数量; 的sendfile(FreeBSD下3.1 + 2.2的Linux +和Mac OS X 10.5 +),sendfile64(Linux的2.4.21 +),使用sendfilev(的Solaris 8 7/01 +)支持; 文件AIO (FreeBSD的4.3 +,Linux的2.6.22 +); DIRECTIO (FreeBSD的4.4 +的Linux 2.4 +时,Solaris 2.6 +,Mac的OS X); 接受过滤器(FreeBSD的4.1 +,NetBSD的5.0 +)和TCP_DEFER_ACCEPT(LINUX 2.4 +) 的支持 ; 2.5M内存约需10,000非活动的HTTP连接保持活着; 的数据拷贝操作被保持在最低限度。 测试的操作系统和平台 FreeBSD的3 - 10 / I386 FreeBSD的5 - 10 / AMD64; Linux的2.2 - 3 / I386的Linux 2.6 - 3 / AMD64; 的Solaris 9 / i386上,SUN4U的Solaris 10 / i386上,AMD64,SUN4V; AIX 7.1 / PowerPC的; HP-UX 11.31 / IA64; Mac OS X中/ PPC,I386; Windows XP中,Windows Server 2003的。 Nginx编译和安装 zlib:nginx提供gzip模块,需要zlib库支持 opensll:nginx提供sll功能 pcre:支持抵制重写rewrite功能 yum -y install gcc gcc-c++ autoconf automake yum -y install zlib-devel openssl openssl-devel pcre-devel groupadd -r nginx useradd -s /sbin/nologin -g nginx -r nginx id nginx ./configure --prefix=/usr --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --user=nginx --group=nginx --with-http_ssl_module --with-http_flv_module --with-http_gzip_static_module --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/tmp/nginx/client --http-proxy-temp-path=/var/tmp/nginx/proxy --http-fastcgi-temp-path=/var/tmp/nginx/fcgi --with-http_stub_status_module make && make install mkdir /var/tmp/nginx/client -pv /usr/sbin/nginx -c /etc/nginx/nginx.conf启动 ps -ef | grep nginx 查看是否启动成功 netstat -tulnp | grep :80 查看是否监听 man 7 signal 查看信号 kill 15 关闭 Kill -HUP 重启 uname -a(查看操作系统内核信息) cat /etc/issue | grep Linux(操作系统发型信息) 查看CPU核心数 cat /proc/cpuinfo | grep physical | uniq -c(2个双核的CPU) 2 physical id : 0 2 physical id : 1 cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c (8个逻辑CPU、CPU型号) 4 AMD FX(tm)-8350 Eight-Core Processor getconf LONG_BIT (CPU运行在32bit模式下,不代表不支持64bit) cat /proc/cpuinfo | grep flags | grep ' lm ' | wc -l (计算结果大于0说明支持64bit) 检查nginx配置文件语法 /usr/sbin/nginx -t -c /etc/nginx/nginx.conf 语法 location ~ :区分大小写 ~*:不分区大小写 ^~:禁止表达式匹配 =:精确匹配 默认主机 (解析不到的所有URI都定位到此主机) server { listen 80 default_server; 一个IP地址只能有一个default_server,没有匹配到定向到此 server_name www.soulgirl.com; root /var/www/web2; index index.html; } 自定义错误页面 错误日志:注释掉 http中全局变量 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; 定义主机的访问日志和错误日志 server { listen 80 default_server; server_name www.soulgirl.com; root /var/www/web2; index index.html; access_log /var/log/nginx/www.soulgirl.com-access.log main; error_log /var/log/nginx/www.soulgirl.com-error.log warn; } 自定义错误页面 server { listen 80 default_server; server_name www.soulgirl.com; root /var/www/web2; index index.html; access_log /var/log/nginx/www.soulgirl.com-access.log main; error_log /var/log/nginx/www.soulgirl.com-error.log warn; error_page 403 404 /40x.html; location = /40x.html { root /var/www/error; } } 自动索引及别名功能 (即使目录项没有任何文件,也会显示出来空列表) server { listen 80 default_server; server_name www.soulgirl.com; root /var/www/web2; index index.html; access_log /var/log/nginx/www.soulgirl.com-access.log main; error_log /var/log/nginx/www.soulgirl.com-error.log warn; location /data { autoindex on; } error_page 403 404 /40x.html; location = /40x.html { root /var/www/error; } } 别名主机 server { listen 80 default_server; server_name www.soulgirl.com; root /var/www/web2; index index.html; access_log /var/log/nginx/www.soulgirl.com-access.log main; error_log /var/log/nginx/www.soulgirl.com-error.log warn; location /data { autoindex on; } location /b { alias /var/www/web2/data/redhat } error_page 403 404 /40x.html; location = /40x.html { root /var/www/error; } } 控制站点的访问 location /man { root /var/www/web2; index index.html; autoindex on; deny 192.168.1.237; allow 192.168.0.0/24; allow 192.168.1.111; deny all; } 目录身份验证(它实际上会先判断IP地址,符合之后才会判断身份) htpasswd -cm /etc/nginx/htpasswd wangchao htpasswd -c /etc/nginx/htpasswd duanxingyu location /man { root /var/www/web2; index index.html; autoindex on; auth_basic "AwstatAuth"; auth_basic_user_file /etc/nginx/htpasswd; deny 192.168.1.237; allow 192.168.0.0/24; allow 192.168.1.111; deny all; } Nginx状态检查 记录服务器的状态,一般情况下做身份验证,不能任何人都可以看。 编译安装时候--with-http_status_module 没有指定这个模块式不生效的 location /nginx_status { stub_status on; access_log off; } http://192.168.1.246/nginx_status Nginx rewrite Rewrite主要的功能就是实现URL的重写,Nginx的Rewrite规则采用PCRE(Perl Compatible Regular Expression)Perl兼容正则表达式的语法进行规则匹配,如果需要Nginx的Rewrite功能,在编译Nginx之前,需要编译安装PCRE库。URL包括URI 网站内部调整,URI变化,不想让影响用户使用 所有URI以/data开头任意结尾的所有请求转到location /bbs location /data { autoindex on; rewrite ^/data/?$ /bbs permanent; } location /bbs { index index.html; } 或者 2、根据不同浏览器将得到不同结果。 server { listen 80 default_server; server_name www.soulgirl.com; rewrite ^/data/(\.*)$ /bbs last; # rewrite ^(.*)$ http://www.soulboy.com$1 permanent; if ($http_user_agent ~ Chrome) { rewrite ^(.*)$ /chrome/$1 break; } if ($http_user_agent ~ MSIE) { rewrite ^(.*)$ /msie/data/$1 break; } 3、防盗链 Server { Listem 80; Server_name jgp.good.com; Location ~*\.(gif||jpg|jpeg)$ { Root good; Valid_referers_ www.good.com; If (invalid_referer) { Return 403; } } 4、实现域名跳转 server { listen 80 default_server; server_name www.soulgirl.com; rewrite ^(.*)$ http://www.soulboy.com$1 permanent; root /var/www/web2; index index.html; } 5、SSL server { listen 443; server_name www.good.com; ssl on; ssl_certificate /etc/pki/tls/certs/http.crt; ssl_certificate_key /etc/pki/tls/private/http.key; ssl_session_timeout 5m; ssl_protocols SSLv2 SSLv3 TLSv1; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; location / { root /var/www/web3; index index.html index.htm; } } Nginx日志管理 log_format命令用来设置日志的记录格式,语法如下: log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; $http_x_forwarded_for(真正的访问这者谁,不会记录代理服务器) $remote_user用来记录远程客户端用户名称(做身份认证的时候才会有) $time_local本地时间 $request用于记录请求的URL与HTTP协议 $status用于记录请求的状态,例如成功时状态为200,页面找不到时为404 $body_bytes_sent用于记录发送给客户端的文件主题内容大小 $http_referer用于记录从哪个页面链接访问过来的(防盗链) $http_user_agent用于记录客户端浏览器的相关信息 可以给每个location或者每个server定义日志,细化。 access_log /var/log/nginx/www.soulgirl.com-access.log main; error_log /var/log/nginx/www.soulgirl.com-error.log warn; 错误日志后面跟级别 定义日志 access_log /data/log/$server_name.log mylogformat buffer=32k (从0.7.4之后nginx支持变量) buffer=32k 表示设置内存缓冲区的大小 避免频繁的读写,放在内存之中。 开启日志打开缓存 对于每一条日志记录,日志文件都将先打开文件,在写入日志记录,然后马上关闭,为了提高包含变量的日志文件存放路径的性能,可以使用open_log_file_cache指令来设置,格式如下: open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time] | off max:设置缓存中的最大文件描述符数量(缓存中最大记录多少文件) inactive:设置一个时间,如果在设置的时间内没有使用此文件描述符,则自动删除此描述符 min_uses:在参数inactive指定的时间范围内,如果日志文件超过被使用的次数,则将该日志文件的描述符计入缓存,默认为10秒钟。 valid:设置多长时间检查换一次,看日志文件路径与文件名是否仍然在,默认60秒 open_log_file_cache max=1000 inactive=20s min_uses=2 valid=1m 每分钟检查1此,检查文件描述符如果在20秒内至少要读2次,否则自动删除此描述符 Nginx日志分割 并发量很大的话,一个日志文件几个G都有可能, nginx日志存放位置 logs_path=”/data/logs/” 将日志改名为 mkdir -p ${logs_path}${date -d “yesterday”+”%Y”)/$(date -d “yesterday” + “%m”)/ mv ${logs_path}access.log ${logs_path}${date -d “yesterday” + “%Y’)/$(date -d“yesterday”+”%m”)/access_$(date -d “yesterday”+”%Y%m%d”).log} 平滑重启nginx服务 service nginx reload 创建计划任务 Crontab -l 01 01 * * * /bin/bash/data/logs.sh Nginx开启压缩输出 在http{}中间,启用压缩,节省带宽 gzip on; gzip_min_length 1k; gizp_buffer 4 16k; gzip_http_version 1.1; gzip_comp_level 2; gzip_type text/plain application/x-javascript text/css application/xml; gzip_vary on; Nginx浏览器本地缓存设置 expires 对静态的缓存时间长些,对动态的缓存时间短些。 Nginx设定限速 dd if=/dev/zero of=test bs=1M count=100 location /data { limit_rate_after 20m; limit_rate 256k; # autoindex on; }
|