nginx安装及配置总结
?
# 安装:如果在Ubuntu下安装,so easy:sudo apt-get install nginx。一般安装的是0.7.65版本,与源有关。如果在redhat和其他系统下,要安装就得下载源代码,编译了。nginx依赖了pcre,ngx_cache_purge(可选)等。依赖这个东西很烦人,在redhat里面也可以把apt软件安上,然后再用apt来安。这样就好多了。编译安装时如果依赖包正确,应该很快就安完了。
# 配置:根据./configure里面设置的一些选项,可以找到nginx对应的安装目录。一般默认的设置为:可执行程序:/usr/sbin/nginx;配置文件目录:/etc/nginx,这里面包括了最核心的nginx.conf文件和其他如mime类型等的设置;web应用和日志的目录在/usr/local/nginx和/usr/share下面。
* 备注:这儿的目录很是奇怪,如果安装好nginx后不进行任何配置,访问http://localhost可以看到访问的文件是/etc/nginx/下面的一个index.html文件。但是再输入http://localhost/images就跑到/usr/share里面去了。配置文件nginx.conf里面如果开启文件浏览选项(autoindex on)可以发现,网页上展示的文件正是/usr/share/images下面的。
* 当然,我们还是要按照自己的需要进行配置。vi /etc/nginx/nginx.conf。进行详细的配置。以下就是nginx.conf里面的全部内容及说明。
————————————————————华丽的分割线————————————————————————
user ?zengjian;#指定用于运行nginx进程的用户名
?
worker_processes 8;#开8个进程来处理请求。这个要根据服务器的性能来设定。
?
error_log ?/usr/local/webserver/nginx/logs/nginx_error.log ?crit;#设定错误日志的记录位置和级别
?
pid ? ? ? ?/usr/local/webserver/nginx/nginx.pid;#保存nginx启动后的进程号,这个的用处可以在shell脚本时使用,比如,想要不关闭nginx进程而又要重新加载配置文件时可以用/usr/sbin/nginx -HUP `cat /usr/local/webserver/nginx/nginx.pid`来实现。就不用再ps aux | grep nginx来查看进程号了。
?
worker_rlimit_nofile 65535;#在一个nginx进程里面最多能同时打开的文件数量,在缓存时这个很有必要。
?
events?
{
??use epoll;#这个是linux2.6+内核才支持的一个指令。没具体研究,应该是内核定位进程资源的一个快速方法。就像hash和遍历的区别。我理解的话似乎是这样:如果不use epoll,那么接受一个请求就会挨着挨着找线程池再对应到connection。用了epoll应该就能用O(1)的方法找到这个connection。从而加快处理
??worker_connections 65535;#定义最大连接数
}
?
http?
{
??include ? ? ? mime.types;#加载mime.types类型。打开与nginx.conf目录所在目录下的mime.types可以看到,里面定义了http的很多资源,告诉nginx可以处理哪些资源
??default_type ?application/octet-stream;
?
??charset ?utf-8;#这个编码就是网页内容的编码
??#定义一些缓冲大小和最大对象 ? ?
??server_names_hash_bucket_size 128;
??client_header_buffer_size 32k;
??large_client_header_buffers 4 32k;
??client_max_body_size 300m;
?
??sendfile on;#nginx可以直接sendfile给client。在程序里构造一个请求头即可
??tcp_nopush on;
?
??keepalive_timeout 60;#连接的超时时间
?
??tcp_nodelay on;#这个选项我看了下,为了发送小数据,比如10B以下的数据,会封装一个带有40B的IP包。如果每次都将这些小数据封装成IP包,很容易造成网络拥塞,所以就可以设置是将多个小数据封装成一个包(tcp_nodelay off)还是封装这些小数据成一个包(tcp_nodelay on)。与tcp_nopush是互斥的,但是我看很多nginx的配置两个都开启,没搞懂。(Mark之:TODO)
#下面这些就见名知义了
??client_body_buffer_size ?512k;
??proxy_connect_timeout ? ?5;
??proxy_read_timeout ? ? ? 60;
??proxy_send_timeout ? ? ? 5;
??proxy_buffer_size ? ? ? ?16k;
??proxy_buffers ? ? ? ? ? ?4 64k;
??proxy_busy_buffers_size 128k;
??proxy_temp_file_write_size 128k;
#开户gzip压缩
??gzip on;
??gzip_min_length ?1k;#1k以下的文件不进行压缩
??gzip_buffers ? ? 4 16k;
??gzip_http_version 1.1;
??gzip_comp_level 2;
??gzip_types ? ? ? text/plain application/x-javascript text/css application/xml;#压缩的类型,可以参照mime.types里面的
??gzip_vary on;
#定义缓冲的目录
??proxy_temp_path ? /home/zengjian/nginx/proxy_temp_dir;
#定义缓存目录,levels指定该缓存空间有两层hash目录,第一层目录是1个字母,第二层为2个字母,保存的文件名就会类似/home/zengjian/nginx/proxy_cache_dira/12/xxxx;keys_zone为这个空间起个名字。200M为内存缓存空间的大小,1d为默认缓存1天。max_size=30g为最大空间为30GB的硬盘空间,也就是proxy_cache_dir这个目录的最大值。这儿缓存倒是容易,可是如何清理缓存有点麻烦,比如我新上传了一个图片,我想立即看到效果,但是缓存里面的还未过期,那就杯具了:要么改名字,要么用ngx_cache_purge这个模块,可惜的是,我实验了一下,清缓存失败。
??proxy_cache_path ?/home/zengjian/nginx/proxy_cache_dir ?levels=1:2 ? keys_zone=cache_one:200m inactive=1d max_size=30g;
??#负载均衡的设置,里面可以添加多个机器,只要配置好IP:端口 权值(weight,即被分配到请求的概率)失败次数 超时时间等即可以
??upstream backend_server {
?? # server ? 10.232.27.1:80 weight=1 max_fails=2 fail_timeout=30s;
?? ?server ? 10.13.35.51:3000 weight=1 max_fails=2 fail_timeout=30s;
??}
?
??server
??{
?? ?listen ? ? ? 80;#监听的端口
?? ?index index.html index.htm;
?? ?root ?/home/zengjian/nginx/htdocs/; ?#自己定义网站的主页位置。这样就不会再是默认的/etc/nginx里面了
#location是nginx里面非常重要的指令,可以定义页面访问规则
?? ?location /#定义主页访问规则
?? ?{
?? ? ? ? proxy_next_upstream http_502 http_504 error timeout invalid_header;
?? ? ? ? proxy_cache cache_one;
?? ? ? ? proxy_cache_valid ?200 304 12h;
?? ? ? ? proxy_cache_key $host$uri$is_args$args;
?? ? ? ? proxy_set_header Host ?$host;
?? ? ? ? proxy_set_header X-Forwarded-For ?$remote_addr;
?? ? ? ? #proxy_pass http://backend_server;
?? ? ? ? expires ? ? ?1d;
?? ?}
location ~ /purge(/.*)#这个是我加载了一个外部用于清除缓存用的模块,但是实验没成功,汗一个
?? ?{
?? ? allow ? ? ? ? ? ?127.0.0.1;
?? ? allow ? ? ? ? ? ?10.13.0.0/16;
?? ? deny ? ? ? ? ? ?all;
?? ? proxy_cache_purge ? ?cache_one ? $host$1$uri$is_args$args;
?? ?}
?
?? ?location ~ .*\.(js|css|gif|jpg|jpeg|png|bmp|swf|flv|txt)$ ?#缓存静态资源类型,也应该是我们twork主要用到的功能 ??
?? ?{
?? ?proxy_pass http://backend_server;#如果这些静态资源在nginx服务器上找不到,直接到代理里面去找,找到再缓存到nginx服务器上
?? ?expires 6h;
?? ?proxy_cache cache_one;
?? ?proxy_cache_valid 200 302 1h;#200 save for 1 hour#200 302状态的响应缓存1小时
?? ?proxy_cache_valid 301 1d;#301 save for 1 day#301缓存1天
?? ?proxy_cache_valid any 1m;#other save for 1 minute#其他响应缓存1分钟
?? ?}
?
?
#对于一些动态文件,不用缓存
?? ?location ~ .*\.(php|jsp|cgi)?$
?? ?{
?? ? ? ? proxy_set_header Host ?$host;
?? ? ? ? proxy_set_header X-Forwarded-For ?$remote_addr;
?? ? ? ? #proxy_pass http://backend_server;
?? ?}
#关闭访问日志
?? ?access_log ?off;
??}
}