Nginx学习教程(基础篇)

目录

一、Nginx安装

二、Nginx基本使用

2.1、目录结构

conf 

html

logs

sbin

2.2、基本运行原理

2.3、nginx.conf最小配置解析

worker_processes

worker_connections

include mime.types

default_type  application/octet-stream

sendfile on

keepalive_timeout  65

虚拟主机配置

2.4、虚拟主机与域名解析

2.4.1、实现域名解析

2.4.2、实现Nginx不同端口访问不同项目

2.4.3、servername匹配规则

完整匹配

通配符匹配

通配符结束匹配

正则匹配

2.5、反向代理

2.5.1、介绍

2.5.2、实现反向代理

2.6、负载均衡

2.6.1、实现简单的负载均衡

2.6.2、负载均衡策略

轮询

weight(权重)

ip_hash

least_conn

url_hash

fair

2.7、动静分离

2.7.1、介绍

2.7.2、配置动静分离

2.7.3、使用正则配置动静分离

2.7.4、UrlRewrite

2.8、高可用配置

2.8.1、Keepalived

2.8.2、Keepalived配置


一、Nginx安装

请参考我的另一篇文章:Linux系统安装Nginx(保姆级教程)

二、Nginx基本使用

2.1、目录结构

conf 

用来存放配置相关文件。
最重要的就是此文件。

html

用来存放静态文件的默认目录 html、css等。

logs

access.log:用来记录用户访问日志,将时间、地点、人物三要素都记录下来。由于会记录每个人的每次访问,所以此文件会比较大,但放心,在配置文件中配置了,当文件过大,会往另外一个文件中记录。

error.log:顾名思义,就是记录一些错误的日志。

nginx.pid:里面只有一个pid号,当我们启动Nginx时,pid就是此号。

sbin

Nginx的主程序。

2.2、基本运行原理

第一步:用户发起一个请求。

第二步:Nginx启动后共有两个进程,一个是master主进程,另一个worker子进程,主进程不处理业务,只是协调子进程干活。

第三步:worker读取并解析配置文件/conf/nginx.conf,看用户发的请求能不能映射到配置文件中配置的url,能就直接映射。

2.3、nginx.conf最小配置解析

worker_processes

worker_processes  1; # 默认为1,表示开启一个业务进程

worker_connections

# 单个业务进程可接受连接数
events {
    worker_connections  1024;
}

include mime.types

http {
    # 引入http mime类型
    include       mime.types;

default_type  application/octet-stream

http {
    include       mime.types;
    # 如果mime类型没匹配上,默认使用二进制流的方式传输
    default_type  application/octet-stream;

sendfile on

sendfile        on; # 使用linux的 sendfile(socket, file, len) 高效网络传输,也就是数据0拷贝。

keepalive_timeout  65

keepalive_timeout  65;

虚拟主机配置

# 主机
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;
        }

        
    }

server{}:代表一个虚拟主机,一个nginx.conf文件可以配置多个主机,互不干扰,可以通过端口号listen的不同来区分。

listen:监听端口。

server_name:主机名,域名。

location:是域名或主机名后跟的uri,比如我nginx.conf配置如下:

# 主机
server {
        listen       8080; # 监听端口号
        server_name  localhost;

        api/ {
            root   html;
            index  index.html index.htm;
        }

    }

那前端用户请求的就应该是,http://localhost:8080/api/。

那么请求就会映射到html文件中,这里的html以后我们做项目,会把前端项目编译后的一堆文件放到html文件中,直接就可以访问。

error_page:错误页。

error_page   500 502 503 504  /50x.html;
location = /50x.html {
     root   html;
}

假如请求http://localhost:8080/api/userList路径,但是报错了,错误码是500,那么就会跳转到/50x.html,路径就会变成http://localhost:8080/50x.html,但我们没有50x.html,所以会将目录指向nginx/html中的50x.html。

2.4、虚拟主机与域名解析

原本一台服务器只能对应一个站点,通过虚拟主机技术可以虚拟化成多个站点同时对外提供服务。

2.4.1、实现域名解析

第一步:复制你本机的hosts文件到桌面,路径是C:\Windows\System32\drivers\etc\hosts

第二步:打开桌面上的hosts文件,输入以下映射关系

你虚拟机的ip地址 www.s1.com

这样做的意思是,给你的IP地址映射一个域名,这样你就可以通过域名来访问nginx了。

第三步:保存并替换C:\Windows\System32\drivers\etc\hosts

第四步:ping www.s1.com

如果有响应就算成功!!!

第五步:在本机浏览器上访问www.s1.com,如果出现nginx页面就算配置映射成功

2.4.2、实现Nginx不同端口访问不同项目

我现在有个需求:我只有一台服务器,但我想输入不同端口号访问不同的项目,刚如何做?

第一步:在nginx/html中创建两个目录,里面分别写上不同的html页,代表两个项目

cd /usr/local/nginx/html

mkdir -p www

mkdir -p void

cd www

vi index.html

cd void

vi index.html

第二步:打开conf/nginx.conf文件,增加主机映射

cd /usr/local/nginx/conf

vi nginx.conf

在html基础上后面加上/www,代表的意思是,当我访问localhost:80就会去html/www文件下找index.html页。

复制进去,现在总共有两个server{},一个端口为80,另一个为88。

保存文件。

第三步:重启nginx

systemctl reload nginx

注意:这里如果重启完不生效,先stop命令停止,再用start命令启动。

