Nginx基本配置

location的模式匹配按照优先级由低到高有以下四种:

1:location = URI { }花括号在的规则只对当前URI匹配,如果为目录只对目录匹配

2:location ^~URI { }不用正则表达式进行逐字符匹配

3:location ~* URI{ }不区分大小写花括号在的规则对URI进行模式匹配,URI可以用正则表达式

location ~ URI { }区分大小写花括号在的规则对URI进行模式匹配,URI可以用正则表达式

4:location URI  { }花括号中的规则对URI中所有路径包括子目录都匹配

location URI { } 花括号中的规则对URI中所有路径包括子目录都匹配

如 location ~ \.php$ {

fastcgi_pass 127.0.0.1:9000;

}

所有的以.php结尾的URI都有fastcgi转发到本机的9000端口处理(php监听在9000端口)

不用模式匹配的location定义

location /forum/ {

proxy_pass http://192.168.139.8:8080/bbs/;

}

如访问www.baidu.com/forum/ 则相当于访问后端的http://192.168.139.8:8080/bbs/

使用模式匹配定义location时,后面的http://路径只能写到端口处,不能出现URI

如 location ~* ^/forum {

proxy_pass http://192.168.139.8:8080;

}

不区分大小写匹配所有以forum开头的URI,转发到 http://192.168.139.8:8080/forum

如访问www.baidu.com/forum相当于访问http://192.168.139.8:8080/forum

[[email protected] html]# vim /etc/nginx/nginx.conf

location /forum {

proxy_pass http://192.168.139.8/bbs;

}

[[email protected] html]# service nginx reload

[[email protected] bbs]# vim /var/www/html/bbs/index.html

<h1>Nginx on Backup</h1>

[[email protected] bbs]# service httpd restart

[[email protected] html]# vim /etc/nginx/nginx.conf

location ~ ^/hehe {

proxy_pass http://192.168.139.8;

}

[[email protected] html]# service nginx reload

[[email protected] bbs]# vim /var/www/html/hehe/index.html

<h1>This Backup Server</h1>

[[email protected] html]# service httpd restart

将所有的请求都转发到后端192.168.139.8/bbs/

location /   {

proxy_pass http://192.168.139.8/bbs;

}

通过分析后端server的日志可以看到所有的访问client_ip都是来自node2(node2只是个代理服务器,记录他的ip不能进行client来源分析)没有记录真正的client_ip

[[email protected] bbs]# tail /var/log/httpd/access_log

192.168.139.4 - - [24/Dec/2016:18:05:59 +0800] "GET /hehe HTTP/1.0" 301 313 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36"

192.168.139.4 - - [24/Dec/2016:18:05:59 +0800] "GET /hehe/ HTTP/1.0" 200 28 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36"

日志变量有:

$remote_addr client_ip

$remote_port client_port

$remote_user client_user (基于用户认证时)

$request_body 请求主题

$request_method 请求方法

put get post delete options trace connection head

$server_addr server_ip

$server_port server_port

$server_name server_name

$server_protol http1.0/1.1

$uri 请求的正真uri

定义日志记录client来源

location ~ ^/hehe {

proxy_pass http://192.168.139.8;

proxy_set_header X-Real-IP $remote_ddr;

}

real-ip由前端代理服务器传过来了,但也要改一下后端server的日志记录格式

[[email protected] html]# vim /etc/httpd/conf/httpd.conf

LogFormat "%{X-Real-IP}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

[[email protected] html]# service httpd restart

浏览器多访问几次 http://192.168.139.4/hehe/

[[email protected] html]# tail /var/log/httpd/access_log

192.168.139.1 - - [24/Dec/2016:18:23:28 +0800] "GET /hehe/ HTTP/1.0" 304 - "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36"

192.168.139.1 - - [24/Dec/2016:18:23:28 +0800] "GET /hehe/ HTTP/1.0" 304 - "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36"

192.168.139.1 - - [24/Dec/2016:18:23:28 +0800] "GET /hehe/ HTTP/1.0" 304 - "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36"

192.168.139.1 - - [24/Dec/2016:18:23:29 +0800] "GET /hehe/ HTTP/1.0" 304 - "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36"

可以看到client_ip 192.168.139.1(而不是node2的IP_192.168.139.4)

Nginx的upstream端定义:将多个server做成一个负载均衡的集群,默认使用wrr调度算法(权重一样则为rr,权重为0 ,则不加入集群)

[[email protected] html]# vim /etc/nginx/nginx.conf

