这两天读了读Nginx的官方文档,记个笔记。
启动nginx
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
./nginx
Starting, Stopping, and Reloading Configuration
nginx -s signal
stop -> fast shutdown
quit -> graceful shutdown
reload -> reloading the configuration file
reopen -> reopening the log files
Unix tools kill
kill -s QUIT 1628
- 找到pid的两个方法
- nginx.pid文件,在
/usr/local/nginx/logs
or/var/run
ps -ax |grep nginx
- nginx.pid文件,在
server context
- context的概念,每行以分号结尾的都是一个指令,大括号套一系列的指令就是context。
- 一个http可以包含多个server。
- server里面listen 表明这个server的端口号。
- root,web的根目录。
- server_name就是host,一个server Context可以配置多个server_name
- 如:
server_name localhost localhost.org;
- 如:
- server_name可以使用通配符,可以使用正则表达式,匹配规则:
- Exact name
- Longest wildcard starting with an asterisk, such as *.example.org
- Longest wildcard ending with an asterisk, such as mail.*
- First matching regular expression (in order of appearance in the configuration file)
- 如果host header不能够匹配任何一个server_name,可以设置default_server来处理它。
- 如:listen 80 default_server;
location
- location指令有两种不同的参数:
- 前缀字符串(pathnames)
那些以该前缀字符串开头的的URIs都会匹配到。
-
如:
location /some/path { ... }
这个会匹配/some/path/test 但是不会匹配 /test/some/path
- 正则表达式
-
大小写敏感的前面加一个~
location ~ \.html? { ... }
这个会匹配url中包含.html或者.htm的,任何位置都可以。
大小写不敏感的加~*
-
- 匹配规则,正则表达式拥有的更高的优先级,除非用了~修饰符。~ 如果把这个前缀用于一个常规字符串,那么告诉nginx 如果路径匹配那么不测试正则表达式。
- 确切的匹配的逻辑:
- Test the URI against all prefix strings.
- The = (equals sign) modifier defines an exact match of the URI and a prefix string. If the exact match is found, the search stops.
- If the ^~ (caret-tilde) modifier prepends the longest matching prefix string, the regular expressions are not checked.
- Store the longest matching prefix string.
- Test the URI against regular expressions.
- Break on the first matching regular expression and use the corresponding location.
- If no regular expression matches, use the location corresponding to the stored prefix string
- 前缀字符串(pathnames)
- location context中的指令
root指令来声明访问静态文件的路径,如uri是/images/example.png,如果匹配到的location的root指令的值是/data,那么就会把/data/images/example.png作为响应。
proxy_pass指令,将请求打到配置的url上,被代理的server的响应到客户端。
-
如:
server { location /images/ { root /data; } location / { proxy_pass http://www.example.com; } }
使用变量
在配置nginx的时候可以使用变量,变量以$开头,变量在运行是得到对应的值,然后作为参数传给指令。有很有预定义的变量,如core HTTP varabiles,可以用set map和geo指令来自定义变量。大多数的变量都是在运行时得到值并且包含与特定请求相关的信息。注意是特定请求不是context。
返回特定的状态码
- 最简单的方式是使用return指令返回特定的状态码。
-
第一个参数是状态码,第二个参数是重定向的url或者返回体中的文字(只限于301、302、303、307)。
location /wrong/url { return 404; } location /permanently/moved/url { return 301 http://www.example.com/moved/here; }
-
url重写
- 通过rewrite指令进行url重写,在server和 location里面都可以使用rewrite指令。
- 一共有三个参数,第一个是匹配url的正则表达式,第二个参数是重写的url,第三个参数是一个标记是可选参数。
- uri可以多次更改,uri会依次匹配每个rewrite指令。
- 第三个参数,last和break的区别
- 两个值在server context中表现一致,跳过剩下的rewrite指令,进行location匹配。
- 在location context中,last会跳出当前location寻找新的location匹配,而break不会再去匹配其他的location,在当前location请求对应的uri。
- 小心循环重定向,尽量在server context里面进行url重写。
- 例子:
-
多个rewrite指令,如果都不匹配返回403
server { ... rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last; rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra last; return 403; ... }
-
循环重定向
location = error.html { rewrite /error.html /error.html last; fastcgi_pass 127.0.0.1:9000; }
-
break
location /users/ { rewrite ^/users/(.*)$ /show?user=$1 break; }
-
handling errors
通过error_page指令,来处理错误。
-
当发生404错误时候,返回一个自定义的页面
error_page 404 /404.html;
-
当发生404的时候,重定向到一个新的url
location /old/path.html { error_page 404 =301 http:/example.com/new/path.html; }
-
内部重定向
-
配置
server { ... location /images/ { # Set the root directory to search for the file root /data/www; # Disable logging of errors related to file existence open_file_cache_errors off; # Make an internal redirect if the file is not found error_page 404 = /fetch$uri; } location /fetch/ { proxy_pass http://backend/; } }
如果
/images/some/file
没有找到,它就会被替换成/fetch/images/some/file
,然后寻找新的location,然后再打到被代理的服务器。open_file_cache_errors
指令用于组织文件找不到时的报错信息,这里就不需要打开了,因为文件找不到时候已经被处理掉了。
-