第四步:本机访问进行测试

2.4.3、servername匹配规则

完整匹配

我们可以在同一servername中匹配多个域名。

server_name vod.mmban.com www1.mmban.com;

这样不管我们访问vod.mmban.com还是www1.mmban.com,都映射到一台主机上。

通配符匹配
server_name *.mmban.com

通配符结束匹配
server_name vod.*;

正则匹配
server_name ~^[0-9]+\.mmban\.com$;

2.5、反向代理

2.5.1、介绍

用户请求通过互联网打到我们机房网关路由上,路由和nginx是互通的,也就是说,用户请求直接访问nginx中间商,然后nginx转发到应用服务器。

由于Nginx是服务端提供给用户访问的,所以叫反向代理

2.5.2、实现反向代理

修改配置文件nginx.conf。

proxy_pass http://baidu.com;

 

意思就是当我访问localhost:80时,直接跳转到百度,但这种域名会变,从 localhost:80变成www.baidu.com,这是因为访问的外网。

如果你代理的是内网地址,比如192.168.X.1代理到192.168.X.2,那域名就不会变。

2.6、负载均衡

2.6.1、实现简单的负载均衡

在nginx.conf配置文件中添加如下代码:

upstream httpd {
    server 192.168.44.102:80;
    server 192.168.43.103:80;
}

server{
    listen 80;
    server_name localhost;
    
    location /{
        proxy_pass http://httpds; # httpds映射到上面配置的负载均衡名,随意起名
    }
}

注意:upstream和server是同级别的,别写到server{}里面。

这样当我们访问localhost:80,第一次代理到192.168.44.102:80,第二次代理到192.168.44.102:80,依次类推,一人一次,雨露均沾。

2.6.2、负载均衡策略

轮询
默认情况下使用轮询方式,逐一转发,这种方式适用于无状态请求,一人一下,雨露均沾。

weight(权重)

指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。

upstream httpd {
    server 127.0.0.1:8050 weight=10 down;
    server 127.0.0.1:8060 weight=1;
    server 127.0.0.1:8060 weight=1 backup;
}

down:表示当前的server暂时不参与负载。
weight:默认为1,weight越大,负载的权重就越大。
backup: 其它所有的非backup机器down或者忙的时候,请求backup机器,意思是备用服务器。

ip_hash

根据客户端的ip地址转发同一台服务器,可以保持会话。像轮询就不会保持会话,比如你在A服务器上登录过,这次轮询到B服务器了,那你就得重新登录。而ip_hash策略,就会根据你用户的ip地址,来定向转到同一台服务器,这样就可以保持会话了。

least_conn

最小连接数访问,这样能保证后端服务器的负载更加均衡。意思就是A服务器连接次数1000次,B服务器才20次,那么就会将剩下的往B上转。

url_hash

根据用户访问的url定向转发请求。

fair

根据后端服务器响应时间转发请求。

注意:ip_hash、least_conn、url_hash、fair这四种基本上在生产环境中不会用,有一个重要的问题,无法做到服务器动态上下线,比如有现在有4台服务器,我想动态下线一台,再上线两台,这个是做不到的。

2.7、动静分离

2.7.1、介绍

如果你是前后分离的项目,这一节就不用看了。

动静分离的意思是,我们单体项目比如SpringBoot,里面有很多html页,必然会引入很多图片、gif图、JS、CSS等静态资源。本来用户请求到Nginx,再代理到Tomcat,那是不是有点浪费资源呢?我们是否可以将静态资源都放到Nginx上,这样就少了一步代理操作。静从Nginx上取,动就直接代理到Tomcat后端服务器,这就叫动静分离。

2.7.2、配置动静分离

location / {
    proxy_pass http://127.0.0.1:8080;
}

location /css {
    root /usr/local/nginx/static; # 访问static下的css目录
    index index.html index.htm;
}

location /images {
    root /usr/local/nginx/static; # 访问static下的images目录
    index index.html index.htm;
}

location /js {
    root /usr/local/nginx/static; # 访问static下的js目录
    index index.html index.htm;
}

2.7.3、使用正则配置动静分离

location ~*/(css|img|js) {
    root /usr/local/nginx/static;
    index index.html index.htm;
}

2.7.4、UrlRewrite

location /{
    rewrite ^/2.html$  /index.jsp?pageNum=2 break;
    proxy_pass http://192.168.44.104:8080;
}

配置的rewrite意思就是重写url,我们访问localhost:80/2.html其实访问的是localhost:80//index.jsp?pageNum=2。其实压根就没有2.html,配置文件只要匹配上就行。

flag标记说明:
        last #本条规则匹配完成后,继续向下匹配新的location URI规则。
        break #本条规则匹配完成即终止,不再匹配后面的任何规则。
        redirect #返回302临时重定向,浏览器地址会显示跳转后的URL地址。
        permanent #返回301永久重定向,浏览器地址栏会显示跳转后的URL地址。

2.8、高可用配置

2.8.1、Keepalived

这东西有点像Redis的哨兵模式,当每一台Nginx配备一个Keepalived,每个Keepalived是互通的,假如A服务器上的Nginx宕机了,通过Keepalived就可以将请求都转到B服务器的Nginx。

2.8.2、Keepalived配置

参考我的另一篇文章:Linux上安装Keepalived,多台Nginx配置Keepalived(保姆级教程)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

思想和宇宙同频

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值