网站指向不同路径的nginx配置

Standard
upstream fastcgi_backend {
    server 127.0.0.1:9000;
    server unix:/var/run/php5-fpm.sock;
    keepalive 10;
}
...
server {
  ...
  ...
  location ~ \.php {
    set $php_root /var/www/website/abc/public;
    include /etc/nginx/fastcgi_params;
 
    if ($request_uri ~ /(api/user/photos|api/user/posts) ) {
      set $php_root /var/www/website/rest/public;
    }
 
    if ($request_uri ~ /api/user/(photos|posts|links) ) {
      set $php_root /var/www/website/rest/public;
    }
 
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_param PATH_TRANSLATED $php_root$fastcgi_path_info;
    fastcgi_param SCRIPT_NAME $fastcgi_script_name;
    fastcgi_param SCRIPT_FILENAME $php_root$fastcgi_script_name;
    fastcgi_pass fastcgi_backend;
    fastcgi_index index.php;
  }
  ...
}

大型bbs架构(squid+nginx)-转载

Standard

排版整理,原文地址:http://www.tech-q.cn/thread-1216-1-1.html 作者:myoula

这个架构基于squid、nginx和lvs等技术,从架构上对bbs进行全面优化和保护,有如下特点:
1、高性能:所有的点击基本上全部由前端缓存负责,提供最快速的处理。
2、高保障度:不需考虑应用程序稳定与否、程序语言是何种、数据库是何种,都能从架构上保证稳定。
3、高可用性:对应用程序的修改达到最简化:在程序的某些地方加入清缓存的语句即可,当然还需要做页面静态化的工作和统计工作。
首先看图(点击新窗口打开):
BBS架构

这个架构的特点和一些流程的说明:
1、主域名和图片域名分离
域名分离可以使流量分离,缓存策略分离等等,好处诸多。bbs初期一定要做好规划,将图片用另外的域名独立服务,即使没有足够机器,域名也要先分开。另外,图片服务器可以使用有别于主域名的另一个域名,一个好处是可以减少读取cookie对图片服务器的压力,另一个是提高安全性,避免cookie泄露。
2、使用LVS作为前端、二级代理和数据库的访问入口
使用LVS作为入口,比其他任何一种方式都来得更优质。首先LVS的负载能力很强,因为它工作在网络协议的第4层,使用虚拟ip技术,所以它本身并不担负任何流量的处理,仅仅是一个封包转发的功能;第二,LVS的配置相对简单而且稳定,一般去调整的几率比较低,也减少了因人为等因素而出现故障;第三,LVS可以处理任何端口的负载均衡,所以它基本可以做所有服务的负载均衡和容错。在这个架构中,除了处理http的80端口之外,LVS也处理了数据库mysql的3306端口,在数据库这个应用中是采用的双机热备策略。
3、使用nginx+squid作为最前端的缓存组合
在这个架构中,是最能体现app_nginx_squid_nginx架构的优势的。在这个架构中的bbs运行在缓存上,用户每发布一张帖子,都需要使用purge指令清除该帖子的缓存,如果是squid在最前端,那么每次发布一张帖子,都需要在所有的squid中调用purge指令,这样在机器比较多的时候,purge将成为一个巨大的压力。
所以在这里将nginx放在最前端并使用手工url_hash的方式分流,将经常需要purge的帖子页面和列表页面按一个url对应一台squid的策略,分布到各台squid上,并提供了一台或一组backup的squid,个别squid出现异常时将自动使用backup的机器继续提供一段时间的服务直到其正常。在这样的架构下,purge就不再是关键问题,因为一个url只会对应到一台机器上,所以purge的时候,后端app_server找到对应的机器就可以了。
可以看到在前端中还有一台nginx(purge)的机器,这台机器是专用于purge的,只要发送purge指令和需要清除的url到这台机器,就可以找到相应的服务器并清除缓存了。另外,purge时还需要清理backup机器上的缓存,所以无论前端机器增加到多少,purge指令只会在2台机器上执行,如果backup机器使用到2-3台,purge指令就会在3-4台机器上执行,仍然在可接受范围之内。
nginx作为前端,另有的好处:
1.使用nginx的日志统计点击量非常方便
2.nginx也可作为缓存,一般可以直接负责favicon.ico和logo等固定的小图片

