Nginx一文学会,简单易懂,快速上手
- Nginx的优点
- Nginx的核心组成
- Nginx基本用法
- Nginx代理
- Nginx正向代理
- Nginx反向代理
- Nginx的主要功能
- 请求转发
- 负载均衡
- 动静分离
- Nginx常用命令
- Nginx核心配置文件结构
- Rewrite功能配置
- Rewrite的相关指令
- set指令
- if指令
- break指令
- return指令
- rewrite指令
- rewrite_log指令
- Rewrite的案例
- 域名跳转
Nginx的优点
- 速度更快、并发更高
- 配置简单,扩展性强
- 高可靠性
- 热部署
- 成本低、BSD许可证
Nginx的核心组成
nginx二进制可执行文件
nginx.conf配置文件
error.log错误的日志记录
access.log访问日志记录
Nginx基本用法
- 开启nginx:sudo service nginx start
- 重启nginx:sudo service nginx reload
- 关闭nginx:nginx -s stop
Nginx代理
Nginx正向代理
指代理服务器来接收Internet上的客户端请求,然后将请求转发给内部网络上的服务器,
并将从服务器上得到的结果返回给客户端。
此时代理服务器对外就表现为一个反向代理服务器
Nginx反向代理
一个位于客户端和原始服务器之间的服务器,为了从原始服务器获得内容。
客户端向代理发送一个请求并指定目标(原始服务器),
然后代理向原始服务器转发并获得的内容返回给客户端。
Nginx的主要功能
请求转发
Nginx的location路径映射
1. = 匹配
location = / {
#精准匹配
}
2. 通用匹配
location /xxx {
#匹配所有以/xxx开头的路径
}
3. 匹配开头路径
location ^~ /xxx/xx {
#匹配所有以/xxx/xx开头的路径
}
4. 正则匹配
location ~ /xxx {
#匹配所有以/xxx开头的路径
}
5. 匹配结尾路径
location ~* \.(gif/jpg/png)$ {
#匹配以.gif、.jpg或者.png结尾的路径
}
6. 通用匹配
location / {
#通用匹配,匹配所有请求
}
负载均衡
Nginx有三种负载均和的策略
1. 轮询:
将客户端发起请求,平均分配给每一台服务器
upstream daili_server{
server localhost:8080; #服务器IP或域名
server localhost:8081; #服务器IP或域名
}
server {
listen 80;
listen [::]:80;
server_name localhost;
location / {
proxy_pass http://daili_server/; #负载均衡
}
}
2. 权重:
会将客户端的请求,根据服务器的权重值不同,分配不同的数量
upstream daili_server{
server localhost:8080 weight=10; #服务器IP或域名
server localhost:8081 weight=2; #服务器IP或域名
}
server {
listen 80;
listen [::]:80;
server_name localhost;
location / {
proxy_pass http://daili_server/; #负载均衡
}
}
3. ip_hash:
基于发起请求的客户端的ip地址不同,他始终会将请求发送到指定的服务器上
就是说如果这个客户端的请求的ip地址不变,那么处理请求的服务器将一直是同一个
upstream daili_server{
ip_hash;
server localhost:8080; #服务器IP或域名
server localhost:8081; #服务器IP或域名
}
server {
listen 80;
listen [::]:80;
server_name localhost;
location / {
proxy_pass http://daili_server/; #负载均衡
}
}
动静分离
动态资源: 如JSP由Tomcat或其它WEB服务器处理。
location / {
proxy_pass 路径;
}
静态资源: 如图片、css、js等由nginx服务器完成。
location / {
root 静态资源路径;
index 默认访问路径下的什么资源;
autoindex on;#可以不写,写了则代表展示静态资源的全部内容,以列表的形式展开
}
Nginx常用命令
cd /usr/local/nginx/sbin/
./nginx # 启动
./nginx -s stop # 停止
./nginx -s quit # 安全退出
./nginx -s reload # 重新加载配置文件
ps aux|grep nginx # 查看nginx进程
Nginx核心配置文件结构
案例:
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
... #全局配置: 指令名 指令值; 主要设置Nginx服务器整体运行的配置指令
events { # events块,主要设置,Nginx服务器与用户的网络连接,这一部分对Nginx服务器的性能影响较大
... #指令名 指令值;
}
http { # 是Nginx服务器配置中的重要部分,代理、缓存、日志记录、第三方模块配置...
upstream edustudy { # 负载均衡配置,默认是轮询
server 127.0.0.1:8080 weight=1; # weight是权重
server 127.0.0.1:8081 weight=1;
}
server { #server代理 是Nginx配置和虚拟主机相关的内容
listen 9001;
server_name localhost; # 监听到之后转发到localhost
location / { # 9001端口下的所有请求都会被匹配到这里 基于Nginx服务器接收请求字符串与location后面的值进行匹配,对特定请求进行处理
proxy_pass http://edustudy; # 转发至负载均衡里
}
location /admin {
}
# 当地址中包含"eduService"时,请求会转发至 http://localhost:8085
location ~ /eduService/ {
proxy_pass http://localhost:8085;
}
}
server {
listen 9002;
server_name localhost;
}
}
小结:
nginx.conf配置文件中默认有三大块:全局块、events块、http块http块中可以配置多个server块,每个server块又可以配置多个location块。
Rewrite功能配置
Rewrite是Nginx服务器提供的一个重要基本功能,是Web服务器产品中几乎必备的功能。主要的作用是用来实现URL的重写。www.jd.com 注意:Nginx服务器的Rewrite功能的实现依赖于PCRE的支持,因此在编译安装Nginx服务器之前,需要安装PCRE库。Nginx使用的是ngx_http_rewrite_module模块来解析和处理Rewrite功能的相关配置
Rewrite的相关命令
- set指令
- if指令
- break指令
- return指令
- rewrite指令
- rewrite_log指令
Rewrite的应用场景
- 域名跳转
- 域名镜像
- 独立域名
- 目录自动添加"/"
- 合并目录
- 防盗链的实现
Rewrite的相关指令
set指令
该指令用来设置一个新的变量
variable:变量的名称,该变量名称要用"$"作为变量的第一个字符,且不
要与Nginx服务器预设的全局变量同名。
value:变量的值,可以是字符串、其他变量或者变量的组合等。
if指令
该指令用来支持条件判断,并根据条件判断结果选择不同的Nginx配置。
break指令
该指令用于中断当前相同作用域中的其他Nginx配置。与该指令处于同一作用域的Nginx配置中,位于它前面的指令配置生效,位于后面的指令配置无效。并且break还有另外一个功能就是终止当前的匹配并把当前的URI在本location进行重定向访问处理。
return指令
该指令用于完成对请求的处理,直接向客户端返回。在return后的所有Nginx配置都是无效的
rewrite指令
该指令通过正则表达式的使用来改变URI。可以同时存在一个或者多个指令,按照顺序依次对URL进行匹配和处理。
rewrite_log指令
该指令配置是否开启URL重写日志的输出功能。
Rewrite的案例
域名跳转
问题分析
先来看一个效果,如果我们想访问京东网站,大家都知道我们可以输入www.jd.com ,但是同样的我们也可以输入www.360buy.com 同样也都能访问到京东网站。这个其实是因为京东刚开始的时候域名就是www.360buy.com,后面由于各种原因把自己的域名换成了www.jd.com, 虽然说域名变量,但是对于以前只记住了www.360buy.com的用户来说,我们如何把这部分用户也迁移到我们新域名的访问上来,针对于这个问题,我们就可以使用Nginx中Rewrite的域名跳转来解决。
环境准备
- 准备三个域名
vim /etc/hosts
127.0.0.1 www.itcast.cn
127.0.0.1 www.itheima.cn
127.0.0.1 www.itheima.com
- 通过Nginx实现访问www.itcast.cn
server {
listen 80;
server_name www.itcast.cn;
location /{
default_type text/html;
return 200 '<h1>welcome to itcast</h1>';
}
}
通过Rewrite完成将www.ithema.com和www.itheima.cn的请求跳转到www.itcast.com
server {
listen 80;
server_name www.itheima.com www.itheima.cn;
rewrite ^/ http://www.itcast.cn;
}