==========Apache==========================
全局 容器 认证 日志 cgi 负载
1.全局变量:ServerRoot |keepalive |进程数|listen |modules|状态信息
2.配置主服务器:user+group|ServerAdmin|ServerName|ServerTokens|DocumentRoot|容器|htaccess|索引 | Alias
3.建立虚拟Web站点 IP/域名
一、全局参数
--httpd.conf: //基本设置
ServerRoot "/mnt/software/apache2" #你的apache软件安装的位置。其它指定的目录如果没有指定绝对路径,则目录是相对于该目录。
Listen 80 #服务器监听的端口号。
ServerName www.clusting.com:80 #主站点名称(网站的主机名)。
ServerAdmin admin@clusting.com #管理员的邮件地址。
DocumentRoot "/mnt/web/clusting" #主站点的网页存储位置。
--httpd-default.conf://持久连接
KeepAlive On #开启持久性连接功能。即当客户端连接到服务器,下载完数据后仍然保持连接状态。
MaxKeepAliveRequests 100 #一个连接服务的最多请求次数。
KeepAliveTimeout 30 #持续连接多长时间,该连接没有再请求数据,则断开该连接。缺省为15秒。
--httpd-mpm.conf //父子进程
<IfModule mpm_prefork_module> //子进程预派生
StartServers 5 #启动apache时启动的httpd进程个数。
MinSpareServers 5 #服务器保持的最小空闲进程数。
MaxSpareServers 10 #服务器保持的最大空闲进程数。
MaxClients 150 #最大并发连接数。
MaxRequestsPerChild 1000 #每个子进程被请求服务多少次后被kill掉。0表示不限制,推荐设置为1000。
</IfModule>
<IfModule mpm_worker_module> //多进程多线程
StartServers 2 #启动apache时启动的httpd进程个数。
MaxClients 150 #最大并发连接数。
MinSpareThreads 25 #服务器保持的最小空闲线程数。
MaxSpareThreads 75 #服务器保持的最大空闲线程数。
ThreadsPerChild 25 #每个子进程的产生的线程数。
MaxRequestsPerChild 0 #每个子进程被请求服务多少次后被kill掉。0表示不限制,推荐设置为1000。
</IfModule>
二、容器
//目录容器
<Directory "/mnt/web/clusting">
Options FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
<Directory "/mnt/web/clusting">
<Files private.html>//文件容器
Order allow,deny
Allow from all
</Files>
</Directory>
//网络空间容器
<Location /private>
Order Allow,Deny
Deny from all
</Location>
//virtualhost
基于IP地址+多端口(listen 192.168.1.1 80 listen192.168.1.20 8080)Listen--端口
基于域名 NameVirtualHost--IP:
单个IP地址 NameVirtualHost *:80 | 多个IP地址 NameVirtualHost 192.168.1.20:80
三 .htaccess
--httpd.conf:
AccessFileName .htaccess
Alias /download/ "/var/www/download/" //路径别名
<Directory "/var/www/download">
Options Indexes
AllowOverride AuthConfig
</Directory>
加入用户认证
/usr/local/apache2/bin/htpasswd -c /var/httpuser/passwords bearzhang
--.htaccess
vi /var/www/download/.htaccess:
AuthType Basic
AuthName "Restricted Files"
AuthUserFile /var/httpuser/passwords
Require user bearzhang
#Require valid-user #all valid user
四、日志
(1)错误日志的设置
ErrorLog logs/error_log #日志的保存位置
LogLevel warn #日志的级别
显示的格式日下:
[Mon Oct 10 15:54:29 2005] [error] [client 192.168.10.22] access to /download/ failed, reason: user admin not allowed access
(2)访问日志设置
日志的缺省格式有如下几种:
LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" combined
LogFormat "%h %l %u %t "%r" %>s %b" common #common为日志格式名称
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
CustomLog logs/access_log common
五、CGI
ScriptAlias /cgi-bin/ "/mnt/software/apache2/cgi-bin/" # 访问时可以:http://www.clusting.com/cgi-bin/ 。但是该目录下的CGI脚本文件要加可执行权限!
<Directory "/usr/local/apache2/cgi-bin"> #设置目录属性
AllowOverride None
Options None
Order allow,deny
Allow from all
</Directory>
六、负载均衡
Listen 202.x.xx.xxx:80 (别人访问的IP和端口)
<VirtualHost 202.x.xx.xxx:80>
ServerAdmin admin@bit.com
ProxyRequests On
Proxypass / balancer://proxy/
ProxySet lbmethod=bytraffic //负载均衡算法,根据流量
<Proxy balancer://proxy>
Order Deny,Allow
Allow from all
BalancerMember http://10.0.0.1 loadfactor= 3 //weight
BalancerMember http://10.0.0.2 loadfactor= 1 //去掉loadfactor ,加上status=+H,就能把10.0.0.2指定为备份服务器,一旦10.0.0.1出了问题,就能启用它,并每隔几分钟检查一下10.0.0.1好了没有,如果好了就转回10.0.0.1
</Proxy>
=======nginx=====================
all of:
knowledge多线程 异步 功能
config 模块架构 基本配置 模块配置
exec 轻量 模块 抗并发
并发配置
工作模式
Http请求:连接-压缩-缓冲-负载-服务器
服务器:基本-错误-静态-状态-禁止-PHP脚本(默认-fastcgi-负载)
nginx相对于apache的优点:轻量级 抗并发 模块化
静态文件处理,前端Cache
抗并发--最核心的区别在于apache是同步多进程模型(阻塞型),一个连接对应一个进程,高并发容易有进程数飙升;nginx是异步非阻塞的,并发连接(万级别)可以对应一个进程。 [多进程apache 多线程iis 同步 请求响应 异步 请求不待响应 阻塞 等待IO 非阻塞 不待IO]
正则配置,简单易行
功能和原理
worker_rlimit_nofile 100000
#工作模式及连接数上限
events {
multi_accept on;
}
#设定http服务器,利用它的反向代理功能提供负载均衡支持
http {
default_type application/octet-stream;
access_log /var/log/nginx/access.log;
# 配置fastcgi 功能
#服务器连接超时
fastcgi_connect_timeout 200;
#发请求后的等待时间
fastcgi_send_timeout 200;
#发送请求后的响应超时时间
fastcgi_read_timeout 200;
#nginx读取应答数据等待的超时时间
fastcgi_buffer_size 64k;
#设置每次从fastcgi读取应答数据使用的缓存区大小
fastcgi_buffers 4 64k;
#设置每次将来自fastcgi的瘾大数据写入本地临时文件时数据块的大小上限
fastcgi_temp_file_write_size 128k;
#连接超时时间
#开启gzip压缩
gzip on;
gzip_disable "MSIE [1-6]\.(?!.*SV1)";
#设定请求缓冲
client_header_buffer_size 1k;
large_client_header_buffers 4 4k;
#包含文件
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
#设定负载均衡的服务器列表
upstream mysvr {
server 192.168.8.1:3128 weight=5;
server 192.168.8.2:80 weight=1;
server 192.168.8.3:80 weight=6;
}
//服务器
server {
server_name 192.168.8.x;
# 定义错误提示页面
location = /50x.html {
root /root;
}
#静态文件,nginx自己处理
location ~ ^/(images|javascript|js|css|flash|media|static)/ {
root /var/www/virtual/htdocs;
expires 30d;
}
#PHP 脚本请求
root /root;
index index.php index.html index.htm;
//请求发给fastcgi处理
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /home/www/www$fastcgi_script_name;
include fastcgi_params;
//设置负载均衡
proxy_pass http://mysvr ;#请求转向mysvr 定义的服务器列表
#以下是一些反向代理的配置可删除.
proxy_redirect off;
#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m; #允许客户端请求的最大单文件字节数
client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数,
proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时)
proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时)
proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时)
proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传
}
#设定查看Nginx状态的地址
location /NginxStatus {
stub_status on;
access_log on;
auth_basic "NginxStatus";
auth_basic_user_file conf/htpasswd;
}
#设置对静态的媒体文件进行缓存,过期时间30天
location ~* \.(jpg|jpeg|gif|png|swf)${
if(-f $request_filename){
root /home/www
expires 30d;
break;
}
}
#设置对静态的js文件和cs文件进行缓存,过期时间1天
location ~* \.(js|css)${
if(-f $request_filename){
root /home/www
expires 30d;
break;
}
}
#禁止访问 .htxxx 文件
location ~ /\.ht {
deny all;
}
}
nginx内核参数优化项:
linux:
net.ipv4.tcp_max_tw_buckets = 6000 #设定timewait的数量,默认是180000,这里设置为6000
net.ipv4.ip_local_port_range = 1024 65000 #用来设定允许系统打开的端口范围
net.ipv4.tcp_tw_recycle = 1 #设置启用timewait快速回收
net.ipv4.tcp_tw_reuse = 1 #设置开启重用,允许将TIME-WAIT sockets 重新用于新的TCP连接
net.ipv4.tcp_syncookies = 1 #设置开启SYN Cookies,当出现SYN等待队列溢出时,启用cookies进行处理
net.core.somaxconn = 262144 #默认值是128,用于调节系统同时发起的tcp连接数,在高并发的请求中,默认的值可能会导致连接超时或者重传
net.core.netdev_max_backlog = 262144 #表示当每个网络接口,接收数据包,的速率,比内核,处理这些包的,速率快时,允许发送到 队列 的数据包的最大数目
net.ipv4.tcp_max_orphans = 262144 #防止简单DDOS攻击,不能过分依靠这个限制甚至人为减小这个值,更多的情况下应该增加这个值
net.ipv4.tcp_max_syn_backlog = 262144 #用于记录那些 尚未收到 客户端确认信息 的 连接请求 的最大值,对于有128MB内存的系统来说,默认值是1024,
net.ipv4.tcp_synack_retries = 1 #决定了内核放弃连接之前,发送SYN+ACK包的数量
net.ipv4.tcp_syn_retries = 1 #表示在内核放弃建立连接之前发送SYN包的数量
net.ipv4.tcp_fin_timeout = 1 #决定了套接字保持在FIN-WAIT-2状态的时间,默认值是60秒,正确设置这个值非常重要,有时即使一个负载很小的web服务器,也会出现大量的死套接字而产生内存溢出的风险
net.ipv4.tcp_keepalive_time = 30 #当keepalived启用的时候,TCP发送keepalive消息的频度,默认值是2(单位是小时)
cpu:
worker_process 4; #nginx 服务进程数,cpu核数
worker_cpu_affinity #每个进程分配cpu的工作内核
net:
keepalive_timeout 60 50;#服务器与客户端连接超过60s断开,消息头与浏览器保持连接不超过50s,
send_timeout 10s; #服务端等待时间超过10s,自动关闭连接
client_header_buffer_size #允许nginx服务器接收较大的请求头部
multi_accept #尽可能多的接收网络请求
event:
use 指定驱动模型
worker_connections #nginx服务器每个工作进程允许同时连接客户端最大数
worker_rllmit_sigpending
devpoll_changes devpoll_events
kqueue_changes kqueue_events
epoll_events
rtsig_signo
rtsig_overflow_*
gzip:
gzip on; //开启gzip功能
gzip_min_length 1024; //响应页数据上限
gzip_buffers 4 16k;//缓存空间大小
gzip_comp_elvel 2;//压缩级别为2
gzip_types text/plain application/x-javascript text/css application/xml;//压缩源文件类型
gzip_vary on;//启用压缩标识
gunzip_static on;//检查预压缩文件
Rewrite:
模块:ngx_http_upstream_module
语法:upstream server ip_hash keep alive least_conn | if break rewrite ...
功能配置:
域名跳转 web.site ==>my.web.site
域名镜像 bj.web.site==>web.site.bj tj.web.site==>web.site.tj
独立域名 home.web.site==>my.web.home family.web.site==>web.site.family
目录自动添加 / http://my.web.site/search ==>http://my.web.site/search/
目录合并 my.web.site/server/12/34/56/78/9.htm ==>my.web.site/server-12-34-56-78-9.htm
防盗链: otherWebSitePic ==> 403 or forbidden png
Proxy:
概念常识:
proxy_pass 反向代理选项
proxy_buffer 用来缓冲处理异步请求,就是多次请求合并成一次发送,减少数据传输频率
proxy_cache 用来做缓存,和proxy_buffer的区别是用来读取硬盘数据到内存,提高相应速度,但是要开启proxy_buffer才能用
功能配置:
一般轮询
加权轮询(weight)
特定资源(video file)
不同域名(home.website bbs.website)
url重写(rewrite)
Cache:
proxy_store(静态404) proxy_cache(动态链接)
memcache(可读不可写) squid(硬盘)
+varnish(内存,流行)
1、传统缓存之一(404)
这个办法是把nginx的404错误定向到后端,然后用proxy_store把后端返回的页面保存。
location / {
root /home/html/;#主目录
expires 1d;#网页的过期时间
error_page 404 =200 /fetch$request_uri;#404定向到/fetch目录下
}
location /fetch/ {#404定向到这里
internal;#指明这个目录不能在外部直接访问到
expires 1d;#网页的过期时间
alias /home/html/;#虚拟目录文件系统地址要和locaion /一致,proxy_store会将文件保存到这目录下
proxy_pass http://xok.la/;#后端upstream地址,/fetch同时是一个代理
proxy_set_header Accept-Encoding '';#让后端不要返回压缩(gzip或deflate)的内容,保存压缩后的内容会引发乱子。
proxy_store on;#指定nginx将代理返回的文件保存
proxy_temp_path /home/tmp;#临时目录,这个目录要和/home/html在同一个硬盘分区内
}
使用的时候还有要注意是nginx要有权限往/home/tmp和/home/html下有写入文件的权限,在linux下nginx一般会配置成 nobody用户运行,这样这两个目录就要chown nobody,设成nobody用户专用,当然也可以chmod 777,不过所有有经验的系统管理员都会建议不要随便使用777。
2、传统缓存之二(!-e)
原理和404跳转基本一致,但更简洁一些:
location / {
root /home/html/;
proxy_store on;
proxy_set_header Accept-Encoding '';
proxy_temp_path /home/tmp;
if ( !-f $request_filename )
{
proxy_pass http://xok.la/;
}
}
可以看到这个配置比404节约了不少代码,它是用!-f来判断请求的文件在文件系统上存不存在,不存在就proxy_pass到后端,返回同样是用proxy_store保存。
两种传统缓存都有着基本一样的优点和缺点:
缺点1:不支持带参数的动态链接,比如read.php?id=1,因为nginx只保存文件名,所以这个链接只在文件系统下保存为read.php,这样用户访问read.php?id=2时会返回不正确的结果。同时不支持http://xok.la/这种形式的首页和二级目录http: //xok.la/download/,因为nginx非常老实,会将这样的请求照链接写入文件系统,而这个链接显然是一个目录,所以保存失败。这些情况都需要写rewrite才能正确保存。
缺点2:nginx内部没有缓存过期和清理的任何机制,这些缓存的文件会永久性地保存在机器上,如果要缓存的东西非常多,那就会撑暴整个硬盘空间。为此可以使用一个shell脚本定期清理,同时可以撰写php等动态程序来做实时更新。
缺点3:只能缓存200状态码,因此后端返回301/302/404等状态码都不会缓存,假如恰好有一个访问量很大的伪静态链接被删除,那就会不停穿透导致后端承载不小压力。
缺点4:nginx不会自动选择内存或硬盘作为存储介质,一切由配置决定,当然在当前的操作系统里都会有操作系统级的文件缓存机制,所以存在硬盘上也不需要过分担心大并发读取造成的io性能问题。
nginx 传统缓存的缺点也是它和squid等缓存软件的不同之特色,所以也可看作其优点。在生产应用中它常常用作和squid的搭档,squid 对于带?的链接往往无法阻挡,而nginx能将其访问拦住,例如:http://xok.la/?和http://xok.la/在squid上会被当做两个链接,所以会造成两次穿透;而nginx只会保存一次,无论链接变成http://xok.la/?1还是http://xok.la/?123,均不能透过nginx缓存,从而有效地保护了后端主机。
nginx会非常老实地将链接形式保存到文件系统中,这样对于一个链接,可以很方便地查阅它在缓存机器上的缓存状态和内容,也可以很方便地和别的文件管理器如rsync等配合使用,它完完全全就是一个文件系统结构。
这两种传统缓存都可以在linux下将文件保存到/dev/shm里,一般我也是这么做的,这样可以利用系统内存来做缓存,利用内存的话,清理过期内容速度就会快得多。使用/dev/shm/时除了要把tmp目录也指向到/dev/shm这个分区外,如果有大量小文件和目录,还要修改一下这个内存分区的 inode数量和最大容量:
mount -o size=2500M -o nr_inodes=480000 -o noatime,nodiratime -o remount /dev/shm
上面的命令在一台有3G内存的机器上使用,因为/dev/shm默认最大内存是系统内存的一半就是1500M,这条命令将其调大成2500M,同时 shm系统inode数量默认情况下可能是不够用的,但有趣的是它可以随意调节,这里调节为480000保守了点,但也基本够用了。
3、基于memcached的缓存
nginx对memcached有所支持,但是功能并不是特别之强,性能上还是非常之优秀。
location /mem/ {
if ( $uri ~ "^/mem/([0-9A-Za-z_]*)$" )
{
set $memcached_key "$1";
memcached_pass 192.168.6.2:11211;
}
expires 70;
}
这个配置会将http://xok.la/mem/abc指明到memcached的abc这个key去取数据。
nginx目前没有写入memcached的任何机制,所以要往memcached里写入数据得用后台的动态语言完成,可以利用404定向到后端去写入数据。
4、基于第三方插件ncache
ncache是新浪兄弟开发的一个不错的项目,它利用nginx和memcached实现了一部分类似squid缓存的功能,我并没有使用这个插件的经验,可以参考:
http://code.google.com/p/ncache/
5、nginx新开发的proxy_cache功能
从nginx-0.7.44版开始,nginx支持了类似squid较为正规的cache功能,目前还处于开发阶段,支持相当有限,这个缓存是把链接用md5编码hash后保存,所以它可以支持任意链接,同时也支持404/301/302这样的非200状态。
配置:
首先配置一个cache空间:
proxy_cache_path /xok/to/cache levels=1:2 keys_zone=xok1:10m inactive=5m max_size=2m clean_time=1m;
proxy_temp_path参数路径也需要跟上面的proxy_cache_path在一个分区上,否则会报错。
注意这个配置是在server标签外,levels指定该缓存空间有两层hash目录,第一层目录是1个字母,第二层为2个字母,保存的文件名就会类似 /xok/to/cache/e/4a/0f1019b0db2f97d17c2238c0271a74ae;keys_zone为这个空间起个名字,10m指空间大小为10MB;inactive的5m指缓存默认时长5分钟;max_size的2m是指单个文件超过2m的就不缓存;clean_time指定一分钟清理一次缓存。
location / {
proxy_pass http://xok.la/;
proxy_cache xok1;#使用xok1这个keys_zone
proxy_cache_valid 200 302 1h;#200和302状态码保存1小时
proxy_cache_valid 301 1d;#301状态码保存一天
proxy_cache_valid any 1m;#其它的保存一分钟
}
综合起来可以简单优化静态文件:
location ~ .*\.(js|css|gif|jpg|jpeg|png|bmp|swf|flv)$
{
proxy_pass http://backend;
expires 6h; #设置浏览器过期时间
proxy_cache xok1;#使用xok1这个keys_zone
proxy_cache_valid 200 302 1h;#200和302状态码保存1小时
proxy_cache_valid 301 1d;#301状态码保存一天
proxy_cache_valid any 1m;#其它的保存一分钟
}
注意:支持cache的0.7.44到0.7.51这几个版本的稳定性均有问题,访问有些链接会出现错误,所以这几个版本最好不要在生产环境中使用。 nginx-0.7下目前所知较为稳定的版本是0.7.39。稳定版0.6.36版也是近期更新,如果在配置里没有使用到0.7的一些新标签新功能,也可以使用0.6.36版。