基于nginx的中层代理
BBS架构
前端的lvs和squid,按照安装方法,把epoll打开,配置文件照搬,基本上问题不多。

这个架构和app_squid架构的区别,也是关键点就是:加入了一级中层代理,中层代理的好处实在太多了:
1、gzip压缩
压缩可以通过nginx做,这样,后台应用服务器不管是apache、resin、lighttpd甚至iis或其他古怪服务器,都不用考虑压缩的功能问题。
2、负载均衡和故障屏蔽
nginx可以作为负载均衡代理使用,并有故障屏蔽功能,这样,根据目录甚至一个正则表达式来制定负载均衡策略变成了小case。
3、方便的运维管理,在各种情况下可以灵活制订方案。
例如,如果有人用轻量级的ddos穿透squid进行攻击,可以在中层代理想办法处理掉;访问量和后台负载突变时,可以随时把一个域名或一个目录的请求扔入二级cache服务器;可以很容易地控制no-cache和expires等header。等等功能。。。
4、权限清晰
这台机器就是不写程序的维护人员负责,程序员一般不需要管理这台机器,这样假如出现故障,很容易能找到正确的人。
对于应用服务器和数据库服务器,最好是从维护人员的视线中消失,我的目标是,这些服务只要能跑得起来就可以了,其它的事情全部可以在外部处理掉。
在这个架构中,假如后端的app_server上把帖子页和列表页直接生成了静态页面,那么使用中层代理再做一次url_hash,将可以解决后端app_server的硬盘容量的压力,但是如果使用到url_hash的话,那做容错就相对麻烦了。所以建议不要采用生成静态页的方式,后端的压力一般不会非常的大,所以没有必要生成静态页。假如前端squid的命中率实在太低下,造成大量穿透,可以考虑使用二级代理暂顶。
5、基于LVS的数据库双机热备
在这个架构中,因为大量的并发和访问量都由前端的缓存处理掉了,所以后端的mysql主要压力来自于数据的写入,所以压力并不是非常大,并且负载比较稳定,一般不会随着访问量上升而提高过快,估计目前一台64位的机器,加满内存并使用高速的硬盘,前端负载数亿访问量时数据库都不会出现性能问题。在数据库这方面应主要考虑故障恢复,因为数据库崩溃的话,按照一般使用备份恢复的做法,耗时很长而且难免丢失数据,是很棘手的问题。使用双机热备的方案,出现故障时首先可由一台时刻同步着的备用数据库即刻充当主数据库,然后卸下的数据库可以有充分的时间对其进行维修,所以是个很安全有效的办法。
当然,数据库的优化还是要细心做的
细心地调一遍,性能会好很多。
6、图片服务器
图片服务器我在这个架构中没有特别详细的介绍,在大型的bbs系统下,图片常常会出现容灾现象——图片数量严重超过了单台前端服务器容纳能力,导致前端服务器命中率低下。处理容灾问题也是非常棘手的,往后会有更详细的介绍。
7、简单的点击量统计办法
1.使用js的script标签访问另一(台)组服务器的空文件,然后定期向数据库更新
2.在前端的nginx上直接开启日志功能,按需要统计点击量的链接规则进行记录,然后定期更新数据库

gentoo上面的nagios + nginx配置

Standard
#基础支持 gcc glibc glibc-common gd gd-devel
useradd -m nagios #添加一个名为nagios的用户用以专门跑nagios           
passwd nagios   #设置密码
groupadd nagcmd #添加nagcmd用户组,用以通过web页面提交外部控制命令
usermod -a -G nagcmd nagios #将nagios用户加入nagcmd组
usermod -a -G nagcmd nginx #将nginx用户加入nagcmd组
 