upstream my_web_server  { #upstream在server外定义

my_web_server为集群名,要引用  server 192.168.139.8 weight=1;

server 192.168.139.9 weight=1;

}

location / {

root   /web/html;

index  index.html index.htm;

proxy_pass http://my_web_server/; #转发到my_web_server集群

proxy_set_header X-Real_IP $remote_addr;

}

[[email protected] html]# service nginx reload

刷新

upstream还可以为后端server做健康状态检查,万一两个后端server都挂了,准备一个sorry页面

[[email protected] html]# vim /etc/nginx/nginx.conf

upstream my_web_server {

server 192.168.139.8 weight=1  max_fails=2 fail_timeout=2 ;

server 192.168.139.9 weight=1  max_fails=2 fail_timeout=2 ;

server 127.0.0.1:8080 backup ;

}

server { listen 8080;

server_name localhost;

root /web/error;

index index.html;

}

[[email protected] html]# vim /web/error/index.html

<h1>Sorry......</h1>

[[email protected] html]# service nginx reload

[[email protected] html]# service httpd  stop

[[email protected] html]# service httpd  stop

[[email protected] html]# service httpd  start

[[email protected] ~]# service httpd start

Nginx支持三种负载均衡的调度算法:

1:wrr(weight round robin 加权轮调) 如果权重相同则为rr(轮调),每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响。Weight 指定轮询权值,Weight值越大,分配到的访问机率越高,主要用于后端每个服务器性能不均的情况下

2:ip_hash (ip_哈希) server端会将client的访问IP做一个哈希运算,并将结果保存在本地内存中的哈希表中,这样对IP运算结果的相同的client会被始终分发给通一个后端RS_Server,从而不会出现client因为访问的是不同server造成的没有session信息的问题(其实要根本解决session问题,还是要加一个共享存储,比如那台server挂了,这时client请求肯定会发给其他server,可以将session信息保存在memory cache中实现session共享)

3:least_conn (最小连接数)比较当前节点上活动连接数+非活动连接数,输小给谁发,这是一种动态调度算法,如active*256+inactive

注:使用ip_hash时要将backup去掉,万一定向到backup_server上,即使RS_Server恢复正常,也不会再给转发

[[email protected] html]# vim /etc/nginx/nginx.conf

upstream my_web_server {

server 192.168.139.8 weight=1  max_fails=2 fail_timeout=2 ;

server 192.168.139.9 weight=1  max_fails=2 fail_timeout=2 ;

ip_hash;

}

[[email protected] html]# service nginx reload

一直刷新都是定向在node4

为了减轻后端RS的压力,Nginx应该启用本地缓存,其缓存有两种形式

1:在共享内存中,缓存键和缓存对象的元数据(主要用于在内存中查找数据)

2:在磁盘空间中,存储数据(如静态、或者经过静态处理的动态数据)在磁盘中,为了提高效率,可以用SSD作为本地磁盘,且可以将多块SSD做成一个Raid0,那速度老快了

根据请求方法进行缓存

proxy_cache_methods GET HEAD POST;#这三种请求方法的请求进行缓存

根据状态码进行缓存

proxy_cache_valid 200 302 10m ;#状态码为200 302 的请求缓存10min

proxy_cache_valid 404      1m; #状态码为200 的请求缓存1min

proxy_cache_valid any 5m; #其他的状态码缓存5min

根据相同请求的次数进行缓存

proxy_cache_min_uses 5; #只有当相同请求出现5次才对其进行缓存

更详细的缓存介绍请看官网 https://www.nginx.com/resources/admin-guide/content-caching/

proxy_cache_path ; 缓存的保存路径,不能定义在server{ }段中

keys_zone=first:20m; 用来存储键的区域名叫first,大小为20M

max_size=1G ; 最多用1 G的内存进行缓存,如果缓存空间满了,Nginx的cache_manager进程会根据最近最少连接原则进行缓存清除

[[email protected] html]# vim /etc/nginx/nginx.conf

upstream my_web_server {

server 192.168.139.8 weight=1  max_fails=2 fail_timeout=2 ;

server 192.168.139.9 weight=1  max_fails=2 fail_timeout=2 ;

ip_hash;

}

proxy_cache_path /nginx/cache/my_cache levels=1:2 keys_zone=first:20M;

server {

listen       80;

server_name  localhost;

add_header X_cache "$upstream_cache_status from $server_addr"

配置文件时;前忘了加"结果一直 nginx: [emerg] unexpected end of file, expecting "}" in /etc/nginx/nginx.con,差点将整个文件删了^_^

