Nginx 安装完以后位于 /usr/local/nginx 路径下,配置文件为 /usr/local/nginx/conf/nginx.conf。php
如下是默认配置html
#user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # #location ~ \.php$ { # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #} # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} } # another virtual host using mix of IP-, name-, and port-based configuration # #server { # listen 8000; # listen somename:8080; # server_name somename alias another.alias; # location / { # root html; # index index.html index.htm; # } #} # HTTPS server # #server { # listen 443 ssl; # server_name localhost; # ssl_certificate cert.pem; # ssl_certificate_key cert.key; # ssl_session_cache shared:SSL:1m; # ssl_session_timeout 5m; # ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on; # location / { # root html; # index index.html index.htm; # } #} }
Nginx 代理配置nginx
使用 upstream 增长一组处理请求的 serverweb
... upstream myserver { server 192.168.10.1:8080; server 192.168.10.2:8080; } ... server { ... location / { proxy_pass http://myserver; #请求转向myserver 定义的服务器列表 } ... } ...
这样全部的请求都会按必定的策略被分配到 myserver 这个组里面的ip地址上。正则表达式
Nginx 有3种轮询策略:轮询,加权轮询,ip_hash。服务器
轮询:nginx默认就是轮询其权重都默认为1,服务器处理请求的顺序:ABABABABAB....cookie
upstream myserver { server 192.168.10.1:8080; server 192.168.10.2:8080; }
加权轮询:跟据配置的权重的大小而分发给不一样服务器不一样数量的请求。下面服务器的请求顺序为:ABBABBABBABBABB....session
upstream myserver { server 192.168.10.1:8080 weight=1; server 192.168.10.2:8080 weight=2; }
ip_hash:nginx会让相同的客户端ip请求相同的服务器。app
upstream myserver { ip_hash; server 192.168.10.1:8080; server 192.168.10.2:8080; }
还有一种是 热备:若是你有2台服务器,当一台服务器发生事故时,才启用第二台服务器给提供服务。服务器处理请求的顺序:AAAAAA忽然A挂啦,BBBBBBBBBBBBBB.....tcp
upstream myserver { server 192.168.10.1:8080; server 192.168.10.2:8080 backup; }
listen 配置
Nginx 配置文件至少包含一个 server 命令 ,用来定义虚拟服务器。当请求到来时, Nginx 会首先选择一个虚拟服务器来处理该请求。
http { ... server { # Server configuration } ... }
server 配置块使用 listen 命令监听本机 IP 和端口号
... server { listen 80; server_name localhost; ... } server { listen 8080; server_name somename:8080; ... } server { listen 443 ssl; server_name localhost; ... } ...
location 配置
nginx 会根据 location 配置来决定应该如何处理接收到的请求。
... location /images/ { root /data/images; } location / { proxy_pass http://192.168.10.1; } ...
全部 /images/ 开头的请求都会直接访问服务器的文件, 其他的请求都被代理到 192.168.10.1 这个服务器上面。如请求为 /images/1.jpg 被代理后返回 /data/images/1.jpg 这个文件。
location 支持正则表达式,而且匹配规则有必定的优先级。
location 表达式
~ 表示执行一个正则匹配,区分大小写 ~* 表示执行一个正则匹配,不区分大小写 ^~ 表示普通字符匹配。使用前缀匹配。若是匹配成功,则再也不匹配其余location。 = 进行普通字符精确匹配。也就是彻底匹配。 @ 它定义一个命名的 location,使用在内部定向时,例如 error_page, try_files
location 优先级
1.等号类型(=)的优先级最高。一旦匹配成功,则再也不查找其余匹配项。 2.^~类型表达式。一旦匹配成功,则再也不查找其余匹配项。 3.正则表达式类型(~ ~*)的优先级次之。若是有多个location的正则能匹配的话,则使用正则表达式最长的那个。 4.常规字符串匹配类型。按前缀匹配。
(location =) > (location 完整路径) > (location ^~ 路径) > (location ~,~* 正则顺序) > (location 部分起始路径) > (/)
#以/开头的请求,优先级最低 location / { [A] } #精确匹配 / 的请求 location = / { [B] } #以/images/开头的请求 location /images/ { [C] } #以/images/Abc 开头的请求 location ~ /images/Abc { [D] } #以 /images/ 开头的请求, 匹配成功以后则不继续往下匹配 location ^~ /images/ { [E] } #匹配以 .jpg .png 结尾的请求,不区分大小写 location ~* \.(jpg|png)$ { [F] } #以/images/abc 开头的请求 location ~ /images/abc { [H] }
/ -> 规则 B
彻底匹配
/images/1.gif -> 规则 E
^~ 前缀匹配 若是匹配成功则中止往下搜索
/images/abc/def -> 规则 E
先匹配到 H 继续往下查找,匹配到 E 中止往下搜索
针对请求参数代理到不一样服务器
http { upstream server1 { server 192.168.10.1:8080; } upstream server2 { server 192.168.10.2:8081; } ... server { ... set $backend_server "server1"; if ( $request_uri ~ "^arg=baz$" ) { set $backend_server "server2"; } location /index.php { proxy_pass http://$backend_server; } } }
使用 if 命令 判断 /index.php 请求的参数 arg 是否是等于 baz,若是是 请求被代理到 192.168.10.2:8081,若是不是 请求被代理到 192.168.10.1:8080。如 /index.php?arg=aa 被代理到 192.168.10.1:8080,/index.php?arg=baz 被代理到 192.168.10.2:8080。
内置变量
$args
:这个变量等于请求行中的参数,同$query_string
$content_length
:请求头中的Content-length字段。
$content_type
:请求头中的Content-Type字段。
$document_root
: 当前请求在root指令中指定的值。
$host
: 请求主机头字段,不然为服务器名称。
$http_user_agent
: 客户端agent信息
$http_cookie
: 客户端cookie信息
$limit_rate
: 这个变量能够限制链接速率。
$request_method
: 客户端请求的动做,一般为GET或POST。
$remote_addr
: 客户端的IP地址。
$remote_port
: 客户端的端口。
$remote_user
: 已经通过Auth Basic Module验证的用户名。
$request_filename
: 当前请求的文件路径,由root或alias指令与URI请求生成。
$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相同。
proxy_pass url 后面加不加 / 的问题
在nginx中配置proxy_pass时,当在后面的url加上了/,至关因而绝对根路径,则nginx不会把location中匹配的路径部分代理走;若是没有/,则会把匹配的路径部分也给代理走。
用http://192.168.10.3/proxy/test.html 进行访问。
第一种:
location /proxy/ { proxy_pass http://127.0.0.1:8081/; }
会被代理到http://127.0.0.1:8081/test.html 这个url
第二种:
location /proxy/ { proxy_pass http://127.0.0.1:8081; }
会被代理到http://127.0.0.1:8081/proxy/test.html 这个url
第三种:
location /proxy/ { proxy_pass http://127.0.0.1:8081/ftlynx/; }
会被代理到http://127.0.0.1:8081/ftlynx/test.html 这个url
第四种:
location /proxy/ { proxy_pass http://127.0.0.1:8081/ftlynx; }
会被代理到http://127.0.0.1:8081/ftlynxtest.html 这个url
参考连接
http://www.cnblogs.com/knowledgesea/p/5199046.html
https://lufficc.com/blog/configure-nginx-as-a-web-server