wget http://prdownloads.sourceforge.net/sourceforge/nagios/nagios-3.2.0.tar.gz
wget http://prdownloads.sourceforge.net/sourceforge/nagiosplug/nagios-plugins-1.4.13.tar.gz
wget http://prdownloads.sourceforge.net/sourceforge/nagios/nrpe-2.12.tar.gz
wget http://nagios.manubulon.com/nagios-snmp-plugins.1.1.1.tgz
tar zxvf nagios-3.2.0.tar.gz
tar zxvf nagios-plugins-1.4.13.tar.gz
tar zxvf nagios-snmp-plugins.1.1.1.tgz
 
cd nagios-3.2.0
./configure --with-command-group=nagcmd
make all
make install
make install-init
make install-config
make install-commandmode
这时nagios本身已基本安装完成
vi /usr/local/nagios/etc/objects/contacts.cfg #修改nagiosadmin这行其中的邮件地址为你的email地址,以将报警邮件发到你的邮箱
#make install-webconf #安装nagios的web接口
#htpasswd -c /usr/local/nagios/etc/htpasswd.users nagiosadmin
#设置登陆web界面时HTTP验证的账号密码
#因为我是用nginx,所以上面三行不执行,自己手工改nginx配置
 
cd ..
cd nagios-plugins-1.4.13
./configure --with-nagios-user=nagios --with-nagios-group=nagios
make
make install
 
cd ..
cd nagios_plugins
#安装perl所用组件
perl -MCPAN -e shell
cpan> install Net::SNMP
./install.sh #一路回车
 
#nagios全套安装完毕
/usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg #检测nagios的配置是否正确
 
/etc/init.d/nagios start
/etc/init.d/nginx start

nagios要用cgi-bin,关于nginx上的cgi-bin配置可参考 nginx配置cgi-bin运行perl

转载请注明出处: http://yemaosheng.com

nginx配置cgi-bin运行perl

Standard

系统装的是Gentoo
实际上在gentoo上面如果用apache的话那装nagios是相当方便的,但我就是想把nagios装在nginx上面没办法^_^

wget http://www.nginx.eu/nginx-fcgi/nginx-fcgi.txt
mv nginx-fcgi.txt nginx-fcgi.pl
mv nginx-fcgi.pl /usr/bin/
chmod 777 /usr/bin/nginx-fcgi.pl
 
perl -MCPAN -e shell
cpan> install FCGI
cpan> install IO::All
cpan> install Socket
 
nginx-fcgi.pl -l /tmp/nginx-fcgi.log -pid /tmp/nginx-fcgi.pid -S /tmp/nginx-fcgi.sock
chmod 777 /tmp/nginx-fcgi.*
 
vi /etc/nginx/vhosts/nagios.conf
server
{
  listen       80;
  server_name  nagios.yemaosheng.com;
  index index.php index.html index.htm;
  root  /usr/local/nagios/share;
  location ~ .*\.php?$
  {
    fastcgi_pass    127.0.0.1:9000;
    fastcgi_index   index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME /usr/local/nagios/share$fastcgi_script_name;
  }
  location /nagios/
  {
    gzip off;
    alias /usr/local/nagios/share/;
    index index.html index.htm index.php;
  }
  location ~ \.cgi$ {
     rewrite ^/nagios/cgi-bin/(.*)\.cgi /$1.cgi break;
     fastcgi_pass unix:/tmp/nginx-fcgi.sock;
     fastcgi_index index.cgi;
     fastcgi_param SCRIPT_FILENAME /usr/local/nagios/sbin$fastcgi_script_name;
     fastcgi_param HTTP_ACCEPT_LANGUAGE en_US;
     include fastcgi_params;
  }
  location ~ \.pl$ {
     fastcgi_pass  unix:/tmp/nginx-fcgi.sock;
     fastcgi_index index.pl;
     fastcgi_param SCRIPT_FILENAME  /usr/local/nagios/sbin$fastcgi_script_name;
     include /etc/nginx/fastcgi_params;
  }
}