location / {

root   /web/html;

index  index.html index.htm;

proxy_pass http://my_web_server/;

proxy_set_header X-Real_IP $remote_addr;

proxy_cache first;

proxy_cache_valid 200 10m;

}

.......

}

[[email protected] html]# mkdir -pv /nginx/cache/my_cache

[[email protected] html]# service nginx reload

浏览器访问:192.168.139.4 Ctrl+F5 强制刷新页面,按F12键,弹出开发者页面,点击Network便可看到下面内容,在Response Headers段 HIT from 192.168.139.4 (从192.168.139.4命中)

    1. Request URL:

      http://192.168.139.4/

    2. Request Method:

      GET

    3. Status Code:

      304 Not Modified

    4. Remote Address:

      192.168.139.4:80

  1. Response Headersview source
    1. Connection:

      keep-alive

    2. Date:

      Sat, 24 Dec 2016 12:31:37 GMT

    3. ETag:

      "dfea9-17-54411d5f3b69e"

    4. Last-Modified:

      Tue, 20 Dec 2016 07:17:58 GMT

    5. Server:

      nginx/1.10.2

    6. X-cache:

      HIT from 192.168.139.4

  2. Request Headersview source
    1. Accept:

      text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8

    2. Accept-Encoding:

      gzip, deflate, sdch

    3. Accept-Language:

      zh-CN,zh;q=0.8

    4. Cache-Control:

      max-age=0

    5. Connection:

      keep-alive

    6. Host:

      192.168.139.4

    7. If-Modified-Since:

      Tue, 20 Dec 2016 07:17:58 GMT

    8. If-None-Match:

      "dfea9-17-54411d5f3b69e"

    9. Upgrade-Insecure-Requests:

      1

    10. User-Agent:

      Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36

删除本地缓存再刷新一次

[[email protected] 5b]# rm /nginx/cache/my_cache/b/5b/d0f1246dc67a25097fa3a295a393f5bb

  1. Connection:

    keep-alive

  2. Date:

    Sat, 24 Dec 2016 12:38:29 GMT

  3. ETag:

    "dfea9-17-54411d5f3b69e"

  4. Last-Modified:

    Tue, 20 Dec 2016 07:17:58 GMT

  5. Server:

    nginx/1.10.2

  6. X-cache:

    MISS from 192.168.139.4 #MISS代表缓存未命中

再刷新一次

  1. Connection:

    keep-alive

  2. Date:

    Sat, 24 Dec 2016 12:39:37 GMT

  3. ETag:

    "dfea9-17-54411d5f3b69e"

  4. Last-Modified:

    Tue, 20 Dec 2016 07:17:58 GMT

  5. Server:

    nginx/1.10.2

  6. X-cache:

    HIT from 192.168.139.4 #缓存又命中了

  7. miss :缓存未命中
  8. hit :缓存命中
  9. expired : 缓存已过期

updating :缓存内容已经更新

stale : 缓存已经失效

除了以上缓存外,还有fastcgi_cache,可以缓存php脚本处理的结果,及php代码编译的opcode,但一般来说动态响应内容往往不一样,只能讲那些经常请求的动态资源进行缓存,这时可以根据最少相同访问次数来设定缓存,fastcgi也有自己的缓存配置(将尽量多的动态资源进行静态化,是一个好的大型站点必须做好的事)

open_log_cache: 还有日志缓存

open_file_cache:将文件的元数据缓存再Nginx的内存中

对于一个大型站点来说,一个集群组可能不能满足其需求,这时就需要多个集群组进行不同的分工处理不同的请求,可以采取如下操作解决

1:专门处理php动态请求的集群

upstream php_servers {

server 192.168.139.11....;

server 192.168.139.12.....;

......

}

2:专门处理图片请求的集群

upstream  img_servers {

server 192.168.139.20....;

server 192.168.139.21.....;

......

}

3:处理其他请求的集群

upstream  other_servers {

server 192.168.139.30....;

server 192.168.139.31.....;

......

}

定义location,根据URI进行匹配(记住location几种模式匹配优先级奥^_^)

location  /     {

proxy_pass http://other_servers;

}

location ~* \.php$ {

fastcgi_pass http://img_servers;

}

location ~* "\.(jpg|gpeg|gif|png)$" {

proxy_pass http://php_server;

}

时间: 2024-10-13 23:24:37

Nginx基本配置的相关文章

linux下Nginx配置文件(nginx.conf)配置设置详解(windows用phpstudy集成)

