当前位置:  操作系统/服务器>linux
本页文章导读:
    ▪nginx的反向代理配置与优化      介绍: 由于服务器apache抗不住目前的并发,加上前端squid配置后,问题依然无法解决。而页面程序大部分是动态,无法使用fastcgi来处理。 因此考虑使用nginx作为反向代理apache。 考虑高并发.........
    ▪nginx禁止IP访问及未绑定的域名跳转的配置方法      需求: 在Nginx上设置禁止通过IP访问服务器,只能通过域名访问。 注意:默认情况下,nginx中的虚拟主机是允许用户通过IP访问,或者通过未设置的域名访问的。 关键一点是在server的设置里.........
    ▪nginx的五种缓存方式介绍      1、传统缓存之一(404) 这个办法是把nginx的404错误定向到后端,然后用proxy_store把后端返回的页面保存。 配置:   代码如下: location / { root /home/html/;#主目录 expires 1d;#网页的过期时间 error.........

[1]nginx的反向代理配置与优化
    来源: 互联网  发布时间: 2013-12-24

介绍:
由于服务器apache抗不住目前的并发,加上前端squid配置后,问题依然无法解决。而页面程序大部分是动态,无法使用fastcgi来处理。
因此考虑使用nginx作为反向代理apache。

考虑高并发的情况,安装前做了些优化,目前配置能抗住3000以上的并发。

问题:还有少量499问题。
 
第1部分:安装
1 建立用户及组
 

代码如下:
/usr/sbin/groupadd www
/usr/sbin/useradd -g www www

2 安装pcre 让nginx支持rewrite 方便以后所需
 

代码如下:
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-7.8.tar.gz
tar zxvf pcre-7.8.tar.gz
cd pcre-7.8/
./configure
make && make install

3 安装nginx
 

代码如下:
wget http://sysoev.ru/nginx/nginx-0.7.58.tar.gz
tar zxvf nginx-0.7.58.tar.gz
cd nginx-0.7.58/
./configure --user=www --group=www --prefix=/usr/local/webserver/nginx --with-http_stub_status_module --with-http_ssl_module --with-cc-opt='-O2' --with-cpu-opt=opteron
make && make install

#注意上文中的--with-cc-opt='-O2' --with-cpu-opt=opteron 这是编译器优化,目前最常用的是-02 而不是3.后面对应CPU的型号,可参照:http://wiki.gentoo.tw/index.php/HOWTO_CFLAG

第2部分:配置及优化配置文件
1 nginx.conf 配置文件:
 

代码如下:

user    www www;
worker_processes 4;

# [ debug | info | notice | warn | error | crit ]
error_log    /usr/local/webserver/nginx/logs/nginx_error.log    crit;
pid                /usr/local/webserver/nginx/nginx.pid;
#Specifies the value for maximum file descriptors that can be opened by this process.
worker_rlimit_nofile 51200;
events
{
   use epoll;
   worker_connections 51200;
}

http
{
   include        mime.types;
   default_type    application/octet-stream;
   source_charset GB2312;
   server_names_hash_bucket_size 256;
   client_header_buffer_size 256k;
   large_client_header_buffers 4 256k;

   #size limits
   client_max_body_size             50m;
   client_body_buffer_size        256k;
   client_header_timeout     3m;
   client_body_timeout 3m;
   send_timeout             3m;
#参数都有所调整.目的是解决代理过程中出现的一些502 499错误    
   sendfile on;
   tcp_nopush         on;
   keepalive_timeout 120; #参数加大,以解决做代理时502错误
   tcp_nodelay on;
       
   include     vhosts/upstream.conf;
   include     vhosts/bbs.xxx.conf;
}

2 upstream.conf 配置文件(这也是做负载的配置方法)
upstream.conf
 

代码如下:
upstream bbs. {
    server 192.168.1.4:8099;
 }

3 站点配置文件
bbs.xxx.conf
 

代码如下:

server
     {
            listen             80;
            server_name    bbs.xxx.conf;
            charset GB2312;
            index index.html index.htm;
            root    /date/wwwroot/xxx/;

                location ~ ^/NginxStatus/ {
       stub_status on;
       access_log off;
}

         location / {
             root    /date/wwwroot/xxx/;
             proxy_redirect off ;
             proxy_set_header Host $host;
             proxy_set_header X-Real-IP $remote_addr;
             proxy_set_header REMOTE-HOST $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 256k;
             proxy_buffers 4 256k;
             proxy_busy_buffers_size 256k;
             proxy_temp_file_write_size 256k;
             proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
             proxy_max_temp_file_size 128m;
             proxy_pass    http://bbs.;
            }

#参数都有所调整.目的是解决代理过程中出现的一些502 499错误   
 

代码如下:

#Add expires header for static content
     location ~* \.(jpg|jpeg|gif|png|swf)$ {
         if (-f $request_filename) {
             root /date/wwwroot/xxx/;
             expires            1d;
             break;
            }
     }

         log_format    access    '$remote_addr - $remote_user [$time_local] "$request" '
               '$status $body_bytes_sent "$http_referer" '
               '"$http_user_agent" $http_x_forwarded_for';
        access_log    /exp/nginxlogs/bbs.xxx_access.log    access;
}

注:第二种代理方式
nginx 处理下图片,html等静态的东西.其它动态由apache处理.因此apache也需要做一些参数调整.
设置图片等过期时间.缓解请求.

如果源与nginx在同一台机器建议使用如下方法:
 

代码如下:
location / {
           proxy_pass    http://192.168.1.4:8099/;
           proxy_redirect default ;
}

针对不同的目录进行代理把下面的配置放到根目录代理的上面
 

代码如下:
location /xxx/ {
           proxy_pass    http://192.168.1.4:8099/xxx/;
           proxy_redirect default ;
}

4 源配置
 

代码如下:
<VirtualHost 192.168.1.4:8099>
        ServerAdmin liuyu105#gmail.com
        DocumentRoot /date/wwwroot/xxx
        ServerName bbs.
        ErrorLog logs/xxx_error_log
     CustomLog "|/usr/local/sbin/cronolog logs/xxx_access_log.%Y%m%d" combined
</VirtualHost>
 

 
第3部分:源的优化
1 apache-mpm.conf
 

代码如下:
<IfModule mpm_prefork_module>
        StartServers   15
        MinSpareServers             15
        MaxSpareServers            30
        ServerLimit2536
        MaxClients   2048
        MaxRequestsPerChild     1500
</IfModule>

2 apache-keepalive
 

代码如下:
Timeout 120   #与nginx的保持一至
KeepAlive On
MaxKeepAliveRequests 400
KeepAliveTimeout 7

第4部分:PHP的优化
优化一:将PHP由之前的xcache换成eaccelerator
1 安装
 

代码如下:
wget http://bart.eaccelerator.net/source/0.9.5.3/eaccelerator-0.9.5.3.tar.bz2
tar jxvf eaccelerator-0.9.5.3.tar.bz2
cd eaccelerator-0.9.5.3/
/usr/local/webserver/php/bin/phpize
./configure --enable-eaccelerator=shared --with-php-config=/usr/local/php5/bin/php-config
make
make install

注:PHP路径以安装为准!

2 配置
 

代码如下:
sed -i 's#extension_dir = "./"#extension_dir = "/usr/local/php5/lib/php/extensions/no-debug-non-zts-20060613/"\nextension = "memcache.so"\n#' /etc/php.ini
sed -i 's#output_buffering = Off#output_buffering = On#' /etc/php.ini
sed -i "s#; always_populate_raw_post_data = On#always_populate_raw_post_data = On#g" /etc/php.ini

配置eAccelerator加速PHP:
mkdir -p /usr/local/webserver/eaccelerator_cache
vi /etc/php.ini

按shift+g键跳到配置文件的最末尾,加上以下配置信息:
 

代码如下:
[eaccelerator]
zend_extension="/usr/local/php5/lib/php/extensions/no-debug-non-zts-20060613/eaccelerator.so"
eaccelerator.shm_size="128"
eaccelerator.cache_dir="/usr/local/webserver/eaccelerator_cache"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="300"
eaccelerator.shm_prune_period="120"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"

优化二:联系开发重新编译php减少php的模块.以减少php进程所占用内存数.这块尽管影响不大,但也有一定的作用.编译前也可以参照nginx的编译器优化方式安装.

第5部分:测试并启动nginx
 

代码如下:
ulimit -SHn 51200
/usr/local/webserver/nginx/sbin/nginx -t
/usr/local/webserver/nginx/sbin/nginx

第6部分:nginx日志切割脚本
 

代码如下:

#!/bin/bash
# This script run at 00:00

# The Nginx logs path
logs_path="/exp/nginxlogs/"

mkdir -p ${logs_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/
mv ${logs_path}bbs.xxx_access.log ${logs_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/bbs.xxx_access_$(date -d "yesterday" +"%Y%m%d").log
kill -USR1 `cat /usr/local/webserver/nginx/nginx.pid`

crontab -e
00 00 * * * /bin/bash    /usr/local/webserver/nginx/sbin/cut_nginx_log.sh

原文作者:seven
原文链接:http://liuyu.blog.51cto.com/183345/166381

您可能感兴趣的文章:
Nginx负载均衡与反向代理的例子(图文)
Nginx Proxy 代理配置图片缓存的实例参考
nginx正向代理配置简单一例
nginx反向代理配置简单示例
学习Nginx反向代理实现简单负载均衡(图文)
nginx缓存html静态文件 解析php及反向代理IIS的配置
nginx中配置proxy正向代理
Nginx实现简单的反向代理
nginx创建反向代理和虚拟主机的例子
nginx反向代理与varnish缓存配置
nginx反向代理与负载均衡
Nginx 反向代理的小例子
nginx反向代理与缓存详解
nginx反向代理配置一例
Nginx反向代理Nginx
nginx反向代理配置和优化
Nginx Proxy代理和图片缓存配置
nginx配置反向代理的简单示例


    
[2]nginx禁止IP访问及未绑定的域名跳转的配置方法
    来源: 互联网  发布时间: 2013-12-24

需求:
在Nginx上设置禁止通过IP访问服务器,只能通过域名访问。

注意:默认情况下,nginx中的虚拟主机是允许用户通过IP访问,或者通过未设置的域名访问的。

关键一点是在server的设置里添加一行:
listen 80 default;

后面的default参数表示这个是默认虚拟主机。此设置很有用。
假如有人通过ip或者未知域名访问你的网站的时候,你希望禁止显示任何有效内容,可以给他返回500。
目前国内很多机房都要求网站主关闭空主机头,防止未备案的域名指向过来造成麻烦,则可以这样设置:
 

代码如下:
server {
listen 80 default;
return 500;
}

也可以把这些流量收集起来,导入到自己的网站,只要做以下跳转设置就可以:
 

代码如下:
server {
listen 80 default;
rewrite ^(.*) http://www. permanent;
}
 

按照如上设置后,确实不能通过IP访问服务器了,但是在应该用中出现当server_name后跟多个域名时,其中一个域名怎么都无法访问。设置如下:
 

代码如下:
server
{
listen 80;
server_name www.
}


没更改之前,通过server_name 中的www. 均可访问服务器,加入禁止IP访问的设置后,通过无法访问服务器了,www.可以访问

用 nginx -t 检测配置文件会提示warning:
[warn]: conflicting server name “” on 0.0.0.0:80, ignored
the configuration file /usr/local/webserver/nginx/conf/nginx.conf syntax is ok
configuration file /usr/local/webserver/nginx/conf/nginx.conf test is successful

最后,通过在listen 80 default;后再加server_name _;进行解决,形式如下:
 

代码如下:
#禁止IP访问
server
{
listen 80 default;
server_name _;
return 500;
}
 

或者
 

代码如下:
server {
listen 80 dufault;
server_name _;
rewrite ^(.*) http://www.xxx.net permanent;
}
 

这样,通过就能访问服务器了,问题解决了,但具体原因还是不清楚。

分类:Nginx 成功分享标签:301, ipNginx 设置301重定向2010年3月2日iNginx没有评论
第一种情况:访问A站定向到B站
 

代码如下:
server {
server_name www.xxx.net ;
rewrite ^(.*) http://www.$1 permanent;
}

第二种情况:不是访问A站的全部重定向到指定页面
 

代码如下:
server {
server_name www.xxx.net;
if ($host != ‘xxx.net’ ) {
rewrite ^/(.*)$ http://www./$1 permanent;
}
}

如果是写在第一个server段中,使用IP访问时也将被重定向。

您可能感兴趣的文章:
nginx下禁止直接以IP访问的方法
两个nginx小技巧(禁止以ip方式访问、禁止列出目录)
如何在nginx中配置ip直接访问的默认站点
设置nginx禁止通过IP访问服务器的方法
nginx屏蔽ip直接访问的方法
nginx禁止直接以IP访问网站的方法


    
[3]nginx的五种缓存方式介绍
    来源: 互联网  发布时间: 2013-12-24

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://www./;#后端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://www./;
}
}

可以看到这个配置比404节约了不少代码,它是用!-f来判断请求的文件在文件系统上存不存在,不存在就proxy_pass到后端,返回同样是用proxy_store保存。

两种传统缓存都有着基本一样的优点和缺点:

缺点1:不支持带参数的动态链接,比如read.php?id=1,因为nginx只保存文件名,所以这个链接只在文件系统下保存为read.php,这样用户访问read.php?id=2时会返回不正确的结果。同时不支持http://www./这种形式的首页和二级目录http://www./download/,因为nginx非常老实,会将这样的请求照链接写入文件系统,而这个链接显然是一个目录,所以保存失败。这些情况都需要写rewrite才能正确保存。
缺点2:nginx内部没有缓存过期和清理的任何机制,这些缓存的文件会永久性地保存在机器上,如果要缓存的东西非常多,那就会撑暴整个硬盘空间。为此可以使用一个shell脚本定期清理,同时可以撰写php等动态程序来做实时更新。
缺点3:只能缓存200状态码,因此后端返回301/302/404等状态码都不会缓存,假如恰好有一个访问量很大的伪静态链接被删除,那就会不停穿透导致后端承载不小压力。
缺点4:nginx不会自动选择内存或硬盘作为存储介质,一切由配置决定,当然在当前的操作系统里都会有操作系统级的文件缓存机制,所以存在硬盘上也不需要过分担心大并发读取造成的io性能问题。

nginx传统缓存的缺点也是它和squid等缓存软件的不同之特色,所以也可看作其优点。在生产应用中它常常用作和squid的搭档,squid对于带?的链接往往无法阻挡,而nginx能将其访问拦住,例如:http:///?和http:///在squid上会被当做两个链接,所以会造成两次穿透;而nginx只会保存一次,无论链接变成http:///?1还是http:///?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.1.2:11211;
    }
    expires 70;
}

