Nginx服务器初期基本配置指南
一、准备
pcre,有关正则表达式匹配;zlib,用于压缩。这些就不细说了,如果要安装最简版的nginx,记得准备好这两样东西就好了。
用root账户启动服务是比较危险的! 前段时间,测试服务器被黑掉了,终归到底是通过一个root启动的服务上传了木马,最后连ssh都屏蔽了,活生生成为一台肉鸡。。。
所以,惨痛的经验告诉我,一定要为服务建立对应的组和用户,限制访问权限,降低风险!
这里为nginx建立一个www组,并建立一个不登录的账户nginx:
#追加一个www组 groupadd-fwww #追加一个nginx用户 useradd-s/sbin/nologin-gwwwnginx
建立一个目录用于存放nginx日志文件,并赋予相应权限:
#建立nginx日志目录 mkdir/var/log/nginx #赋予访问权限 chownnginx.www/var/log/nginx
二、编译安装
我把pcre、zlib、nginx的压缩包都放在了/opt/software路径下,服务要装在/opt/servers路径下。
先对pcre、zlib、nginx解压,然后编译安装:
./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&&makeinstall
三、系统配置
我希望nginx可以作为一个服务,通过service命令启动或停止。
这样做的好处是,不论我用什么用户调用这个service命令,都不会因为使用错误的账户带来安全问题。
建立一个系统文件:
vim/etc/init.d/nginx
前人栽树,后人乘凉。已经有老鸟做好了启动配置文件:
#!/bin/bash #v.0.0.1 #createbyjackbillowat2007.10.15 #nginx-Thisshellscripttakescareofstartingandstoppingnginx. # #chkconfig:-6050 #description:nginx[enginex]islighthttpweb/proxyserver #thatanswersincomingftpservicerequests. #processname:nginx #config:/etc/nginx.conf nginx_path="/opt/servers/nginx" nginx_pid="/var/run/nginx.pid" #Sourcefunctionlibrary. ./etc/rc.d/init.d/functions #Sourcenetworkingconfiguration. ./etc/sysconfig/network #Checkthatnetworkingisup. [${NETWORKING}="no"]&&exit0 [-x$nginx_path/sbin/nginx]||exit0 RETVAL=0 prog="nginx" start(){ #Startdaemons. if[-e$nginx_pid-a!-z$nginx_pid];then echo"nginxalreadyrunning...." exit1 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-eq0]&&{ touch/var/lock/subsys/$prog success$"$prog" } echo else RETVAL=1 fi return$RETVAL } #Stopdaemons. stop(){ echo-n$"Stopping$prog:" killproc-d10$nigx_path/sbin/nginx RETVAL=$? echo [$RETVAL=0]&&rm-f$nginx_pid/var/lock/subsys/$prog } #Seehowwewerecalled. case"$1"in start) start ;; stop) stop ;; restart) stop start ;; status) status$prog RETVAL=$? ;; *) echo$"Usage:$0{start|stop|restart|status}" exit1 esac exit$RETVAL
注意,这里的路径:
引用
nginx_path="/opt/servers/nginx" nginx_pid="/var/run/nginx.pid"
如果你的nginx安装路径在其它位置,请对应修改!
然后赋予这个文件执行权限:
chmod+x/etc/init.d/nginx
追加为系统服务:
chkconfig--addnginx chkconfignginxon
现在就可以使用,如下命令控制nginx服务了!
引用
#启动nginx servicenginxstart #停止nginx servicenginxstop #重启nginx servicenginxrestart #查看nginx状态 servicenginxstatus
四、基本配置
完成上述工作后,nginx还不能急于投入使用,需要做一些基本配置与优化工作。
修改nginx配置文件:
vim/opt/servers/nginx/conf/nginx.conf
微调
引用
#使用的用户和组,这里我们为nginx服务新建了nginx账户和www工作组 usernginxwww; #制定的工作衍生进程数(2倍于CPU内核数) worker_processes4; #错误日志存放路径,日志级别由低到高[debug|info|notice|warn|error|crit] error_log/var/log/nginx/error.logcrit; #指定文件描述符数量与ulimit-n数值保持一致 work_rlimit_nofile65535; events{ #使用的网络I/O模型,Linux用epoll模型,Unix用kqueue模型 useepoll; #允许的连接数 worker_connections51200; } http{ includemime.types; default_typeapplication/octet-stream; #追加'"$sent_http_cache_control""$sent_http_pl""$request_time"'获取请求细节信息 log_formatmain'$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.logmain; ... server{ ... location/{ roothtml; indexindex.htmlindex.htmindex.jspindex.do; #在header中传递请求放host、ip等信息 proxy_set_headerHost$host; proxy_set_headerX-Real-IP$remote_addr; proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for; proxy_pass_headerContent-Type; proxy_pass_headerContent-Disposition; proxy_pass_headerContent-Length; ... } } }
五、虚拟目录
nginx配置虚拟目录很简单,主要是运用root、alias两个指令。
以访问图片服务为例:
root,用于相对路径
引用
location/image/{ root/data; }
当我们访问“/image/”路径时,实际上访问的是“/data/image/”,注意“/data”后面不要有“/”
alias,用于绝对路径
引用
location/image/{ alias/data/img/; }
当我们访问“/image/”路径时,实际上访问的是“/data/img/”,注意“/data/img/”以“/”结尾。
六、重定向
有时候链接不加考虑就放出去了,突然哪天需要调整,又不能及时撤回已放出的链接地址。只好自己修改nginx配置。
譬如,放出去的链接:/activity.do?m=v想让它指到/路径上:
引用
rewrite^/activity(.*)$/last;
想要把请求来的参数也带上:
引用
rewrite^/activity(.*)$/$1last;
$1指得是第一个参数,以此类推。
六、监控
引用
location/status{ stub_statuson; access_logoff; allow10.10.0.0/16; allow10.1.0.0/16; allow10.11.0.0/16; denyall; }
引用
Activeconnections:14 serveracceptshandledrequests 6262302 Reading:0Writing:3Waiting:11
七、日志分割
#!/bin/bash #THisscriptrunat00:00 #authordongliangat2012-09-07 #NginxLogPath logs_path="/var/log/nginx/" #NginxPIDPath 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`
赋予执行权限
chmod+xnginx_log.sh
凌晨执行
crontab-e 00***/opt/script/nginx_log.sh
八、Nginx负载均衡
在http{...}中配置一个upstream{...},参考如下:
引用
upstreamtomcat{ server10.11.155.26:8080; server10.11.155.41:8080; }
接着修改location节点,配置代理:
引用
location/{ ... proxy_passhttp://tomcat; ... }
当访问根路径时,会轮播路由到两台服务器上,至于后端服务器是tomcat还是jetty之类的,都无所谓,照葫芦画瓢就是了。
当然,有的机器性能好,或者负载低,可以承担高负荷访问量,可以通过权重(weight),提升访问频率。数值越高,被分配到的请求数越多。
server指令参数如下:
weight——权重,数值越大,分得的请求数就越多,默认值为1。
max_fails——对访问失败的后端服务器尝试访问的次数。默认值为1,当设置为0时将关闭检查。
fail_timeout——失效超时时间,当多次访问失败后,对该节点暂停访问。
down——标记服务器为永久离线状态,用于ip_hash指令。
backup——仅当非backup服务器全部宕机或繁忙时启用。
例如,可以这样配置:
引用
upstreamtomcat{ server10.11.155.26:8080weight=5; server10.11.155.41:8080weight=10; }
后者分得的请求数就会较高。