新闻公告

一、准备
pcre,有关正则表达式匹配;zlib,用于压缩。这些就不细说了,如果要安装最简版的nginx,记得准备好这两样东西就好了。
用root账户启动服务是比较危险的!  前段时间,测试服务器被黑掉了,终归到底是通过一个root启动的服务上传了木马,最后连ssh都屏蔽了,活生生成为一台肉鸡。。。
所以,惨痛的经验告诉我,一定要为服务建立对应的组和用户,限制访问权限,降低风险! 
这里为nginx建立一个www组,并建立一个不登录的账户nginx:


?1234 #追加一个www组  groupadd -f www  #追加一个nginx用户  useradd -s /sbin/nologin -g www nginx

建立一个目录用于存放nginx日志文件,并赋予相应权限:


?1234 #建立nginx日志目录  mkdir /var/log/nginx #赋予访问权限  chown nginx.www /var/log/nginx

二、编译安装
我把pcre、zlib、nginx的压缩包都放在了/opt/software路径下,服务要装在/opt/servers路径下。
先对pcre、zlib、nginx解压,然后编译安装:


?123456789101112131415161718 ./configure --prefix=/opt/servers/nginx \  --user=nginx \  --group=www \  --pid-path=/var/run/nginx.pid \  --error-log-path=/var/log/nginx/error.log \  --http-log-path=/var/log/nginx/access.log \  --with-pcre=/opt/software/pcre-8.10 \  --with-zlib=/opt/software/zlib-1.2.5 \  --with-http_stub_status_module \  --with-http_realip_module \  --with-http_gzip_static_module \  --without-http_fastcgi_module \  --without-http_memcached_module \  --without-http_map_module \  --without-http_geo_module \  --without-http_autoindex_module \  --with-poll_module  && make && make install

三、系统配置
我希望nginx可以作为一个服务,通过service命令启动或停止。
这样做的好处是,不论我用什么用户调用这个service命令,都不会因为使用错误的账户带来安全问题。
建立一个系统文件:


?1 vim /etc/init.d/nginx

前人栽树,后人乘凉。已经有老鸟做好了启动配置文件:


?12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 #!/bin/bash  # v.0.0.1  # create by jackbillow at 2007.10.15  # nginx - This shell script takes care of starting and stopping nginx.  #  # chkconfig: - 60 50  # description: nginx [engine x] is light http web/proxy server  # that answers incoming ftp service requests.  # processname: nginx  # config: /etc/nginx.conf  nginx_path="/opt/servers/nginx" nginx_pid="/var/run/nginx.pid"    # Source function library.  . /etc/rc.d/init.d/functions    # Source networking configuration.  . /etc/sysconfig/network    # Check that networking is up.  [ ${NETWORKING} = "no" ] && exit 0  [ -x $nginx_path/sbin/nginx ] || exit 0  RETVAL=0  prog="nginx" start() {  # Start daemons.  if [ -e $nginx_pid -a ! -z $nginx_pid ];then   echo "nginx already running...."   exit 1  fi if [ -e $nginx_path/conf/nginx.conf ];then   echo -n $"Starting $prog: "   $nginx_path/sbin/nginx -c $nginx_path/conf/nginx.conf &    RETVAL=$?    [ $RETVAL -eq 0 ] && {      touch /var/lock/subsys/$prog      success $"$prog"   }    echo else   RETVAL=1  fi   return $RETVAL  }  # Stop daemons.  stop() {    echo -n $"Stopping $prog: "   killproc -d 10 $nigx_path/sbin/nginx   RETVAL=$?    echo   [ $RETVAL = 0 ] && rm -f $nginx_pid /var/lock/subsys/$prog  }  # See how we were called.  case "$1" in start)    start    ;;  stop)    stop    ;;  restart)    stop    start    ;;  status)    status $prog    RETVAL=$?    ;;  *)    echo $"Usage: $0 {start|stop|restart|status}"   exit 1  esac  exit $RETVAL

注意,这里的路径:
引用


?12 nginx_path="/opt/servers/nginx" nginx_pid="/var/run/nginx.pid"

如果你的nginx安装路径在其它位置,请对应修改!
然后赋予这个文件执行权限:


?1 chmod +x /etc/init.d/nginx

追加为系统服务:


?12 chkconfig --add nginx  chkconfig nginx on

现在就可以使用,如下命令控制nginx服务了!
引用


?12345678 #启动nginx  service nginx start  #停止nginx  service nginx stop  #重启nginx  service nginx restart  #查看nginx状态  service nginx status

四、基本配置
完成上述工作后,nginx还不能急于投入使用,需要做一些基本配置与优化工作。
修改nginx配置文件:


?1 vim /opt/servers/nginx/conf/nginx.conf
微调
引用

?12345678910111213141516171819202122232425262728293031323334353637383940 #使用的用户和组,这里我们为nginx服务新建了nginx账户和www工作组  user nginx www;  #制定的工作衍生进程数(2倍于CPU内核数)  worker_processes 4;  #错误日志存放路径,日志级别由低到高[debug | info | notice | warn | error | crit]  error_log /var/log/nginx/error.log crit;  #指定文件描述符数量 与ulimit -n数值保持一致  work_rlimit_nofile 65535;  events {  #使用的网络I/O模型,Linux用epoll模型,Unix用kqueue模型  use epoll;  #允许的连接数  worker_connections 51200;  }  http{   include  mime.types;   default_type application/octet-stream;   #追加 '"$sent_http_cache_control" "$sent_http_pl" "$request_time"'获取请求细节信息   log_format main '$remote_addr - $remote_user [$time_local] "$request" '       '$status $body_bytes_sent "$http_referer" '       '"$http_user_agent" "$http_x_forwarded_for"'       '"$sent_http_cache_control""$sent_http_pl" "$request_time"';   access_log   /var/log/nginx/access.log main;   ...   server{    ...    location / {     root html;     index index.html index.htm index.jsp index.do;     #在header中传递请求放host、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;     proxy_pass_header Content-Type;     proxy_pass_header Content-Disposition;     proxy_pass_header Content-Length;     ...    }   }  }

五、虚拟目录
nginx配置虚拟目录很简单,主要是运用root、alias两个指令。
以访问图片服务为例:
root,用于相对路径
引用

?123 location /image/ {    root /data;  }
当我们访问“/image/”路径时,实际上访问的是“/data/image/”,注意“/data”后面不要有“/”
alias,用于绝对路径
引用

?123 location /image/ {    alias /data/img/;  }
当我们访问“/image/”路径时,实际上访问的是“/data/img/”,注意“/data/img/”以“/”结尾。

六、重定向
有时候链接不加考虑就放出去了,突然哪天需要调整,又不能及时撤回已放出的链接地址。只好自己修改nginx配置。
譬如,放出去的链接:/activity.do?m=v 想让它指到/路径上:
引用


?1 rewrite ^/activity(.*)$ / last;

想要把请求来的参数也带上:
引用


?1 rewrite ^/activity(.*)$ /$1 last;

$1指得是第一个参数,以此类推。


六、监控
引用


?123456789 location /status {   stub_status on;   access_log off;   allow 10.10.0.0/16;   allow 10.1.0.0/16;   allow 10.11.0.0/16;    deny all;  }

引用

?1234 Active connections: 14  server accepts handled requests  62 62 302  Reading: 0 Writing: 3 Waiting: 11

七、日志分割


?1234567891011121314151617 #!/bin/bash  # THis script run at 00:00  # author dongliang at 2012-09-07  # Nginx Log Path  logs_path="/var/log/nginx/" # Nginx PID Path  nginx_pid="/var/run/nginx.pid"    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     mv ${logs_path}error.log ${logs_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/error_$(date -d "yesterday" +"%Y%m%d" ).log     kill -USR1 `cat $nginx_pid`

赋予执行权限


?1 chmod +x nginx_log.sh
凌晨执行


?12 crontab -e  0 0 * * * /opt/script/nginx_log.sh
八、Nginx负载均衡
在http{...}中配置一个upstream{...},参考如下:
引用

?1234 upstream tomcat {   server 10.11.155.26:8080;   server 10.11.155.41:8080;  }
接着修改location节点,配置代理:
引用


?123456 location / {    ...     proxy_pass http://tomcat;      ...  }
当访问根路径时,会轮播路由到两台服务器上,至于后端服务器是tomcat还是jetty之类的,都无所谓,照葫芦画瓢就是了。
当然,有的机器性能好,或者负载低,可以承担高负荷访问量,可以通过权重(weight),提升访问频率。数值越高,被分配到的请求数越多。
server指令参数如下:
weight——权重,数值越大,分得的请求数就越多,默认值为1。
max_fails——对访问失败的后端服务器尝试访问的次数。默认值为1,当设置为0时将关闭检查。
fail_timeout——失效超时时间,当多次访问失败后,对该节点暂停访问。
down——标记服务器为永久离线状态,用于ip_hash指令。
backup——仅当非backup服务器全部宕机或繁忙时启用。

例如,可以这样配置:
引用

?1234 upstream tomcat {   server 10.11.155.26:8080 weight=5;   server 10.11.155.41:8080 weight=10;  }
后者分得的请求数就会较高。

www.xmwzidc.com 海西数据