这个配置会将http:///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 /path/to/cache levels=1:2 keys_zone=NAME:10m inactive=5m max_size=2m clean_time=1m;

注意这个配置是在server标签外,levels指定该缓存空间有两层hash目录,第一层目录是1个字母,第二层为2个字母,保存的文件名就会类似/path/to/cache/c/29/b7f54b2df7773722d382f4809d65029c;keys_zone为这个空间起个名字,10m指空间大小为10MB;inactive的5m指缓存默认时长5分钟;max_size的2m是指单个文件超过2m的就不缓存;clean_time指定一分钟清理一次缓存。
 

代码如下:

location / {
    proxy_pass http://www./;

    proxy_cache NAME;#使用NAME这个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版。


    
最新技术文章:
▪linux系统中的列出敏感用户的脚本代码
▪a10 config backup for aXAPI
▪一键备份gitolite服务器的Shell脚本
▪nagios 分发文件实现代码
▪阿里云云服务器Linux系统更新yum源Shell脚本
▪一个监控LINUX目录和文件变化的Shell脚本分享
▪Linux下实现SSH免密码登录和实现秘钥的管理、...
▪Shell正则表达式之grep、sed、awk实操笔记
▪3个备份系统文件并邮件发送的Shell脚本分享
▪CentOS 6.3下给PHP添加mssql扩展模块教程
▪监控网站是否可以正常打开的Shell脚本分享
▪shell脚本编程之if语句学习笔记
▪shell脚本编程之循环语句学习笔记
▪shell脚本编程之case语句学习笔记
▪Shell脚本实现的阳历转农历代码分享
▪Shell脚本实现复制文件到多台服务器的代码分...
▪Shell脚本实现批量下载网络图片代码分享
▪Shell脚本实现检测文件是否被修改过代码分享
▪Shell脚本数组用法小结
▪Shell脚本批量重命名文件后缀的3种实现
▪C语言实现的ls命令源码分享
▪Linux下查找后门程序 CentOS 查后门程序的shell脚...
▪Shell 函数参数
▪linux shell 自定义函数方法(定义、返回值、变...
▪Shell实现判断进程是否存在并重新启动脚本分...
▪Shell脚本break和continue命令简明教程
▪Shell脚本函数定义和函数参数
▪让代码整洁、过程清晰的BASH Shell编程技巧
▪shell常用重定向实例讲解
▪awk中RS、ORS、FS、OFS的区别和联系小结
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3