郭灿的博客-运维技术交流

分享运维的点点滴滴


  • Cpanel 上 Varnish + Apache 让Apache获得获取正确的客户端IP地址

    一.下载apache的第三方模块 mod_rpaf
    下载地址:http://stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz

    https://github.com/y-ken/mod_rpaf

    https://github.com/y-ken/mod_rpaf/archive/master.zip

    二.安装

    unzip master.zip
    /usr/local/apache/bin/apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c
    cp /usr/local/apache/modules/mod_rpaf-2.0.so /usr/local/apache.bak/modules

    三.在Cpanel里面设置
    1 登陆Cpanel
    2 选择 Service Configuration
    3 选择 Apache Configuration
    4 选择 Include Editor
    5 选择 Pre Main Include
    6 选择正在运行的apache版本,然后自定义配置写进里面,例如rpaf_module

    LoadModule rpaf_module /usr/local/apache.backup/modules/mod_rpaf-2.0.so
    RPAFenable On
    RPAFsethostname On
    RPAFproxy_ips 多个真实的IP地址
    RPAFheader X-Forwarded-For

    四.重启apache

    五.测试
    vi test.php


    浏览器访问http://www.safexjt.com/test.php


  • varnish turpentine 加速 magento的具体方法

    环境:
    Centos6 64bit
    Magento 1.7
    PHP5.3
    Apache2.x
    cnanel
    Mysql5.x
    varnish3.0

    相关文档

    http://blog.nexcess.net/2012/05/21/installing-varnish-for-your-magento-store-on-centos-6/

    https://github.com/nexcess/magento-turpentine/wiki/Installation

    一。安装Varnish(rpm包安装)
    rpm –nosignature -i http://repo.varnish-cache.org/redhat/varnish-3.0/el6/noarch/varnish-release/varnish-release-3.0-1.el6.noarch.rpm
    yum install varnish -y

    二。修改varnish的相关配置
    默认配置文件
    /etc/sysconfig/varnish
    /etc/varnish/default.vcl
    /etc/varnish/secret 验证密码文件
    varnish默认端口 6081

    需要注意的是secret密码文件默认包含”\n”换行符,echo /etc/varnish/secret的时候会换行
    解决方法
    mv secret secret.bak
    cat secret.bak|tr -d ‘\n’

    varnishlog 观察varnish日志
    varnishadmin 登录varnish 后台
    telnet 127.0.0.1 6081也可以

    三。安装magento插件,通过手动上传
    Step 2: Install Nexcess Turpentine
    You can use the Magento Admin to install this extension, which can be found on Magento Connect. I prefer to use the “mage” command line tool. Note: detailed installation docs can be found on our github site.

    1
    $ ./mage install connect20.magentocommerce.com/community Nexcessnet_Turpentine
    The exension will be installed under “app/code/community/Nexcessnet/Turpentine/”. As mentioned, the configuration VCL is automatically generated by the Turpentine extension, so we don’t need to worry about editing it manually.

    Step 3: Configure Varnish

    四。正式配置varnish 配置文件

    编辑/etc/sysconfig/varnish
    修改一下变量
    VARNISH_STORAGE_SIZE=2G
    VARNISH_LISTEN_PORT=8080 生产vcl后我们再改过来
    VARNISH_STORAGE=”malloc,${VARNISH_STORAGE_SIZE}”

    添加 -p esi_syntax=0×2 -p cli_buffer=16384 到 DAEMON_OPTS

    service varnish start 启动varnish

    五。登录magento后台

    Log in to the Magento Admin and go to System->Configuration. Then under “Turpentine” click on “Varnish Options”.

    Backend Host 输入网站的ip
    Backend Port 输入网站的端口 我们这里输入 8080
    ServerList这里填写127.0.0.1:自己定义的端口
    Varnish Authentication Key 这里填写/etc/varnish/serret的内容

    修改web服务器端口,我们环境是cpanel

    六。修改cpanel配置文件,更改web端口为8080
    配置文件路径
    /var/cpanel/cpanel.conf
    apache_port=0.0.0.0:8080

    /usr/local/cpanel/whostmgr/bin/whostmgr2 –updatetweaksettings 这条命令让更改生效

    七。修改varnish的端口为80,重新启动varnish服务

    八。一台服务器上多个站定

    varnishd进程可以启动很多实例,以不同的管理端口,不同的服务端口
    建立一个针对每个站点的脚本,放到/etc/init.d下面,这样就可以使用 service xxx start|stop|restart

    #!/bin/bash
    name=`basename $0`
    address=x.x.x.x
    v_port=80
    webroot=/data/wwwroot/safexjt.com
    admin_port=3500
    varnish=/usr/sbin/varnishd

    function start()
    {

    if [ -f $webroot/var/default.vcl ]
    then
    $varnish -a $address:$v_port -S /etc/varnish/secret -T 127.0.0.1:$admin_port -f $webroot/var/default.vcl -P /etc/varnish/$name -s malloc,2G -p esi_syntax=0×2 -p cli_buffer=16384
    else
    $varnish -a $address:$v_port -S /etc/varnish/secret -T 127.0.0.1:$admin_port -f /etc/varnish/default.vcl -P /etc/varnish/$name -s malloc,2G -p esi_syntax=0×2 -p cli_buffer=16384
    echo “Start varnish service with default vcl temporary”
    fi
    }

    function stop()
    {
    if [ -f "/etc/varnish/$name" ]
    then
    kill `tail /etc/varnish/$name`
    [ $? -eq 0 ] && echo “Successful terminate varnish grame for $name”
    else
    echo “Did you sure your varnish is running”
    fi
    }

    function restart()
    { stop
    start
    }

    case $1 in
    start)
    start
    ;;
    stop)
    stop
    ;;
    restart)
    stop
    start
    ;;
    *)
    echo “Usage:service $name start|stop|restart”
    esac
    exit 0


  • 视频站nginx url rewrite的几个实例

    我们利用nginx的指令实现对url的rewrite,以及把参数交给PHP,这样的URL比较友好,方便记忆
    1.房间地址http://www.6.cn/201052
    2.支付地址 http://www.6.cn/pay
    3.游戏 http://www.6.cn/play/game?gid=1
    4.TAG http://www.6.cn/tag/rooms?tag=辣妹子

    nginx配置
    location / {
    rewrite ^/([0-9][0-9][0-9][0-9][0-9][0-9])$ /room/index.php?id=$1;
    rewrite ^/(pay)$ /pay.php;
    rewrite ^/play/game$ /game/index.php?$query_string;
    rewrite ^/tag/rooms$ /tag.php?$query_string;
    }

    以下是测试脚本
    /room/index.php

    /pay.php
    echo “This is payment page!”.”
    “.”Current PHP Version is “.phpversion();
    ?>

    /game/index.php

    /tag.php


  • rsync+inotify实时同步web文件

    前面讨论过nginx与tomcat整合,静态资源(jpg,gif,png,css,js,flv,mp4,rmvb,rar,zip,pdf等)交给nginx进行处理,动态部分(jsp)和html交给nginx进行处理,如果不使用伪静态,

    html也可以交给nginx进行处理.我们这片文章同时适用于CMS,一台运行php,进行内容发布,生成html.这样我们可以把动态的部分交给一台php+mysql进行处理.把静态资源同步到

    几台nginx上,让nginx去处理.

    测试环境:

    vm1 nginx1.5 192.168.196.128 rsync daemon 反向代理服务器 根目录/data/htdocs

    vm2 omcat6 192.168.196.129 rsync client,inotify 应用服务器 app目录/etc/tomcat6/webapps

    我们这里要做的就是把vm2上的/etc/tomcat6/webapps 实时同步到vm1上/data/htdocs目录

    一.rsync服务端 安装,配置

    #yum install rsync -y

    #rpm -qa|xinetd || yum install xinetd -y xinetd 是rsyncd的守护进程

    启用rsyncd服务

    vi /etc/xinetd.d/rsync

    #disable = yes 改为 disable = no

    设置rsync为开启自启动

    chkconfig xinetd on

    编译rsyncd.conf配置文件

    vi /etc/rsyncd.conf

    uid = nobody #rsync执行用户和组,请把我的注释去掉

    gid = nobody

    use chroot = no

    max connections = 10 #rsyncd服务使用socket传输,最大客户端连接数10

    strict modes = yes

    pid file = /var/run/rsyncd.pid

    lock file = /var/run/rsync.lock

    log file = /var/log/rsyncd.log

    [htdocs] #模块名称 htdocs

    path=/data/htdocs #文件夹路径

    comment=www data file

    ignore errors

    read only = no

    write only = no

    hosts allow = * #允许的客户端主机地址,安全考虑,只允许安全的客户端进行连接

    list = false

    uid = root #这里使用root可以防止一些权限问题

    gid = root

    auth users = rsync #此模块的认证用户是 rsync

    secrets file = /etc/server.pass #此模块的密码文件

    设置密码文件

    vi /etc/server.pass

    rsync:jack #格式 账号:密码

    #chmod 400

    重启rsync服务

    #service xinetd restat

    查看rsync日志

    tail /var/log/rsync.log

    二.rsync客户端安装配置

    #yum install rsync -y

    #vi /etc/rsync.password

    jack

    #chmod 400 /etc/rsync.password

    测试与服务端的同步

    #vi rsync.sh

    rsync -vzrtopg –delete –progress /etc/tomcat6/webapps/ rsync@192.168.196.128::htdocs –password-file=/etc/rsync.password

    #chmod u+x rsync.sh

    #./rsync.sh

    注意我们写的目录/etc/tomcat6/webapps/一定要带 “/”,如果写成/etc/tomcat6/webapps就会把webapps这个目录同步到vm1上的/data/htdocs/webapps.

    而我们要做的是吧vm2中webapps下的所有文件同步到/data/htdocs/下面.我犯过这样的错误!

    三.inotify-tools 安装配置

    下载地址 https://github.com/rvoicilas/inotify-tools/archive/master.zip

    #yum groupinstall “Development Tools” “Development Libraries” -y

    #yum isntall unzip -y

    #unzip notify-tools-master

    #cd notify-tools-master

    #./autogen.sh

    #./configure

    #make

    #make install

    建立inotify同步脚本

    vi /usr/local/src/inotify.sh

    #/bin/bash

    PATH=/usr/local/bin:/usr/bin:/bin

    src=/etc/tomcat6/webapps/

    host=192.168.196.128

    user=rsync

    dst=htdocs

    inotifywait -mrq –timefmt ‘%d/%m/%y %H:%M’ –format ‘%T %s%f%e’ -e modify,delete,create,attrib $src \

    |while read files

    do

    rsync -vzrtopg –delete –progress –password-file=/etc/rsync.password $src $user@$host::$dst

    done

    #chmod u+x inotify.sh

    启动intofy脚本

    #/usr/local/src/inotify.sh &

    #注意,这里使用 “&” 是后台启动,root注销后,进程仍然在后台运行

    放到开机启动项里面

    vi /etc/rc.local

    /usr/local/src/inotify.sh &


  • nginx负载均衡的两种方法–加权轮询和ip_hash

        在访问量比较大时,web服务器可能会性能出现瓶颈,因此我们会采用web负载均衡的方式,多加几台后端服务器以提升整个网站的并发.
    如图,是常用的web集群拓扑.图中最前端的是nginx负载均衡器,它可以和所有的web服务器都在局域网内,在网关上使用硬防保护服务器不受到攻击
    ,并且把80端口映射到nginx负载均衡器上.也可以nginx负载均衡器和web服务器都放在公网上,都有公网ip,最好是在一个机房,这样会快一些.如
    何防止cc,ddos攻击等,我们这里就不讨论了.
    nginx反向代理图

    nginx为后端web服务器(apache,nginx,tomcat,weblogic)等做反向代理

        几台后端web服务器需要考虑文件共享,数据库共享,session共享问题.文件共享可以使用nfs,共享存储(fc,ip存储都行)+redhat GFS集群文件系
    统,rsync+inotify文件同步等.小规模的集群中使用更多的是nfs.对于内容管理系统,单台进行发布信息,向多台同步使用rsync+inotify就是个不错的选择.
        小规模集群,单台高性能数据库(如志强双四核,32/64/128G内存)即可,大规模集群可能要考虑数据库集群了,可以使用mysql官方提供的集群软件,也
    可以使用keepalived+lvs读写分离做Mysql集群.
        session共享问题是一个大问题,如果nginx采用ip_hash的轮询方法,每个ip在一定时间内会被固定的后端服务器,这样我们不用解决session共享问题.反之,
    一个ip的请求被轮询分发到多台服务器上,就要解决session共享的问题,可以使用nfs共享session,把session写入mysql或者memcache等方法,当机器规模比较大
    时,一般使用把session写入memcache里面.
    
       后端的web服务器如何配置我们这里就不讨论了,后端服务器可能是apache,nginx,tomcat,lighthttp等,前端不关心后端到底是什么.
    首先新建一个proxy.conf文件,方便后面我们进行调用(配置多个集群的话,把公共参数写到一个文件,然后继续include是不错的方法)
    vi /usr/local/nginx/conf/proxy.conf
    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_body_buffer_size 90;
    proxy_connect_timeout 90;
    proxy_read_timeout 90;
    proxy_buffer_size 4k;
    proxy_buffers 4 32k;
    proxy_busy_buffers_size 64k;
    proxy_temp_file_write_size 64
    
    我们这里讨论nginx的两种负载均衡方式 轮询加权(也可以不加权,就是1:1负载)和ip_hash(同一ip会被分配给固定的后端服务器,解决session问题)
    这个配置文件,我们可以写到nginx.conf里面(如果只有一个web集群),如果有多个web集群,最好写到vhosts里面,以虚拟主机的方式,这里我写到nginx.conf里面
    第一种配置:加权轮询,按服务器的性能给予权重,本例是1:2分配
    	upstream lb {
    
                    server 192.168.196.130 weight=1 fail_timeout=20s;
                    server 192.168.196.132 weight=2 fail_timeout=20s;
    	}
    
    	server {
                    listen 80;
                    server_name safexjt.com www.safexjt.com;
    		index index.html index.htm index.php;
    		location / {
                            proxy_pass http://lb;
    			proxy_next_upstream http_500 http_502 http_503 error timeout invalid_header;
    			include proxy.conf;
                    }
    	}
    
    第二种配置:ip_hash轮询方法,不可给服务器加权重
    
    	upstream lb {
    
                    server 192.168.196.130 fail_timeout=20s;
                    server 192.168.196.132 fail_timeout=20s;
    		ip_hash;
    	}
    
    	server {
                    listen 80;
                    server_name safexjt.com www.safexjt.com;
    		index index.html index.htm index.php;
    		location / {
                            proxy_pass http://lb;
    			proxy_next_upstream http_500 http_502 http_503 error timeout invalid_header;
    			include proxy.conf;
                    }
    	}
    
    本文简单概述nginx负载均衡,写的非常不全面,更多信息,请参考www.nginx.com

  • freebsd9源码安装nginx+php

    FreeBSD中编译软件相对比较简单,我在安装系统的时候就选中了Ports,我们通过ports下面的包进行安装.
    关于修改freebsd ports更新源这里就不叙述了.我们直入正题.
    记得在centos中编译nginx+mysql+php我们会需要很多依赖的包,库还有开发工具,都要字节解决,在freebsd中,ports会帮我解决依赖问题.
    
    首先编译安装nginx
    
    #cd /usr/ports/www/nginx
    #make   这里会弹出一个窗口,像编译Linux内核一样,让你选择需要编译的模块,对于一般的需要,我们只要支持rewrite就行了,就按默认,它一会会自动帮我们编译pcre
    成功编译后,我们进行
    #make install 进行安装
    
    编译php
    cd /usr/ports/lang/php53
    #make

    freebsd 编译php

    我们只要选中"FPM"就可以了,意思是使用fpm管理php进程,这个参数类似以往的--enable-fpm.如果php和apache结合,则选择"APACHE",作为apache模块安装,这个参数类似于--enable-so .
    #make install
    这样php的安装也就完成了.关于mysql的编译也类似,这里不再叙述.
    
    把nginx和php作为系统的服务
    #cp /usr/local/etc/rc.d/nginx /etc/rc.d
    #cp /usr/local/etc/rc.d/php-fpm /etc/rc.d
    #chmod u+x  /etc/rc.d/nginx
    #chmod u+x  /etc/rc.d/php-fpm
    修改 /etc/rc.d/php-fpm    “# Add the following line to /etc/rc.conf to enable php-fpm:”下面一行添加php_fpm_enable="YES"
    修改 /etc/rc.d/nginx  首部空闲位置添加 nginx_enable="YES"
    
    安装后,nginx和php的路径
    nginx bin: /usr/local/sbin/nginx
    nginx主 配置文件 /usr/local/etc/nginx/nginx.conf
    nginx 虚拟主机 /usr/local/etc/nginx/vhosts
    nginx html默认位置  /usr/local/www/nginx
    nginx日志默认位置   /usr/local/etc/nginx/logs
    
    php bin: /usr/local/bin/php
    php.ini /usr/local/etc/php.ini
    php-fpm.conf  /usr/local/etc/php-fpm.conf
    php-fpm: /usr/local/sbin/php-fpm
    
    更多路径,请使用whereis 名称进行查找
    freeBSD上nginx+php的使用与centos上相同,关于nginx与php的整合,配置nginx,配置优化php,这里就不再叙述了.

  • CentOS6.4 x86_64 + nginx1.5.1 + php5.5 + mysql 5.5编译安装

    系统平台 centos6.4 x86_64 Minimal 安装
    软件版本  nginx1.5.1  php5.5   mysql 5.5
    在所有的安装之前,我们需要做的事情
    vi /etc/selinux/config
    把selinux=enforce改为 selinux=disabled
    #setenforce 0  临时调整selinux 为passive
    刚刚安装不考虑iptables问题,所以我这里把防火墙给停掉
    #chkconfig iptables off
    #service iptables stop
    1.nginx篇
    首先到http://nginx.org/download/ 下载最新版nginx
    到http://vcs.pcre.org/viewvc/  下载GNU tarball
    编译pcre
    #tar -zxvf  pcre-8.30.tar.gz
    #cd pcre-8.30
    #./configure && make && make install
    由于pcre的所有库文件.so都被拷贝到/usr/local/lib里面,所以我们要把她加入到/etc/ld.so.conf
    #echo "/usr/local/lib" >>/etc/ld.so.conf
    #ldconfig
    安装nginx
    #yum install zlib-devel -y  这是它依赖的一个包
    #tar -zxvf nginx-1.5.1.tar.gz
    #cd nginx-1.5.1
    #./configure --prefix=/usr/local/nginx --with-pcre --with-http_stub_status_module --with-http_ssl_module
    make && make install
    nginx安装到此完成
    2.mysql篇(注意,我们要先安装mysql,后安装php,我们可以使用rpm包安装mysql-server,rpm包安装的话,php编译--with-mysql=/usr,mysqli=/usr/mysql_config)
    mysql老版本都是使用make进行编译,新版本使用cmake(编译出错,重新编译需删除CMakeCache.txt)
    从官网下载最新版Mysql http://downloads.mysql.com/archives.php?p=mysql-5.5&o=other
    #yum install ncurses-devel -y   mysql5.5依赖软件
    建立mysql账号和组
    #groupadd mysql
    #useradd -s /sbin/nologin -g mysql mysql
    #tar -zxvf mysql-5.5.31.tar.gz
    #cd mysql-5.5.31
    编译参数
    #cmake  -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
    -DDEFAULT_CHARSET=utf8 \
    -DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock \
    -DDEFAULT_COLLATION=utf8_general_ci \
    -DWITH_EXTRA_CHARSETS:STRING=utf8,gbk \
    -DWITH_MYISAM_STORAGE_ENGINE=1 \
    -DWITH_INNOBASE_STORAGE_ENGINE=1 \
    -DWITH_MEMORY_STORAGE_ENGINE=1 \
    -DWITH_READLINE=1 \
    -DENABLED_LOCAL_INFILE=1 \
    -DMYSQL_DATADIR=/data/mysql \
    -DMYSQL_USER=mysql
    确认无误后编译,安装
    #make && make install
    #cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
    #chmod u+x /etc/init.d/mysqld
    由于我们没有指定my.cnf配置文件路径,默认发放在/etc下面
    令我郁闷的是/etc/my.cnf中DATADIR和socket路径和我配置的不一样,我们把它改过来,把所有/var/lib替换成/data
    mysqld]
    datadir=/data/mysql
    socket=/data/mysql/mysql.sock
    user=mysql
    # Disabling symbolic-links is recommended to prevent assorted security risks
    symbolic-links=0
    
    [mysqld_safe]
    log-error=/data/mysql/log/mysqld.log
    pid-file=/data/mysql/mysqld.pid
    #mkdir -p /data/mysql/log
    #chown -R mysql:mysql /data/mysql
    #chmod -R 775 /data/mysql
    关于排错
    查看msyql日志 tail /var/log/mysql.log
    无法创建文件,可能需要手工创建文件夹
    /usr/local/mysql/bin/mysqld_safe --user=mysql 手工启动mysqld服务
    成功启动mysql后会自动创建默认数据库mysql和test
    mysql,mysqldump,mysqladmin命令不能使用,需要修改环境变量
    vi /etc/profile
    export PATH=$PATH:/usr/local/mysql/bin
    source /etc/profile
    
    关于查看mysql 信息
    #mysql
    >show engines; 查看引擎信息
    >show charset; 查看可编码
    >show variables; 查看msyql变量
    >show status;  查看mysql状态信息
    
    
    3.php篇
    到php官网 http://www.php.net/get/php-5.5.0.tar.bz2/from/a/mirror 下载最新版php
    安装php支持库
    #yum install libjpeg libjpeg-devel libpng libpng-devel curl autoconf automake libtool re2c flex bison libxml2-devel
    解压,进入php目录
    ./configure --prefix=/usr/local/php \
    --with-mysql=/usr/local/mysql \
    --with-mysqli=/usr/local/mysql/bin/mysql_config \
    --with-mysql-sock=/data/mysql/mysql.sock \
    --enable-fpm
    #make && make install
    #cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
    #chmod u+x /etc/init.d/php-fpm
    php配置文件路径 可用从phpinfo()里面获得,编译的时候 --with-config-file-path=PATH也可以指定。通过/usr/local/php/bin/php -i也可以看到php.ini的路径
    修改php.ini
    vi /usr/local/php/lib/php.ini
    取消date.timezone 注释,并修改为date.timezone = RPC
    
    
    4.nginx与php结合篇
    修改nginx默认配置文件/usr/local/nginx/conf/nginx.conf
    location ~ \.php$ {
                root           html;
                fastcgi_pass   127.0.0.1:9000;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                include        fastcgi_params;
            }
    这里html绝对路径是/usr/local/nginx/html
    $document_root 是/usr/local/nginx/html
    $fastcgi_script_name 是类似于 /index.php的名称
    #/usr/local/nginx/sbin/nginx -t 测试配置文件
    #/usr/local/nginx/sbin/nginx   启动nginx
    
    5.测试篇
    此时打开http://192.168.196.132 (我的虚拟机Ip)就能看到
    Welcome to nginx!
    
    测试php
    vi /usr/local/nginx/html/index.php
    <?php
    phpinfo();
    ?>
    
    打开http://192.168.196.132/index.php  查看是否可以看到正确的phpinfo信息
    
    测试php与Mysql的连接
    
    vi /usr/local/nginx/html/1.php
    <?php
    
    $host="localhost";
    $user="root";
    $password="";
    
    $conn = mysql_connect($host,$user,$password) or die('Could not connect: '.mysql_error());
    
    if($conn) {
            echo $user."@".$host."\tconnect successful!";
    }
    
    ?>
    
    打开http://192.168.196.132/1.php 如果页面提示 "root@localhost connect successful!"则表示与数据库连接正常,否则会报错
    
    
    小结:关于mysql密码修改  nginx连接php   配置nginx 这里就不叙述了.
    
        

  • nginx和tomcat的简单整合

    centos上nginx和tomcat的简单整合
    
    nginx可以和tomcat在同一台服务器上,公用一个web主目录,实现动静分离;它们两个也可以不在一台服务器上,nginx处理html,js,css,jpg,png,rar,gif,doc,pdf等静态资源,tomcat专门处理
    jsp动态语言.我这里测试nginx和tomcat不在一台服务器上,nginx实现对tomcat的反向代理.
    
        我的两台虚拟机都是centos6.4最小化安装.
        vm1  192.168.196.127   nginx
        vm2  192.168.196.129   tomcat
    
        1.vm1上安装nginx,首先到http://nginx.org/en/download.html 下载最先的nginx.确定你十分安装编译工具,如果没有安装,使用yum安装编译工具gcc,cc,make等.
        #yum groupinstall "Development Tools" "Development Libraries" -y
        编译安装命令
        #tar -zxvf 	nginx-1.5.1.tgz
        #cd 	nginx-1.5.1
        #./configure --with-pcre --prefix=/usr/local/nginx --with-http_stub_status_module && make && make install
        
        vm2上安装tomcat
        #yum install tomcat6 -y
    
        2. 配置tomcat,我这里只关心Host段
        vi /etc/tomcat6/server.xml
    
          <Host name="localhost"  appBase=""
                unpackWARs="true" autoDeploy="true"
                xmlValidation="false" xmlNamespaceAware="false">
            <Context path="" docBase="/etc/tomcat6/webapps/" debug="0" reloadable="true" caseSensitive="false">
            </Context>
          </Host>
    
          #mkdir /etc/tomcat6/webapps
          3.下面我们建立两个页面 index.html和index.jsp(打印tomcat环境变量)
          vi /etc/tomcat/webapps/index.html
          This is Tomcat6 webserver index.html
    
          vi /etc/tomcat6/webapps/index.jsp
    
    <%@ page session="false" import="java.util.*" %>
    
    <%!
    Enumeration enumNames;
    String strName,strValue;
    %>
    
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
    <title获取各种CGI环境变量</title>
    </head>
    <body>
    <table border=1 cellspacing=0 cellpadding=0 align=center>
    <tr>
      <th>Name</th>
      <th>Value</th>
    </tr>
    <%
    enumNames = request.getHeaderNames();
    while(enumNames.hasMoreElements()){
        strName = (String)enumNames.nextElement();
        strValue = request.getHeader(strName);
    %>
    <tr>
      <td> <%=strName%></td>
      <td> <%=strValue%></td>
    </tr>
    <%
    }
    %>
    <tr>
      <th>Name</th>
      <th>Value</th>
    </tr>
    <tr>
      <td> CharacterEncoding</td>
      <td> <%=request.getCharacterEncoding()%></td>
    </tr>
    <tr>
      <td> CONTENT_LENGTH</td>
      <td> <%=request.getContentLength()%></td>
    </tr>
    <tr>
      <td> CONTENT_TYPE</td>
      <td> <%=request.getContentType()%></td>
    </tr>
    <tr>
      <td> SERVER_PROTOCOL</td>
      <td> <%=request.getProtocol()%></td>
    </tr>
    <tr>
      <td> REMOTE_ADDR</td>
      <td> <%=request.getRemoteAddr()%></td>
    </tr>
    <tr>
      <td> REMOTE_HOST</td>
      <td> <%=request.getRemoteHost()%></td>
    </tr>
    <tr>
      <td> Scheme</td>
      <td> <%=request.getScheme()%></td>
    </tr>
    <tr>
      <td> SERVER_NAME</td>
      <td> <%=request.getServerName()%></td>
    </tr>
    <tr>
      <td> SERVER_PORT</td>
      <td> <%=request.getServerPort()%></td>
    </tr>
    <tr>
      <td> AUTH_TYPE</td>
      <td> <%=request.getAuthType()%></td>
    </tr>
    <tr>
      <td> REQUEST_METHOD</td>
      <td> <%=request.getMethod()%></td>
    </tr>
    <tr>
      <td> PATH_INFO</td>
      <td> <%=request.getPathInfo()%></td>
    </tr>
    <tr>
      <td> PATH_TRANSLATED</td>
      <td> <%=request.getPathTranslated()%></td>
    </tr>
    <tr>
      <td> QUERY_STRING</td>
      <td> <%=request.getQueryString()%></td>
    </tr>
    <tr>
      <td> REMOTE_USER</td>
      <td> <%=request.getRemoteUser()%></td>
    </tr>
    <tr>
      <td> REQUEST_URI</td>
      <td> <%=request.getRequestURI()%></td>
    </tr>
    <tr>
      <td> SCRIPT_NAME</td>
      <td> <%=request.getServletPath()%></td>
    </tr>
    </table>
    </body>
    </html>
    
    4.vm2上配置nginx反向代理
    注释掉/usr/local/nginx/etc/nginx中所有的server{}段,我们新加一个server{}
    
    	upstream jsp {
    
                    server 192.168.196.129:8080;
            }
    
            server {
                    listen 80;
                    server_name localhost defalut_server;
                    location ~* \.(jpg|txt|png|gif|rar|html|pdf|doc|exe) {
                            root /usr/local/nginx/html;
                    }
    
    
                    location / {
                            proxy_pass http://jsp;
                            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;
                    }
            }
    
    如果后端有多台tomcat服务器,我们只需要在upstream中加入 server x.y.z.a:8080;就可以实现负载均衡了,默认是1:1负载均衡.如果我们在server 192.168.196.129:8080加入weight=10
    的方式可以修改几台服务器的权重,服务器配置好的,权重应该大一些.处于多台后端服务器session的问题,我可以可以在最下面加入upstream中加入ip_hash使单个IP使用固定的后端服务器
    在实际的应用中,我们可以通过rsync+inotify把tomcat上的web主目录/etc/tomcat/webapps实时同步到nginx主机/usr/local/nginx/html上.
    我们同时也在nginx服务器上建立一个文件
    vi /usr/local/nginx/html/1.txt
    this is a 1.txt on nginx web server!
    
    vi /usr/local/nginx/html/index.html
    index.html on nginx!
    
    访问测试http://192.168.196.128  我们会发现它会访问到nginx上的index.html页面
    访问测试http://192.168.196.128/1.txt 我们也会发现是nginx上的1.txt
    访问测试http://192.168.196.128/index.jsp 我们会发现是tomcat上的jsp,并且会显示
    host	 192.168.196.128
    x-real-ip	 192.168.196.1
    x-forwarded-for	 192.168.196.1
    说明页面是nginx向tomcat请求的,但是tomcat可以得知我们的真实IP,就是x-real-ip和x-forward-for字段.


  • dinamic_sidebar 4 none

©2016 郭灿的博客-运维技术交流 Entries (RSS) and Comments (RSS)  Raindrops Theme