server {
listen 9801;
root data;
location /{
expires 24h; //页面缓存
autoindex on; //打开目录索引功能
#if (-f $request_filename){
# rewrite ^(.*)$ $1 last;
#}
proxy_store on; //开启缓存机制
proxy_store_access user:rw group:rw all:rw;
proxy_temp_path tmp;
if (!-e $request_filename){
#proxy_pass http://xyou;没有改文件则跳到指定请求上去
}
}
}
注:以上root路径如果是在nginx只需要写相对路径即可,否则会导致请求不到对应静态资源文件!因为这个路径对应的就是/home/gameguide/nginx/data目录
通过正则表达式,我们可让 nginx 识别出各种静态文件,例如 images 路径下的所有请求可以写为:
location ~ ^/images/ { root /opt/webapp/images; } |
而下面的配置则定义了几种文件类型的请求处理方式。
location ~ \.(htm|html|gif|jpg|jpeg|png|bmp|ico|css|js|txt)$ { root /opt/webapp; expires 24h; } |
对于例如图片、静态 HTML 文件、js 脚本文件和 css 样式文件等,我们希望 Nginx 直接处理并返回给浏览器,这样可以大大的加快网页浏览时的速度。因此对于这类文件我们需要通过 root 指令来指定文件的存放路径,同时因为这类文件并不常修改,通过expires
指令来控制其在浏览器的缓存,以减少不必要的请求。expires
指令可以控制 HTTP 应答中的“ Expires ”和“ Cache-Control ”的头标(起到控制页面缓存的作用)。您可以使用例如以下的格式来书写 Expires:
expires 1 January, 1970, 00:00:01 GMT; expires 60s; expires 30m; expires 24h; expires 1d; expires max; expires off; |
Nginx 本身并不支持现在流行的 JSP、ASP、PHP、PERL 等动态页面,但是它可以通过反向代理将请求发送到后端的服务器,例如 Tomcat、Apache、IIS 等来完成动态页面的请求处理。前面的配置示例中,我们首先定义了由 Nginx 直接处理的一些静态文件请求后,其他所有的请求通过 proxy_pass 指令传送给后端的服务器(在上述例子中是 Tomcat)。最简单的proxy_pass
用法如下:
location / { proxy_pass http://localhost:8080; proxy_set_header X-Real-IP $remote_addr; } |
这里我们没有使用到集群,而是将请求直接送到运行在 8080 端口的 Tomcat 服务上来完成类似 JSP 和 Servlet 的请求处理。
当页面的访问量非常大的时候,往往需要多个应用服务器来共同承担动态页面的执行操作,这时我们就需要使用集群的架构。 Nginx 通过 upstream
指令来定义一个服务器的集群,最前面那个完整的例子中我们定义了一个名为 tomcats 的集群,这个集群中包括了三台服务器共 6 个 Tomcat 服务。而 proxy_pass 指令的写法变成了:
location / { proxy_pass http://tomcats; proxy_set_header X-Real-IP $remote_addr; } |
在 Nginx 的集群配置中,Nginx 使用最简单的平均分配规则给集群中的每个节点分配请求。一旦某个节点失效时,或者重新起效时,Nginx 都会非常及时的处理状态的变化,以保证不会影响到用户的访问。
http://www.fm0898.com/show.aspx?id=31628&cid=122
Nginx只缓存静态文件配置
server { listen 80; server_name Domain.com; #碰到域名为Domain的 就交给Apache来运行 location / { proxy_pass http://Domain.com:8080/; #我的Apache上面的站点即为http://k:8080 } location ~ .*\.(js|css)$ { #指定缓存文件类型 expires 7d; #设置浏览器过期时间 root a; #所有的缓存文件都会保存在这里html等等,他还会缓存文件夹,所以不用担心覆盖,但是要注意时效性,不然你做了修改 他依旧读取缓存,你的网站就没有变化了 proxy_store on; #开启缓存机制 proxy_store_access user:rw group:rw all:rw; #缓存读写规则 proxy_temp_path b; #存放静态文件的缓存目录 #include proxy.conf; # 外联proxy理的详细配置如proxy_set_header, client_max_body_size .... if ( !-e $request_filename) { proxy_pass http://Domain.com:8080; } } }http://www.oschina.net/code/snippet_130291_14275
nginx url rewrite(转)
nginx的rewrite格式是:rewrite regex replacement flag
作用域:server,location,if
其中regex是一个正则表达式,用来匹配当前的url的
replacement 是被替换的url,如果请求url匹配regex,则nginx会将此次请求发送到replacement上
其中flag标记有四种格式:
last 停止处理后续rewrite指令集,然后对当前重写的新URI在rewrite指令集上重新查找。
break 停止处理后续rewrite指令集,并不在重新查找。
redirect 如果replacement不是以http:// 或https://开始,返回302临时重定向
permant 返回301永久重定向
示例:
rewrite ^/([a-z]+)/([a-z]+)$ /index.php?r=$1/$2 last;
这条规则其实是将所有http://host/index.php?r=xxx/yyy这样的url都重写成http://host/xxx/yyy
如果正则表达regex式中包含 “}” 或 “;”, 那么整个表达式需要用双引号或单引号包围
补充:
nginx中的一些全局变量
$args #这个变量等于请求行中的参数。
$content_length #请求头中的Content-length字段。
$content_type #请求头中的Content-Type字段。
$document_root #当前请求在root指令中指定的值。
$host #请求主机头字段,否则为服务器名称。
$http_user_agent #客户端agent信息
$http_cookie #客户端cookie信息
$limit_rate #这个变量可以限制连接速率。
$request_body_file #客户端请求主体信息的临时文件名。
$request_method #客户端请求的动作,通常为GET或POST。
$remote_addr #客户端的IP地址。
$remote_port #客户端的端口。
$remote_user #已经经过Auth Basic Module验证的用户名。
$request_filename #当前请求的文件路径,由root或alias指令与URI请求生成。
$query_string #与$args相同。
$scheme #HTTP方法(如http,https)。
$server_protocol #请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
$server_addr #服务器地址,在完成一次系统调用后可以确定这个值。
$server_name #服务器名称。
$server_port #请求到达服务器的端口号。
$request_uri #包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。
$uri #不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。
$document_uri #与$uri相同
rewrite中的if指令:
if(condition){...}
作用域:server,location
if条件(conditon)可以是如下任何内容:
一个变量名;false如果这个变量是空字符串或者以0开始的字符串;
使用= ,!= 比较的一个变量和字符串
是用~, ~*与正则表达式匹配的变量,如果这个正则表达式中包含},;则整个表达式需要用" 或' 包围
使用-f ,!-f 检查一个文件是否存在
使用-d, !-d 检查一个目录是否存在
使用-e ,!-e 检查一个文件、目录、符号链接是否存在
使用-x , !-x 检查一个文件是否可执行
if (!-f $request_filename){#当请求文件不存在时跳转到index.php
rewrite (.*) /index.php;
}
rewrite_log指令
语法:rewrite_log on|off;
默认值:rewrite_log off;
作用域:http,server,location,if
开启或关闭以notice级别打印rewrite处理日志到error log文件。
set指令
语法:set variable value;
默认值:none
作用域:server,location,if
定义一个变量并赋值,值可以是文本,变量或者文本变量混合体。
uninitialized_variable_warn指令
语法:uninitialized_variable_warn on | off;
默认值:uninitialized_variable_warn on
作用域:http,server,location,if
控制是否输出为初始化的变量到日志
在写规则是还要注意规则的使用范围,在nginx配置文件中
location / {
root /home/data/www;
index index.php index.html index.htm;
rewrite ^/([a-z]+)/([a-z]+)$ /index.php?r=$1/$2 last;
}
location /doc {#url包含doc
root /usr/share;
autoindex on;
}
#error_page 404 /404.html;
location ~ \.php$ {#所有以php结尾的请求
}
nginx location 规则匹配
二、 Location语法 语法:location [=|~|~*|^~] /uri/ { … }
注:
1、~ 为区分大小写匹配
2、~* 为不区分大小写匹配
3、!~和!~*分别为区分大小写不匹配及不区分大小写 不匹配
示例一:
location / { }
匹配任何查询,因为所有请求都以 / 开头。但是正则表达式规则将被优先和查询匹配。
示例二:
location =/ {}
仅仅匹配/
示例三:
location ~* \.(gif|jpg|jpeg)$ {
rewrite \.(gif|jpg)$ /logo.png;
}
注:不区分大小写匹配任何以gif,jpg,jpeg结尾的文件
三、 ReWrite语法
last - 基本上都用这个Flag。
break - 中止Rewirte,不在继续匹配
redirect - 返回临时重定向的HTTP状态302
permanent - 返回永久重定向的HTTP状态301
1、下面是可以用来判断的表达式:
-f和!-f用来判断是否存在文件
-d和!-d用来判断是否存在目录
-e和!-e用来判断是否存在文件或目录
-x和!-x用来判断文件是否可执行
2、下面是可以用作判断的全局变量
例: http://localhost:88/test1/test2/test.php
$host:localhost
$server_port:88
$request_uri: http://localhost:88/test1/test2/test.php
$document_uri:/test1/test2/test.php
$document_root:D:\nginx/html
$request_filename:D:\nginx/html/test1/test2/test.php
四、 Redirect语法
server {
listen 80;
server_name start.igrow.cn;
index index.html index.php;
root html;
if ($http_host !~ "^star\.igrow\.cn$" {
rewrite ^(.*) http://star.igrow.cn $1 redirect;
}
}
五、防盗链 location ~* \.(gif|jpg|swf)$ {
valid_referers none blocked start.igrow.cn sta.igrow.cn;
if ($invalid_referer) {
rewrite ^/
}
}
六、根据文件类型设置过期时间
location ~* \.(js|css|jpg|jpeg|gif|png|swf)$ {
if (-f $request_filename) {
expires 1h;
break;
}
}
七、禁止访问某个目录
location ~* \.(txt|doc)${
root /data/www/wwwroot/linuxtone/test;
deny all;
}
==========================================================
linux nginx的启动脚本:
#!/bin/sh
#
# nginx - this script starts and stops the nginx daemin
#
# chkconfig: - 85 15
# description: Nginx is an HTTP(S) server, HTTP(S) reverse \
# proxy and IMAP/POP3 proxy server
# processname: nginx
# config: /usr/local/nginx/conf/nginx.conf
# pidfile: /usr/local/nginx/logs/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
nginx="/usr/local/nginx/sbin/nginx"
prog=$(basename $nginx)
NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"
lockfile=/var/lock/subsys/nginx
start() {
[ -x $nginx ] || exit 5
[ -f $NGINX_CONF_FILE ] || exit 6
echo -n $"Starting $prog: "
daemon $nginx -c $NGINX_CONF_FILE
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}
stop() {
echo -n $"Stopping $prog: "
killproc $prog -QUIT
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile
return $retval
}
restart() {
configtest || return $?
stop
start
}
reload() {
configtest || return $?
echo -n $"Reloading $prog: "
killproc $nginx -HUP
RETVAL=$?
echo
}
force_reload() {
restart
}
configtest() {
$nginx -t -c $NGINX_CONF_FILE
}
rh_status() {
status $prog
}
rh_status_q() {
rh_status >/dev/null 2>&1
}
case "$1" in
start)
rh_status_q && exit 0
$1
;;
stop)
rh_status_q || exit 0
$1
;;
restart|configtest)
$1
;;
reload)
rh_status_q || exit 7
$1
;;
force-reload)
force_reload
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q || exit 0
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
exit 2
esac
保存退出
第三步
- chmod +x /etc/init.d/nginx
第四步
- /sbin/chkconfig nginx on
检查一下
- sudo /sbin/chkconfig --list nginx
- nginx 0:off 1:off 2:on 3:on 4:on 5:on 6:off
完成!
之后,就可以使用以下命令了
- service nginx start
- service nginx stop
- service nginx restart
- service nginx reload
- /etc/init.d/nginx start
- /etc/init.d/nginx stop
- /etc/init.d/nginx restart
- /etc/init.d/nginx reload
使用nginx设置root时要注意一个问题,就是如果该root设置的前端目录不是根目录,那么在写root的绝对地址时,要把前端目录的部分省略掉。
我们用设置虚拟目录指向的alias来和root比较一下就非常明显了
alias
location / abc /{alias / home / html / abc / ;}
在这段配置下,http://test/abc/a.html就指定的是 /home/html/abc/a.html。这段配置亦可改成
root
location / abc / { root / home / html / ; }
可以看到,使用root设置目录的绝对路径时,少了/abc,也就是说,使用root来设置前端非根目录时,nginx会组合root和location的路径。
另外,使用alias时目录名后面一定要加“/”
Nginx下使用中文URL和中文目录路径
一、确定你的Linux系统是UTF编码,Root登录SSH:
1 2 | env|grep LANG LANG=en_US.UTF-8 |
二、NGINX配置文件里默认编码设置为utf-8
1 2 3 4 5 6 7 8 | server { listen 80; server_name .inginx.com ; index index.html index.htm index.php; root /usr/local/nginx/html/inginx.com; charset utf-8; } |
三、如果使用putty
windows –> translation –>UTF-8
1 2 | mkdir 中文目录名 echo ‘中文目录名’ > 中文目录名/中国.html |
四、如果是用securecrt 上传文件,请选择 回话–>外观–UTF-8
如果是FTP软件也将默认编码设置为TUF-8
五、如果上传的文件名出现乱码显示
执行
1 | for f in `ls *.html` ; do mv $f `ls $f|iconv -f GBK -t UTF-8`; done |
完毕。
转自http://qiaodahai.com/personal/article/2010/nginx-chinese-url-and-chinese-directory-path.htm
在nginx的配置文件里面加上
这样就可以了,不过我自己是用的下面这个方法,因为是对应单独网站的。
在配置文件中 server 里加入如下代码
if (-d $request_filename) {
rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
}
接下来对这段代码进行一个解释
1、if (-d $request_filename),如果请求的是一个文件夹,则为真,进到if语句中执行
2、rewrite 是执行 url 重写操作。
3、^/(.*)([^/])$ 表示以/符号开始并紧跟着任何字符,同时不是以/为结束的字符串,在我的url 中,(.*) 表示的 bbs。
4、http://$host/$1$2/ 表示的重写后的地址,$host 是请求的域名,$1 是前面第一个括号里的内容,在我的 url 里就是 bbs。
5、permanent 表示,返回永久重定向的 HTTP 状态 301。