1.nginx介绍

Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。
Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。
其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

nginx的特性

  • 静态资源高速高并发访问及缓存
  • 反向代理加速,数据缓存
  • 简单负载均衡,节点健康检查容错功能
  • FastCGI服务的缓存加速
  • 支持FastCGI,Uwsgi,SCGI,Memcached Servers的加速和缓存
  • 支持SSL,TLS,SNI
  • 具有模块化结构:过滤器包括gzip压缩,ranges支持,chunked响应,XSLT,SSL及图像缩放等功能。在SSI过滤器中,一个包含多个SSI的页面,如果经由FastCGI或反向代理处理,可被并行处理。

nginx的优点

  • 高并发连接:官方测试能够支撑5万并发连接,在实际生产环境中跑到2-3万并发连接数
  • 内存消耗少:在3万并发连接下,开启的10个nginx进程才消耗150M内存(15M*10=150M)
  • 配置文件非常简单:风格跟程序一样通俗易懂
  • 成本低廉:nginx为开源软件,可以免费使用。而购买F5 BIG-IP、NetScaler等硬件负载均衡交换机则需要十多万至几十万人民币
  • 支持Rewrite重写规则:能够根据域名、URL的不同,将HTTP请求分到不同的后端服务器群组
  • 内置的健康检查功能:如果Nginx Proxy后端的某台Web服务器宕机了,不会影响前端访问
  • 节省带宽:支持GZIP压缩,可以添加浏览器本地缓存的Header头
  • 稳定性高:用于反向代理,宕机的概率微乎其微
  • 模块化设计:模块可以动态编译
  • 外围支持好:文档全,二次开发和模块较多
  • 支持热部署:可以不停机重载配置文件
  • 支持事件驱动、AIO(AsyncIO,异步IO)、mmap(Memory Map,内存映射)等性能优化

nginx的基本功能

  • 静态资源的web服务器,能缓存打开的文件描述符
  • http、smtp、pop3协议的反向代理服务器
  • 缓存加速、负载均衡
  • 支持FastCGI(fpm,LNMP),uWSGI(Python)等
  • 模块化(非DSO机制),过滤器zip、SSI及图像的大小调整
    支持SSL

nginx的扩展功能

  • 基于名称和IP的虚拟主机
  • 支持keepalive
  • 支持平滑升级
  • 定制访问日志、支持使用日志缓冲区提高日志存储性能
  • 支持URL重写
  • 支持路径别名
  • 支持基于IP及用户的访问控制
  • 支持速率限制,支持并发数限制

nginx的应用类别

  • 使用nginx结合FastCGI运行PHP、JSP、Perl等程序
  • 使用nginx作反向代理、负载均衡、规则过滤
  • 使用nginx运行静态HTML网页、图片
  • nginx与其他新技术的结合应用

2.nginx的模块介绍

nginx的模块从结构上分为核心模块、基础模块和第三方模块

  • HTTP模块、EVENT模块和MAIL模块等属于核心模块
  • HTTP Access模块、HTTP FastCGI模块、HTTP Proxy模块和HTTP Rewrite模块属于基本模块
  • HTTP Upstream模块、Request Hash模块、Notice模块和HTTP Access Key模块属于第三方模块

nginx模块从功能上分为三类,分别是:

  • Handlers(处理器模块)。此类模块直接处理请求,并进行输出内容和修改headers信息等操作。handlers处理器模块一般只能有一个
  • Filters(过滤器模块)。此类模块主要对其他处理器模块输出的内容进行修改操作,最后由nginx输出
  • Proxies(代理器模块)。就是nginx的HTTP Upstream之类的模块,这些模块主要与后端一些服务比如fastcgi等操作交互,实现服务代理和负载均衡等功能

nginx模块分为:核心模块、事件模块、标准Http模块、可选Http模块、邮件模块、第三方模块和补丁等