linux备份nginx.conf文件举例: cp /usr/local/nginx/nginx.conf /usr/local/nginx/nginx.conf-20171111(日期) 在进程列表里 面找master进程,它的编号就是主进程号. ps -ef | grep nginx 查看进程 cat /usr/local/nginx/nginx.pid 每次修改完nginx文件都要重新加载配置文件linux命令: /usr/local/nginx -t //验证配置文件是否合法 若ngin

nginx安装配置

一.下载Nginx源文件 进入nginx官网下载nginx的稳定版本,我下载的是1.10.0. 下载:wget http://nginx.org/download/nginx-1.10.0.tar.gz 解压:tar -zxvf nginx-1.10.0.tar.gz 二.检查安装依赖项 执行下面的命令安装nginx的依赖库: yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel11 三.配置Nginx安

FastDFS的php和nginx模块配置

一.FastDFS和php整合 1.安装php # 安装依赖包 yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel cu

Nginx下配置ThinkPHP的URL Rewrite模式和pathinfo模式支持

前面有关于lnmp环境的搭建,在此就不在赘述.下面就简述thinkPHP如何在nginx下开启url_rewrite和pathinfo模式支持 主要有两个步骤: 一.更改php.ini将;cgi.fix_pathinfo=0  改为cgi.fix_pathinfo=1 二.更改nginx配置文件中php的location设置pathinfo模式: location ~ \.php { root html; fastcgi_pass 127.0.0.1:9000; fastcgi_index in

dva+antd写的一个react例子--服务器nginx 的配置

location ^~ /crm { rewrite ^/crm/(.*)(\.js|\.css|\.png|\.jpg|\.jpeg|\.gif|index\.php|robots\.txt)$ /$1$2 break; rewrite .* /index.html break; root /etc/nginx/static2/CIF_crm-frontend/dist/crm/; } 以上是nginx的配置 { "entry": "src/index.js",

Nginx安装配置(转)

Nginx 安装配置 Nginx("engine x")是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器. 在高连接并发的情况下,Nginx是Apache服务器不错的替代品. Nginx 安装 系统平台:CentOS release 6.6 (Final) 64位. 一.安装编译工具及库文件 yum -y install make zlib zlib-devel gcc-c++ libtoo

Nginx + PHP 配置

最近在学习php的时候了解到了,顺便了解了一下php服务器的运行环境,php最常用的服务器肯定是Apache了,不过这几年Nginx发展也很快,相比Apache而言,它除了抗高并发以外,搭建环境的的时候配置也比较容易,在windows下几乎不需要任何安装步骤,只需要在控制台启动 .exe 程序就行了,而且反向代理机制也是一种比较灵活的机制. 1.在配置一个环境之前,我们先要下载php和nginx ,它们都可以在各自官网下载到,目前nginx最新稳定版是nginx 1.6,在下载php的时候要注意

nginx 转发配置

Nginx配置proxy_pass转发的/路径问题 在nginx中配置proxy_pass时,如果是按照^~匹配路径时,要注意proxy_pass后的url最后的/,当加上了/,相当于是绝对根路径,则nginx不会把location中匹配的路径部分代理走;如果没有/,则会把匹配的路径部分也给代理走. location ^~ /static_js/ { proxy_cache js_cache; proxy_set_header Host js.test.com; proxy_pass http:

nginx常用配置系列-虚拟主机

本来准备详尽的出一份nginx配置讲解,但nginx功能配置繁多,平常使用中使用最多的一般有: 1. 虚拟主机配置 2. HTTPS配置 3. 静态资源处理 4. 反向代理 ================= 虚拟主机配置 ================= 先说虚拟主机配置,nginx的核心配置文件在nginx的安装目录下conf目录中(如果是CentOS通过yum安装则在/etc/nginx目录中) 在conf目录下创建vhost目录,方便管理虚拟主机的配置文件 mkdir vhost 以e

Keepalived && Nginx 高可用性配置

keepalived是一个用于做双机热备(HA)的软件,常和haproxy联合起来做热备+负载均衡,达到高可用. 运行原理 keepalived通过选举(看服务器设置的权重)挑选出一台热备服务器做MASTER机器,MASTER机器会被分配到一个指定的虚拟ip,外部程序可通过该ip访问这台服务器,如果这台服务器出现故障(断网,重启,或者本机器上的keepalived crash等),keepalived会从其他的备份机器上重选(还是看服务器设置的权重)一台机器做MASTER并分配同样的虚拟IP,充