1. 设置默认虚拟主机
(本文永久地址:)
对没有匹配的Host值时,返回错误403到客户端
server {
listen 80 default_server; server_name _; return 403;} 2. 用户认证用户认证需要用到apache的htpasswd命令生成密码,如果没有安装apache,可以使用yum install httpd安装。
生成密码文件,创建用户
htpasswd -c /usr/local/nginx/conf/htpasswd test
添加test用户,第一次添加时需要加-c参数,第二次添加时不需要-c参数
在nginx的配置文件中添加
location / { auth_basic "Auth"; auth_basic_user_file /usr/local/nginx/conf/.htpasswd;}3. 域名重定向(Rewrite)
例子1:server_name www.a.com www.test.com;
if ($host != 'www.test.com' ) {
rewrite ^/(.*)$ http://www.test.com/$1 permanent;} 例子2:访问 www.abc.com 请求到 www.abc.com/abc/if ($document_uri !~ 'abc')
{ rewrite ^/(.*)$ http://www.abc.com/abc/$1 permanent; }注:$document_uri表示访问的url
Nginx的Rewrite规则与Apache几乎完全一致,
所不同的是最后的flag标记flag标记有:
last 相当于Apache里的[L]标记,表示完成rewrite,不再匹配后面的规则
break 与last类似,本条规则匹配完成后,终止匹配,不再匹配后面的规则redirect 返回302临时重定向 ,浏览器会显示跳转后的URL地址permanent 返回301永久重定向,浏览器会显示跳转后的URL地址last/break用来实现URL重写,浏览器地址栏的URL不变,但在服务器端访问的路径发生了变化。
redirect/permanent实现URL跳转,浏览器地址栏URL会显示跳转后的URL。使用 alias 指令时必须用 last 标记 ,使用 proxy_pass 指令时要用 break 表示。last 标记在本条 rewrite 规则执行完毕后,会对其所在 server{....}标签重新发起请求,而 break 标记则在本条规则匹配完成后,终止匹配。
Apache和Nginx规则的对应关系
Apache的RewriteCond对应Nginx的if
Apache的RewriteRule对应Nginx的rewriteApache的[R]对应Nginx的redirectApache的[P]对应Nginx的lastApache的[R,L]对应Nginx的redirectApache的[P,L]对应Nginx的lastApache的[PT,L]对应Nginx的last 4. 日志切割编写脚本:
vi /usr/local/sbin/logrotate.sh //加入#! /bin/bash
d=`date -d "-1 day" +%Y%m%d`/bin/mv /usr/local/nginx/logs/test.log /usr/local/nginx/logs/test_$d.log/etc/init.d/nginx reload >/dev/null 2>&1/bin/gzip /usr/local/nginx/logs/logs/test_$d.log #如果要对日志进行压缩就加上这句 日志格式log_format main '$remote_addr - $remote_user [$time_local] $request '
'"$status" $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';此日志格式为,ip不仅记录代理的ip还记录远程客户端真实IP。
log_format main1 '$proxy_add_x_forwarded_for - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent"'; 内部变量说明$remote_addr与$http_x_forwarded_for用以记录客户端IP地址,一个记录代理IP,一个记录真实IP;
$remote_user 用以记录客户端用户名称;
$time_local 用来记录访问时间与时区;
$request 用来记录请求的url与http协议;
$status 用来记录请求状态,成功是200;
$body_byte_sent 记录发送给客户端文件主体内容大小;
$http_referer 用来记录从哪个页面链接访问过来的;
$http_user_agent 记录客户端浏览器的相关信息;
错误日志error_log日志级别
error_log 级别分为 debug, info, notice, warn, error, crit 默认为crit, 该级别在日志名后边定义格式如下:
error_log /your/path/error.log crit; crit 记录的日志最少,而debug记录的日志最多。如果你的nginx遇到一些问题,比如502比较频繁出现,但是看默认的error_log并没有看到有意义的信息,那么就可以调一下错误日志的级别,当你调成error级别时,错误日志记录的内容会更加丰富。5. 静态文件不记录日志,并且配置缓存
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 30d; access_log off; }location ~ .*\.(js|css)$
{ expires 12h; access_log off; }6. 防盗链
location ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip|doc|pdf|gz|bz2|jpeg|bmp|xls)$ { valid_referers none blocked server_names www.a.com *.b.com; if ($invalid_referer) { return 403; #rewrite ^/ http://www.example.com/nophoto.gif; }}详细了解请参考
7. 访问控制
黑名单
deny 192.168.1.1;deny 192.168.1.2;
deny 192.168.2.0/24;
allow all;
白名单
allow 192.168.1.0/24;allow 127.0.0.1;allow 192.168.2.1;deny all;8. 反向代理
server {
listen 80; server_name www.test.com;location / {
proxy_pass http://1.1.1.1/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }}
9. 负载均衡
upstream test {
ip_hash; server 192.168.1.1; server 192.168.1.2;}server {
listen 80; server_name www.test.com;location / {
proxy_pass http://test/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }}注:加上ip_hash作用是使每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。10. if指令
该指令用于检查一个条件是否符合,如果条件符合,则执行大括号内的语句。If指令不支持嵌套,不支持多个条件&&和||处理。
1) 正则表达式匹配,其中:
== 等值比较
~ 为区分大小写匹配 ~* 为不区分大小写匹配 !~和!~*分别为区分大小写不匹配及不区分大小写不匹配举例:if ($http_user_agent ~ MSIE) {rewrite ^(.*)$ /msie/$1 break;}
2) 文件及目录匹配,其中:
-f和!-f用来判断是否存在文件
-d和!-d用来判断是否存在目录 -e和!-e用来判断是否存在文件或目录 -x和!-x用来判断文件是否可执行举例:if (!-f $request_filename) {proxy_pass http://127.0.0.1;}
11. location命令
location表达式类型
~ 表示执行一个正则匹配,区分大小写
~* 表示执行一个正则匹配,不区分大小写^~ 表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其他location。= 进行普通字符精确匹配。也就是完全匹配。@ "@" 定义一个命名的 location,使用在内部定向时,例如 error_page, try_fileslocation优先级
在nginx的location和配置中location的顺序没有太大关系。正location表达式的类型有关。相同类型的表达式,字符
串长的会优先匹配。
以下是按优先级排列说明:
第一优先级:等号类型(=)的优先级最高。一旦匹配成功,则不再查找其他匹配项。第二优先级:^~类型表达式。一旦匹配成功,则不再查找其他匹配项。第三优先级:正则表达式类型(~ ~*)的优先级次之。如果有多个location的正则能匹配的话,则使用正则表达式最长的那个。第四优先级:常规字符串匹配类型。按前缀匹配。12. nginx全局变量
arg_PARAMETER #这个变量包含GET请求中,如果有变量PARAMETER时的值。args #这个变量等于请求行中(GET请求)的参数,如:foo=123&bar=blahblah;binary_remote_addr #二进制的客户地址。body_bytes_sent #响应时送出的body字节数数量。即使连接中断,这个数据也是精确的。content_length #请求头中的Content-length字段。content_type #请求头中的Content-Type字段。cookie_COOKIE #cookie COOKIE变量的值document_root #当前请求在root指令中指定的值。document_uri #与uri相同。host #请求主机头字段,否则为服务器名称。hostname #Set to themachine’s hostname as returned by gethostnamehttp_HEADERis_args #如果有args参数,这个变量等于”?”,否则等于”",空值。http_user_agent #客户端agent信息http_cookie #客户端cookie信息limit_rate #这个变量可以限制连接速率。query_string #与args相同。request_body_file #客户端请求主体信息的临时文件名。request_method #客户端请求的动作,通常为GET或POST。remote_addr #客户端的IP地址。remote_port #客户端的端口。remote_user #已经经过Auth Basic Module验证的用户名。request_completion #如果请求结束,设置为OK. 当请求未结束或如果该请求不是请求链串的最后一个时,为空(Empty)。request_method #GET或POSTrequest_filename #当前请求的文件路径,由root或alias指令与URI请求生成。request_uri #包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。不能修改。scheme #HTTP方法(如http,https)。server_protocol #请求使用的协议,通常是HTTP/1.0或HTTP/1.1。server_addr #服务器地址,在完成一次系统调用后可以确定这个值。server_name #服务器名称。server_port #请求到达服务器的端口号。附上一个nginx.conf样板:
user nobody nobody; worker_processes 2; error_log /usr/local/nginx/logs/nginx_error.log crit; pid /usr/local/nginx/logs/nginx.pid; worker_rlimit_nofile 51200; events { use epoll; worker_connections 6000; } http { include mime.types; default_type application/octet-stream; server_names_hash_bucket_size 3526; server_names_hash_max_size 4096; log_format combined_realip '$remote_addr $http_x_forwarded_for [$time_local]' '$host "$request_uri" $status' '"$http_referer" "$http_user_agent"'; sendfile on; tcp_nopush on; keepalive_timeout 30; client_header_timeout 3m; client_body_timeout 3m; send_timeout 3m; connection_pool_size 256; client_header_buffer_size 1k; large_client_header_buffers 8 4k; request_pool_size 4k; output_buffers 4 32k; postpone_output 1460; client_max_body_size 10m; client_body_buffer_size 256k; client_body_temp_path /usr/local/nginx/client_body_temp; proxy_temp_path /usr/local/nginx/proxy_temp; fastcgi_temp_path /usr/local/nginx/fastcgi_temp; fastcgi_intercept_errors on; tcp_nodelay on; gzip on; gzip_min_length 1k; gzip_buffers 4 8k; gzip_comp_level 5; gzip_http_version 1.1; gzip_types text/plain application/x-javascript text/css text/htm application/xml; server { listen 80; server_name localhost; index index.html index.htm index.php; root /usr/local/nginx/html; location ~ \.php$ { include fastcgi_params; fastcgi_pass unix:/tmp/php-fcgi.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name; } } }