nginx基本模块:

  • 所谓基本模块,指的是nginx默认的功能模块,它们提供的指令,允许你使用定义nginx基本功能的变量,在编译时不能被禁用,包括:

    • 核心模块:基本功能和指令,如进程管理和安全。常见的核心模块指令,大部分是放置在配置文件的顶部
    • 事件模块:在Nginx内配置网络使用的能力。常见的events(事件)模块指令,大部分是放置在配置文件的顶部
    • 配置模块:提供包含机制

3.nginx的工作原理

Nginx本身做的工作实际很少,当它接到一个HTTP请求时,它仅仅是通过查找配置文件将此次请求映射到一个location block,而此location中所配置的各个指令则会启动不同的模块去完成工作,因此模块可以看做Nginx真正的劳动工作者。通常一个location中的指令会涉及一个handler模块和多个filter模块(当然,多个location可以复用同一个模块)。handler模块负责处理请求,完成响应内容的生成,而filter模块对响应内容进行处理。

Nginx的模块直接被编译进Nginx,因此属于静态编译方式。启动Nginx后,Nginx的模块被自动加载,不像Apache,首先将模块编译为一个so文件,然后在配置文件中指定是否进行加载。在解析配置文件时,Nginx的每个模块都有可能去处理某个请求,但是同一个处理请求只能由一个模块来完成。

nginx有两类进程,一类称为master进程(相当于管理进程),另一类称为worker进程(实际工作进程)。启动方式有两种:

(1)单进程启动:此时系统中仅有一个进程,该进程既充当master进程的角色,也充当worker进程的角色。

(2)多进程启动:此时系统有且仅有一个master进程,至少有一个worker进程工作。

master进程主要进行一些全局性的初始化工作和管理worker的工作;事件处理是在worker中进行的。
nginx的进程启动过程是在ngx_master_process_cycle(src/os/unix/ngx_process_cycle.c)中完成的,在ngx_master_process_cycle中,会根据配置文件的worker_processes值创建多个子进程,即一个master进程和多个worker进程。进程之间、进程与外部之间保持通信。

nginx在启动后,在unix系统中会以daemon的方式在后台运行,后台进程包含一个master进程和多个worker进程。我们也可以手动地关掉后台模式,让nginx在前台运行,并且通过配置让nginx取消master进程,从而可以使nginx以单进程方式运行。

4.nginx的安装与配置

关闭防火墙及selinux

[root@wyt1 ~]# systemctl disable --now firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@wyt1 ~]# setenforce 0
[root@wyt1 ~]# sed -ri 's/^(SELINUX=).*/\1disabled/g' /etc/selinux/config

配置网络源