转载请注明出处: http://yemaosheng.com

Gentoo emerge安装nginx+php+mysql

Standard
yemaosheng.com # nano /etc/portage/package.use
dev-lang/php cli cgi ctype mysql mysqli mssql pdo gd curl xml hash json soap sockets snmp
www-servers/nginx fastcgi ssl status
media-gfx/imagemagick jpeg png
yemaosheng.com # nano /etc/portage/package.keywords
www-servers/spawn-fcgi ~x86
dev-php5/pecl-memcache ~x86
 
yemaosheng.com # emerge php nginx spawn-fcgi
 
yemaosheng.com # nano /etc/nginx/nginx.conf
  http {
        ...
        ...
        fastcgi_connect_timeout 300;
        fastcgi_send_timeout 300;
        fastcgi_read_timeout 300;
        fastcgi_buffer_size 64k;
        fastcgi_buffers 4 64k;
        fastcgi_busy_buffers_size 128k;
        fastcgi_temp_file_write_size 128k;
        ...
        ...
        server {
                listen          80;
                server_name     localhost;
 
                #access_log     /var/log/nginx/localhost.access_log main;
                #error_log      /var/log/nginx/localhost.error_log info;
 
                root /var/www/localhost/htdocs;
                index index.php index.html;
 
                location ~\.php$ {
                        fastcgi_pass    127.0.0.1:9000;
                        fastcgi_index   index.php;
                        include fastcgi_params;
                        fastcgi_param SCRIPT_FILENAME /var/www/localhost/htdocs$fastcgi_script_name;
                }
        }
  }
 
yemaosheng.com # spawn-fcgi -a 127.0.0.1 -p 9000 -C 5 -u nobody -g nobody -f /usr/bin/php-cgi
yemaosheng.com # /etc/init.d/nginx start
yemaosheng.com # emerge mysql
yemaosheng.com # ebuild /var/db/pkg/dev-db/mysql-5.0.70-r1/mysql-5.0.70-r1.ebuild config
yemaosheng.com # /etc/init.d/mysql start
yemaosheng.com # nano /etc/conf.d/local.start
/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -C 5 -u nobody -g nobody -f /usr/bin/php-cgi
yemaosheng.com # rc-update add nginx default
yemaosheng.com # rc-update add mysql default

ps:
APC Memcache Imagick之类的PHP扩展存放在/usr/portage/dev-php5/目录下.
可直接 emerge pecl-apc pecl-imagick pecl-memcache 进行安装.

nginx下的Zend Framework转跳配置

Standard
        location / {
          fastcgi_pass          127.0.0.1:1026;
          fastcgi_index         index.php;
          include               fastcgi.conf;
 
          index index.php;
 
          if (!-e $request_filename) {
            rewrite  ^/(.*)$  /index.php?q=$1  last;
            break;
          }
        }
 
        location ~ "\.(js|ico|gif|jpg|png|css)$" {
           expires 1w;
        }

Nginx proxy_pass 反向代理

Standard

vi conf/nginx.conf
http{


include vhosts/yemaosheng_com/*.conf;
}

vi conf/vhosts/yemaosheng_com/www.conf

upstream  www_yemaosheng_com  {
  ip_hash;
  server   202.0.0.1:80;
  server   202.0.0.2:80;
  server   202.0.0.3:80;
}
server {
  listen 80;
  server_name www.yemaosheng.com;
  access_log  off;
  location / {
    proxy_pass http://www_yemaosheng_com
    proxy_redirect off;
    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 50m;
    client_body_buffer_size 256k;
    proxy_connect_timeout 30;
    proxy_send_timeout 30;
    proxy_read_timeout 60;
    proxy_buffer_size 16k;
    proxy_buffers 4 32k;
    proxy_busy_buffers_size 64k;
    proxy_temp_file_write_size 64k;
  }
  # deny access to .htaccess files
  location ~ /\.ht {
    deny  all;
  }
}