[root@wyt1 ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
[root@wyt1 ~]# sed -i 's/\$releasever/7/g' /etc/yum.repos.d/CentOS-Base.repo
[root@wyt1 ~]# sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
[root@wyt1 ~]# yum -y install vim wget
[root@wyt1 ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

创建nginx服务的用户和组

[root@wyt1 ~]# useradd -r -M -s /sbin/nologin nginx
[root@wyt1 ~]# id nginx
uid=997(nginx) gid=995(nginx) 组=995(nginx)

安装开发工具包

[root@wyt1 ~]#  yum -y groups mark install 'Development Tools'

安装依赖包

[root@wyt1 ~]# yum -y install pcre-devel openssl openssl-devel  gd gd-devel gcc gcc-c++

创建日志存放目录

[root@wyt1 ~]# mkdir -p /var/log/nginx
[root@wyt1 ~]# chown -R nginx.nginx /var/log/nginx

下载nginx解压

[root@wyt1 ~]# wget http://nginx.org/download/nginx-1.18.0.tar.gz
[root@wyt1 ~]# tar xf nginx-1.18.0.tar.gz
[root@wyt1 ~]# ls
anaconda-ks.cfg  nginx-1.18.0  nginx-1.18.0.tar.gz

编译安装

[root@wyt1 ~]# cd nginx-1.18.0
[root@wyt1 nginx-1.18.0]# ./configure \--prefix=/usr/local/nginx \--user=nginx \--group=nginx \--with-debug \--with-http_ssl_module \--with-http_realip_module \--with-http_image_filter_module \--with-http_gunzip_module \--with-http_gzip_static_module \--with-http_stub_status_module \--http-log-path=/var/log/nginx/access.log \--error-log-path=/var/log/nginx/error.log[root@wyt1 nginx-1.18.0]# make -j  `nproc`
[root@wyt1 nginx-1.18.0]# make install

配置环境变量

[root@wyt1 ~]# echo 'export PATH=/usr/local/nginx/sbin:$PATH' > /etc/profile.d/nginx.sh
[root@wyt1 ~]# source /etc/profile.d/nginx.sh
[root@wyt1 ~]# echo $PATH
/usr/local/nginx/sbin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

启动nginx

[root@wyt1 ~]# nginx
[root@wyt1 ~]# ss -antl
State      Recv-Q Send-Q Local Address:Port               Peer Address:Port
LISTEN     0      100    127.0.0.1:25                    *:*
LISTEN     0      128       *:80                    *:*
LISTEN     0      128       *:22                    *:*
LISTEN     0      100       [::1]:25                 [::]:*
LISTEN     0      128    [::]:22                 [::]:*

访问

5.nginx配置文件详解

主配置文件:/usr/local/nginx/conf/nginx.conf

  • 默认启动nginx时,使用的配置文件是:安装路径/conf/nginx.conf文件
  • 可以在启动nginx时通过-c选项来指定要读取的配置文件

nginx常见的配置文件及其作用

配置文件 作用
nginx.conf nginx的基本配置文件
mime.types MIME类型关联的扩展文件
fastcgi.conf 与fastcgi相关的配置
proxy.conf 与proxy相关的配置
sites.conf 配置nginx提供的网站,包括虚拟主机

nginx.conf的内容分为以下几段:

  • main配置段:全局配置段。其中main配置段中可能包含event配置段
  • event {}:定义event模型工作特性
  • http {}:定义http协议相关的配置

配置指令:要以分号结尾,语法格式如下:

derective value1 [value2 ...];

支持使用变量:

内置变量:模块会提供内建变量定义
自定义变量:set var_name value

用于调试、定位问题的配置参数

daemon {on|off};    //是否以守护进程方式运行nginx,调试时应设置为off
master_process {on|off};    //是否以master/worker模型来运行nginx,调试时可以设置为off
error_log 位置 级别;    //配置错误日志

正常运行必备的配置参数

user USERNAME [GROUPNAME];    //指定运行worker进程的用户和组
pid /path/to/pid_file;    //指定nginx守护进程的pid文件
worker_rlimit_nofile number;    //设置所有worker进程最大可以打开的文件数,默认为1024
worker_rlimit_core size;    //指明所有worker进程所能够使用的总体的最大核心文件大小,保持默认即可

优化性能的配置参数

worker_processes n;    //启动n个worker进程,这里的n为了避免上下文切换,通常设置为cpu总核心数-1或等于总核心数
worker_cpu_affinity cpumask ...;    //将进程绑定到某cpu中,避免频繁刷新缓存
//cpumask:使用8位二进制表示cpu核心,如:0000 0001   //第一颗cpu核心0000 0010   //第二颗cpu核心0000 0100   //第三颗cpu核心0000 1000   //第四颗cpu核心0001 0000   //第五颗cpu核心0010 0000   //第六颗cpu核心0100 0000   //第七颗cpu核心1000 0000   //第八颗cpu核心
timer_resolution interval;    //计时器解析度。降低此值,可减少gettimeofday()系统调用的次数
worker_priority number;    //指明worker进程的nice值

fastcgi的相关配置参数

LNMP:php要启用fpm模型
配置示例如下: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;
}

常需要进行调整的参数

worker_processes
worker_connections
worker_cpu_affinity
worker_priority

http{}段的配置参数

http{...}:配置http相关,由ngx_http_core_module模块引入。nginx的HTTP配置主要包括四个区块,结构如下:http {//协议级别include mime.types;default_type application/octet-stream;keepalive_timeout 65;gzip on;upstream {//负载均衡配置...}server {//服务器级别,每个server类似于httpd中的一个<VirtualHost>listen 80;server_name localhost;location / {//请求级别,类似于httpd中的<Location>,用于定义URL与本地文件系统的映射关系root html;index index.html index.htm;}}
}

http{}段配置指令

server {}:定义一个虚拟主机,示例如下:server {listen 80;server_name www.idfsoft.com;root "/vhosts/web";
}listen:指定监听的地址和端口listen address[:port];
listen port;

event{}段中的配置参数

accept_mutex {off|on};    //master调度用户请求至各worker进程时使用的负载均衡锁;on表示能让多个worker轮流地、序列化地去响应新请求
lock_file file;    //accept_mutex用到的互斥锁锁文件路径
use [epoll | rtsig | select | poll];    //指明使用的事件模型,建议让nginx自行选择
worker_connections #;    //每个进程能够接受的最大连接数

网络连接相关的配置参数

keepalive_timeout number;    //长连接的超时时长,默认为65s
keepalive_requests number;    //在一个长连接上所能够允许请求的最大资源数
keepalive_disable [msie6|safari|none];    //为指定类型的UserAgent禁用长连接
tcp_nodelay on|off;    //是否对长连接使用TCP_NODELAY选项,为了提升用户体验,通常设为on
client_header_timeout number;    //读取http请求报文首部的超时时长
client_body_timeout number;    //读取http请求报文body部分的超时时长
send_timeout number;    //发送响应报文的超时时长

当有多个server时,匹配顺序如下:

1. 先做精确匹配检查
2. 左侧通配符匹配检查,如*.idfsoft.com
3. 右侧通配符匹配检查,如mail.*
4. 正则表达式匹配检查,如~ ^.*\.idfsoft\.com$
5. default_server

root path; 设置资源路径映射,用于指明请求的URL所对应的资源所在的文件系统上的起始路径

alias path; 用于location配置段,定义路径别名

index file; 默认主页面

log_format 定义日志格式

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;
//注意:此处可用变量为nginx各模块内建变量

location区段,通过指定模式来与客户端请求的URI相匹配

//功能:允许根据用户请求的URI来匹配定义的各location,匹配到时,此请求将被相应的location配置块中的配置所处理,例如做访问控制等功能//语法:location [ 修饰符 ] pattern {......}

安装nginx-echo模块

//下载nginx-echo模块
[root@wyt1 ~]# wget https://github.com/openresty/echo-nginx-module/archive/v0.61.tar.gz//解压
[root@wyt1 ~]# tar xf v0.61.tar.gz//查看之前安装的编译参数
[root@wyt1 ~]# nginx -V
nginx version: nginx/1.18.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC)
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --with-debug --with-http_ssl_module --with-http_realip_module --with-http_image_filter_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_stub_status_module --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log//重新编译安装,在最后加上--add-module=/root/echo-nginx-module-0.61
[root@wyt1 ~]# cd nginx-1.18.0
[root@wyt1 nginx-1.18.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-debug --with-http_ssl_module --with-http_realip_module --with-http_image_filter_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_stub_status_module --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --add-module=/root/echo-nginx-module-0.61
[root@wyt1 nginx-1.18.0]# make//将nginx安装目录中的nginx文件备份
[root@wyt1 ~]# mv /usr/local/nginx/sbin/nginx /opt//将我们重新编译的nginx文件复制到nginx安装目录中
[root@wyt1 ~]# cp nginx-1.18.0/objs/nginx /usr/local/nginx/sbin///重载配置文件
[root@wyt1 ~]# nginx -s reload

常用修饰符说明:

修饰符 功能
= 精确匹配
~ 正则表达式模式匹配,区分大小写
~* 正则表达式模式匹配,不区分大小写
^~ 前缀匹配,类似于无修饰符的行为,也是以指定模块开始,不同的是,如果模式匹配,那么就停止搜索其他模式了,不支持正则表达式
@ 定义命名location区段,这些区段客户端不能访问,只可以由内部产生的请求来访问,如try_files或error_page等

使用正则表达式匹配uri

没有修饰符表示必须以指定模式开始

//任何location都可以匹配
[root@wyt1 ~]# vim /usr/local/nginx/conf/nginx.conflocation /abc {echo "没有修饰符";}//在另一台主机访问
[root@wyt2 ~]# curl http://192.168.179.128/abc
没有修饰符
[root@wyt2 ~]# curl http://192.168.179.128/abc/
没有修饰符
[root@wyt2 ~]# curl http://192.168.179.128/abc?p1=11
没有修饰符

=:表示必须与指定的模式精确匹配

[root@wyt1 ~]# vim /usr/local/nginx/conf/nginx.conflocation = /abc {echo "精确匹配";}//在另一台主机访问
[root@wyt2 ~]# curl http://192.168.179.128/abc
精确匹配
[root@wyt2 ~]# curl http://192.168.179.128/abc/
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.18.0</center>
</body>
</html>
[root@wyt2 ~]# curl http://192.168.179.128/abc?p1=11
精确匹配

~:表示指定的正则表达式要区分大小写

[root@wyt1 ~]# vim /usr/local/nginx/conf/nginx.conflocation ~ ^/abc$ {echo "正则表达式,区分大小写";}//在另一台主机访问
[root@wyt2 ~]# curl http://192.168.179.128/abc
正则表达式,区分大小写
[root@wyt2 ~]# curl http://192.168.179.128/abc/
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.18.0</center>
</body>
</html>
[root@wyt2 ~]# curl http://192.168.179.128/abc?p1=11&p2=22
正则表达式,区分大小写
[root@wyt2 ~]# curl http://192.168.179.128/ABC
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.18.0</center>
</body>
</html>

~*:表示指定的正则表达式不区分大小写

[root@wyt1 ~]# vim /usr/local/nginx/conf/nginx.conflocation ~* ^/abc$ {echo "正则表达式,不区分大小写";}//在另一台主机访问
[root@wyt2 ~]# curl http://192.168.179.128/abc
正则表达式,不区分大小写
[root@wyt2 ~]# curl http://192.168.179.128/abc/
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.18.0</center>
</body>
</html>
[root@wyt2 ~]# curl http://192.168.179.128/abc?p1=11&p2=22
正则表达式,不区分大小写
[root@wyt2 ~]# curl http://192.168.179.128/ABC
正则表达式,不区分大小写

^~ 匹配字符串开头

[root@wyt1 ~]# vim /usr/local/nginx/conf/nginx.conflocation ^~ /abc {echo "匹配开头";}//在另一台主机访问
[root@wyt2 ~]# curl http://192.168.179.128/abc
匹配开头
[root@wyt2 ~]# curl http://192.168.179.128/abc/
匹配开头
[root@wyt2 ~]# curl http://192.168.179.128/abc?p1=11&p2=22
匹配开头

查找顺序和优先级:由高到底依次为

  1. 带有=的精确匹配优先
  2. 正则表达式按照他们在配置文件中定义的顺序
  3. 带有^~修饰符的,开头匹配
  4. 带有*修饰符的,如果正则表达式与URI匹配
  5. 没有修饰符的精确匹配

访问控制

用于location段
allow:设定允许哪台或哪些主机访问,多个参数间用空格隔开
deny:设定禁止哪台或哪些主机访问,多个参数间用空格隔开示例:
allow 192.168.1.1/32 172.16.0.0/16;
deny all;

rewrite规则

常见的flag

flag 作用
last 基本上都用这个flag,表示当前的匹配结束,继续下一个匹配,最多匹配10个到20个 ,一旦此rewrite规则重写完成后,就不再被后面其它的rewrite规则进行处理,而是由UserAgent重新对重写后的URL再一次发起请求,并从头开始执行类似的过程
break 中止Rewrite,不再继续匹配,一旦此rewrite规则重写完成后,由UserAgent对新的URL重新发起请求,且不再会被当前location内的任何rewrite规则所检查
redirect 以临时重定向的HTTP状态302返回新的URL
permanent 以永久重定向的HTTP状态301返回新的URL

rewrite模块的作用是用来执行URL重定向。这个机制有利于去掉恶意访问的url,也有利于搜索引擎优化(SEO)

nginx使用的语法源于Perl兼容正则表达式(PCRE)库,基本语法如下:

标识符 意义
^ 必须以^后的实体开头
$ 必须以$前的实体结尾
. 匹配任意字符
[ ] 匹配指定字符集内的任意字符
[^] 匹配任何不包括在指定字符集内的任意字符串
| 匹配|之前或之后的实体
() 分组,组成一组用于匹配的实体,通常会有

配置

下载图片到本地的images目录

[root@wyt1 ~]# cd /usr/local/nginx/html
[root@wyt1 html]# ls
1.jpg  50x.html  images  index.html
[root@wyt1 html]# mkdir images
[root@wyt1 html]# mv 1.jpg images/
[root@wyt1 html]# ls images/
1.jpg[root@wyt1 ~]# vim /usr/local/nginx/conf/nginx.conflocation /images {alias html/images;  //配置访问图片位置}[root@wyt1 ~]# nginx -s reload
[root@wyt1 ~]# ss -antl
State      Recv-Q Send-Q Local Address:Port               Peer Address:Port
LISTEN     0      128         *:80                      *:*
LISTEN     0      128         *:22                      *:*
LISTEN     0      100    127.0.0.1:25                      *:*
LISTEN     0      128        :::22                     :::*
LISTEN     0      100       ::1:25                     :::*

访问图片

修改图片放置目录

[root@wyt1 html]# ls
50x.html  imgs  index.html
[root@wyt1 html]# ls imgs/
1.jpg

访问图片无法访问

修改配置文件访问图片

[root@wyt1 ~]# vim /usr/local/nginx/conf/nginx.conflocation /images {rewrite ^/images/(.*\.jpg)$ /imgs/$1 break;  //配置访问images目录图片自动跳转imgs目录图片}location /imgs {root html;}[root@wyt1 ~]# nginx -s reload

访问图片

配置图片地址访问

[root@wyt1 ~]# vim /usr/local/nginx/conf/nginx.conflocation /images {rewrite ^/images/(.*\.jpg)$ https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=1923748997,3473961248&fm=26&gp=0.jpg break; //图片地址访问}location /imgs {root html;}
[root@wyt1 ~]# nginx -s reload

访问图片

配置多个rewrite规则,执行多条URL

[root@wyt1 ~]# vim /usr/local/nginx/conf/nginx.conflocation /images {rewrite ^/images/(.*\.jpg)$ /imgs/$1 last;}location /imgs {rewrite ^/imgs/(.*\.jpg)$ http://www.baidu.com last; //设置访问图片跳转至百度}[root@wyt1 ~]# nginx -s reload

访问图片自动跳转至百度

if 基于浏览器实现分离

语法:if (condition) {…}

应用场景:

  • server段
  • location段
    常见的condition
  • 变量名(变量值为空串,或者以“0”开始,则为false,其它的均为true)
  • 以变量为操作数构成的比较表达式(可使用=,!=类似的比较操作符进行测试)
  • 正则表达式的模式匹配操作
    • ~:区分大小写的模式匹配检查
    • ~*:不区分大小写的模式匹配检查
    • !~和!~*:对上面两种测试取反
  • 测试指定路径为文件的可能性(-f,!-f)
  • 测试指定路径为目录的可能性(-d,!-d)
  • 测试文件的存在性(-e,!-e)
  • 检查文件是否有执行权限(-x,!-x)

if基于浏览器实现分离案例

[root@wyt1 ~]# cd /usr/local/nginx/html/
[root@wyt1 html]# mkdir chrome Internet
[root@wyt1 html]# ls
50x.html  chrome  imgs  index.html  Internet
[root@wyt1 html]# echo 'chrome test page.' > chrome/index.html //创建测试页面
[root@wyt1 html]# cat chrome/index.html
chrome test page.
[root@wyt1 html]# echo 'Internet test page.' > Internet/index.html //创建测试页面
[root@wyt1 html]# cat Internet/index.html
Internet test page.[root@wyt1 ~]# vim /usr/local/nginx/conf/nginx.conf //修改配置文件location / {if ($http_user_agent ~ Internet) {rewrite ^(.*)$ /IE/$1 break;}if ($http_user_agent ~ Chrome) {rewrite ^(.*)$ /chrome/$1 break;}root   html;index  index.html index.htm;}location /Internet {root   html;index  index.html;}location /chrome {root   html;index  index.html;}[root@wyt1 ~]# nginx -s reload

访问chrome浏览器

访问Internet浏览器

防盗链案例

location ~* \.(jpg|gif|jpeg|png)$ {valid_referers none blocked www.idfsoft.com;if ($invalid_referer) {rewrite ^/ http://www.idfsoft.com/403.html;}
}

反向代理与负载均衡

nginx通常被用作后端服务器的反向代理,这样就可以很方便的实现动静分离以及负载均衡,从而大大提高服务器的处理能力。

nginx实现动静分离,其实就是在反向代理的时候,如果是静态资源,就直接从nginx发布的路径去读取,而不需要从后台服务器获取了。

但是要注意,这种情况下需要保证后端跟前端的程序保持一致,可以使用Rsync做服务端自动同步或者使用NFS、MFS分布式共享存储。

Http Proxy模块,功能很多,最常用的是proxy_pass和proxy_cache

如果要使用proxy_cache,需要集成第三方的ngx_cache_purge模块,用来清除指定的URL缓存。这个集成需要在安装nginx的时候去做,如:
./configure --add-module=…/ngx_cache_purge-1.0 …

nginx通过upstream模块来实现简单的负载均衡,upstream需要定义在http段内

在upstream段内,定义一个服务器列表,默认的方式是轮询,如果要确定同一个访问者发出的请求总是由同一个后端服务器来处理,可以设置ip_hash

环境

主机名 IP 服务
wyt1 192.168.232.128 nginx
wyt2 192.168.232.129 httpd静态
wyt3 192.168.232.130 lnmp动态

wyt2配置nginx静态页面

[root@wyt2 ~]# cd /var/www/html/
[root@wyt2 html]# ls
[root@wyt2 html]# echo '01' > index.html
[root@wyt2 html]# systemctl start httpd
[root@wyt2 html]# ss -antl
State      Recv-Q Send-Q Local Address:Port               Peer Address:Port
LISTEN     0      128          *:22                       *:*
LISTEN     0      100    127.0.0.1:25                       *:*
LISTEN     0      128         :::80                      :::*
LISTEN     0      128         :::22                      :::*
LISTEN     0      100        ::1:25                      :::*

访问
wyt3配置lnmp(详情可查看文章lnmp部署)动态页面

wyt1配置反向代理负载均衡

[root@wyt1 ~]# vim /usr/local/nginx/conf/nginx.confupstream wyt {   server 192.168.232.129 weight=2;  //访问两次server 192.168.232.130 weight=1;  //访问一次}server {listen       80;server_name  localhost;location / {proxy_pass http://wyt;   //配置访问地址}

访问

刷新两次自动跳转php

wyt1配置反向代理负载均衡动静分离

[root@wyt1 ~]# vim /usr/local/nginx/conf/nginx.confupstream static {server 192.168.232.129 weight=1; //配置静态}upstream danamic {server 192.168.232.130 weight=1; //配置动态}server {listen       80;server_name  localhost;location / {proxy_pass http://static; //访问静态地址}location ~ \.php$ {proxy_pass http://danamic; //访问动态地址}

访问

Nginx简介及配置相关推荐

  1. Nginx 反向代理工作原理简介与配置详解

    Nginx 反向代理工作原理简介与配置详解 测试环境 CentOS 6.8-x86_64 nginx-1.10.0 下载地址:http://nginx.org/en/download.html 安装 ...

  2. Nginx简介配置及高可用详解

    1.Nginx简介 2.nginx指令配置详解 3.nginx负载均衡及反向代理实现 4.nginx浏览器跨域问题 5.nginx防盗链 6.nginx缓存 7.nginx压缩 8.nginx配置ht ...

  3. nginx反向代理配置

    Nginx集群配置 安装Nginx官网 nginx模块简介 1.全局块:配置影响nginx全局的指令.一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许 ...

  4. Nginx 简介和使用

    Nginx简介 Nginx发展介绍 Nginx作者 正向代理和反向代理概念 网站代理服务器查看 Nginx环境搭建 下载 安装前准备 安装 启动 检测Nginx是否启动 关闭 重启 Nginx核心配置 ...

  5. hbuilderx内置服务器启动失败_Nginx服务器简介与配置

    一.Nginx简介 Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,Nginx代码完全用C语言从头写成,已经移植到许多体系结构和操作系统.在连接高并发的情况下,Ngin ...

  6. Nginx基础应用配置小结 - 运维笔记

    Nginx基础应用配置小结 - 运维笔记 在linux系统下使用nginx作为web应用服务,用来提升网站访问速度的经验已五年多了,今天在此对nginx的使用做一简单总结. 一.nginx服务简介 N ...

  7. Linux下安装Nginx(实战配置)

    Nginx简介 Nginx是什么? Nginx是一款轻量级Web服务器,也是一款反向代理服务器 官网:http://nginx.org/ 中文文档: http://www.nginx.cn/doc/ ...

  8. 回顾Nginx网站服务配置

    Nginx简介 Nginx ("engine x") 是一个高性能的 HTTP 和反向代理服务器.Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.r ...

  9. 【Nginx】【一】Nginx简介

    Nginx简介 背景介绍 Nginx("engine x")一个具有高性能的[HTTP]和[反向代理]的[WEB服务器],同时也是一个[POP3/SMTP/IMAP代理服务器],是 ...

最新文章

  1. 【微服务架构】SpringCloud之Eureka入门篇
  2. ArcGIS Server9.2学习开发(4)——使用Toc控件
  3. 160个Crackme026之六段式注册码详解
  4. Appium——appium之mac环境安装
  5. visio思维导图模板_如何下载思维导图模板?在线教你找精美漂亮的思维导图
  6. anaconda在ubuntu19.10下面安装python3.6和python2.7+更换国内源+一键切换配置
  7. 是什么职位_为什么说,质量工程师岗位变成了 “寡妇职位”?
  8. 牛客题霸 [回文数字(palindrome-number)] C++题解/答案
  9. cuda笔记-GPU多线程的奇偶排序
  10. 图标,专业设计师基本素材要件
  11. HighCharts中几种tooltip的显示格式
  12. Observer模式(观察者设计模式)
  13. Java智能教育平台源码基于 SpringBoot + Mybatis + Shiro + mysql + redis构建,前后端分离。
  14. 乾颐堂军哥HCNP真题(科目221)解析,含2017年最新更新后题库,61到75题
  15. UE4蓝图--人物的移动
  16. UVA 10158 War 并查集
  17. The missing semester of your CS education--命令行环境
  18. 自学Python 45 数字处理函数(三)
  19. html怎么把背景换成相片,怎么给照片换背景 图片后期处理把阴沉天空背景换成云彩背景...
  20. 一键自动生成字幕、制作双语字幕,懒人必备

热门文章

  1. 抢抓数字经济机遇加快云南省数字化发展——云南省数字经济发展实践
  2. windows磁盘修复命令chkdsk
  3. MySQL数据库修改时间、时区(包括阿里云控制台修改)!
  4. PyCharm 格式化代码 (Reformat Code)
  5. android4.0触摸屏(touchscreen)以及屏幕按键驱动解析
  6. 对SGMII接口的认识
  7. win cmd php中文乱码
  8. 物联网却不能物物相联?阿里云物联网平台得这么设置!
  9. 训练数据的归一化处理
  10. Pico+UnityXR实现简单移动和交互