Nginx入门以及相关案例

转载请标明出处https://blog.csdn.net/qq_43364916/article/details/103490106

Nginx

Nginx的基本概念

NGINX是什么?能做什么?

Nginx (engine x) 是一个高性能的HTTP反向代理web服务器,Nginx是一款轻量级Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强

反向代理

​ (1)正向代理:如果把局域网外的internet想象成一个巨大的资源库,则局域网中的客户端要访问internet,则需要通过 代理服务器来访问,这种代理服务就称为正向代理。用作正向代理来代理进行上网等功能。
在这里插入图片描述

​ 注意:客户端(浏览器)配置代理服务器,经过一个代理服务器到达访问地址。

​ (2)反向代理:其实客户端对代理是无感知到,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。
在这里插入图片描述

​ 注意:反向代理服务器和目标代理服务器合成一个服务器看待,所以暴露的是代理服务器的地址。

负载均衡

​ 单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡。
在这里插入图片描述

动静分离

​ 为了加快网站的解析速度,可以将动态页面和静态页面由不同的服务器来解析,加快解析速度,降低原来单个服务器的压力

原先:
在这里插入图片描述

动静分离:
在这里插入图片描述

Nginx安装,常用命令和配置文件

在Liunx 系统中安装Nginx (docker )

在Docker下载Nginx镜像
docker pull nginx
docker images

创建挂载目录

mkdir -p /data/nginx/{conf,conf.d,html,logs}

编写nginx,conf配置文件,并放在文件夹中

# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    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  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
	
    include /etc/nginx/conf.d/*.conf;
	#这里注意下面文件内容是在/etc/nginx/conf.d/*.conf中的(粘贴需删除该部分中文)
    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  182.254.161.54;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
        proxy_pass http://pic; 
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

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

    upstream pic{
                server 182.254.161.54:8088 weight=5;
                server 182.254.161.54:8089 weight=5;
    }

}


启动容器

docker run --name mynginx -d -p 82:80  -v /data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf  -v /data/nginx/logs:/var/log/nginx -d docker.io/nginx

查看启动的容器

docker ps 
1.使用docker 下载nginx 镜像  docker pull nginx

2.启动nginx

	docker run --name nginx -p 80:80 -d nginx

	这样就简单的把nginx启动了,但是我们想要改变配置文件nginx.conf ,进入容器,命令:

	docker exec -it nginx bash

	nginx.conf配置文件在 /etc/nginx/  下面,但是你使用vim nginx.conf 或者vi nginx.conf

	会发现vi或者vim命令没有用,解决办法:apt-get  update  完成之后 apt-get install vim

	此时你就可以自己定制nginx.con文件了,改好配置文件apt之后重启容器,步骤,先把容器停了

	docker stop nginx  然后重启 docker start nginx

这样不是很方便,还有第二种方式,挂载配置文件,就是把装有docker宿主机上面的nginx.conf配置文件映射到启动的nginx容器里面,这需要你首先准备好nginx.con配置文件,如果你应经准备好了,下一步是启动nginx

	命令:docker run --name nginx02 -p 80:80 -v /home/docker-nginx/nginx.conf:/etc/nginx/nginx.conf -v /home/docker-nginx/log:/var/log/nginx -v /home/docker-nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf -d nginx

解释下上面的命令:

	--name  给你启动的容器起个名字,以后可以使用这个名字启动或者停止容器

	-p 映射端口,将docker宿主机的80端口和容器的80端口进行绑定

	-v 挂载文件用的,第一个-v 表示将你本地的nginx.conf覆盖你要起启动的容器的nginx.conf文件,第二个表示将日志文件进行挂载,就是把nginx服务器的日志写到你docker宿主机的/home/docker-nginx/log/下面

第三个-v 表示的和第一个-v意思一样的。

	-d 表示启动的是哪个镜像

我个人更喜欢第二种映射的方式,麻烦的是需要自己准备好nginx.conf 和default.conf文件,我是直接从容器里面复制的,然后根据自己的需要改的

有问题,欢迎留言交流。
越努力越幸运


挂载的意思就是讲自己写的配置文件覆盖掉容器内部的配置文件,然后就可以使用自己的配置信息了。
docker 从容器中拷贝文件到宿主机或者从宿主机拷贝文件到docker容器
1、从容器里面拷文件到宿主机?
     答:在宿主机里面执行以下命令
             docker cp 容器名:要拷贝的文件在容器里面的路径       要拷贝到宿主机的相应路径 
     示例: 假设容器名为testtomcat,要从容器里面拷贝的文件路为:/usr/local/tomcat/webapps/test/js/test.js,  现在要将test.js从容器里面拷到宿主机的/opt路径下面,那么命令应该怎么写呢?
     答案:在宿主机上面执行命令
	docker cp testtomcat:/usr/local/tomcat/webapps/test/js/test.js /opt

2、从宿主机拷文件到容器里面
      答:在宿主机里面执行如下命令
       docker cp 要拷贝的文件路径 容器名:要拷贝到容器里面对应的路径
       示例:假设容器名为testtomcat,现在要将宿主机/opt/test.js文件拷贝到容器里面的/usr/local/tomcat/webapps/test/js路径下面,那么命令该怎么写呢?
       答案:在宿主机上面执行如下命令     
docker cp /opt/test.js testtomcat:/usr/local/tomcat/webapps/test/js

需要注意的是,不管容器有没有启动,拷贝命令都会生效。
docker cp nginx:/etc/nginx/nginx.conf /data/nginx/conf/nginx.conf 
docker cp nginx: /data/nginx/log /var/log/nginx 
docker cp nginx:/etc/nginx/conf.d/default.conf /data/nginx/conf.d/default.conf 


docker run --name nginx02 -p 80:80 -v /data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /data/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf -d nginx

若是在Linux中访问不到80端口,可能是防火墙没有开放。

查看开放的端口号:
firewall-cmd --list-all
设置开放的端口号
firewall-cmd --add-service=http =permanent
sudo firewall-cmd --add-port=80/tcp --permanent
重启防火墙
firewall-cmd --reload

Nginx常用命令

1、使用nginx 操作命令前提条件,必须进入nginx的目录(可配置,不一定需要)

​ /usr/local/nginx/sbin

2、查看nginx的版本号

​ ./nginx -v

3、启动nginx
​ ./nginx

4、关闭nginx

​ ps -ef | grep nginx 查看nginx当前的状态

​ ./nginx -s stop关闭nginx

5、重新加载nginx

​ ./nginx -s reload

Error response from daemon: OCI runtime create failed: container_linux.go:345: starting container process caused "process_linux.go:430: container init
 caused \"rootfs_linux.go:58: mounting \\\"/home/docker-nginx/nginx.conf\\\" to rootfs \\\"/var/lib/docker/devicemapper/mnt/24c919cfba620f8634f524cad8
e8a939b97bdcaa467092bcc6d7e2c28d232eba/rootfs\\\" at \\\"/var/lib/docker/devicemapper/mnt/24c919cfba620f8634f524cad8e8a939b97bdcaa467092bcc6d7e2c28d23
2eba/rootfs/etc/nginx/nginx.conf\\\" caused \\\"not a directory\\\"\"": unknown: Are you trying to mount a directory onto a file (or vice-versa)? Chec
k if the specified host path exists and is the expected type
Error: failed to start containers: nginx02


Docker报错 WARNING: IPv4 forwarding is disabled. Networking will not work.

# vim  /usr/lib/sysctl.d/00-system.conf
添加代码:net.ipv4.ip_forward=1
# systemctl restart network
Nginx 配置文件
1、Nginx 配置文件所在的位置:

​ (1)假如你是用Linux安装的,可能在(不同版本的linux可能不一样) /usr/local/nginx/conf里面

​ (2)假如你是在docker 安装的,你需要进入容器里面,在容器里面的/etc/nginx/nginx.conf

2、nginx 配置文件的组成

​ (1)nginx配置文件有三部分组成

​ 第一部分:全局块

​ 从配置文件到events块之间的内容,主要会设置一些影响nginx服务器整体运行的配置指令,主要包括配置运行Nginx服务器的用户、允许生成的worker process数,进程PID存放路径,日志存放路径和类型以及配置文件的引入等

​ 比如:

# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

​ worker_processes auto;这是Nginx 服务器并发处理服务器的关键配置,worker process 的值越大,可以处理的并发数量就越多,但是会受到硬件、软件等设备的制约

​ 第二部分:events块

​ events块涉及的指令主要影响Nginx服务器与用户的网络连接

events {
    worker_connections 1024;
}

​ 表示支持最大的连接数是多少

​ 第三部分:http块

​ 这算是Nginx服务器培配置中最频繁的部分、代理、缓存和日志定义等绝大多数的功能和第三方模块的配置都在这里,需要注意的是:http块可以包括http全局快,server块

http {
    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  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
	
    include /etc/nginx/conf.d/*.conf;
	#这里注意下面文件内容是在/etc/nginx/conf.d/*.conf中的(粘贴需删除该部分中文)
    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  182.254.161.54;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
        proxy_pass http://pic; 
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

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

    upstream pic{
                server 182.254.161.54:8088 weight=5;
                server 182.254.161.54:8089 weight=5;
    }

}

http全局块

​ http全局快配置的指令包括文件引入,MIME-TYPE定义,日志自定义,连接超时时间,单链接请求书上限等

server块

​ 这块和虚拟主机有密切的关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。

每个http块可以包括多个server块,而每个server块就相当于一个虚拟主机

而每个server块也分为全局server块,以及可以同时包含多个location块

​ (1)全局server块

最常见的配置是本虚拟主机的监听配置和本虚拟机的名称或IP配置

​ (2)location 块

一个server可以配置多个location块

这块的主要作用是基于Nginx服务器接收到的请求字符串(例如:server_name/uri-string),对虚拟主机名称之外的字符串进行(例如 前面的uri-string)进匹配,对特定的请求进行处理,地址指向,数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。

Nginx 配置实例-1-反向代理

1、实现效果

​ (1)打开浏览器,在浏览器地址中输入地址www.123.com,跳转到liunx系统中tomcat的主页面中

2、准备工作

​ (1)在liunx系统安装tomcat,使用默认端口8080

利用docker 安装
docker pull Tomcat
docker run --name my-tomat -P -d tomcat 启动容器
docker exec -it tomat02 /bin/bash 进入容器 exit退出

Tomcat安装后在容器内部的路径
得知 /opt/tomcat 就是tomcat的路径

配置文件路径
docker cp my-tomat:/opt/tomcat/conf /tomcat/apple/my-tomcat
docker cp my-tomat:/opt/tomcat/webapps /tomcat/apple/my-tomcat
docker cp my-tomat:/opt/tomcat/logs /tomcat/apple/my-tomcatcd 
可以将其拷贝出来到宿主机上,然后通过挂载进行启动


mkdir -p /tmp/dir1/dir2    创建一个目录树
mkdir -p /tomcat/apple/tomcat8080
docker cp tomcat02:/usr/local/tomcat/webapps /tomcat/apple/tomcat8080/


docker run --name tomcat02 -p 8080:8080 -v /tomcat/apple/tomcat8080/webapps:/usr/local/tomcat/webapps -d tomcat

docker run --name tomcat03 -p 8081:8080 -v /tomcat/apple/tomcat8080/webapps:/usr/local/tomcat/webapps -d tomcat

​ (2)安装jdk

      cat /etc/redhat-release 查看系统版本
      wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-		securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/7u71-b14/jdk-7u71-linux-x64.tar.gz

      jdk-8u231-linux-x64.tar.gz
      还没有完成!!!

​ https://www.cnblogs.com/52lxl-top/p/9877202.html

​ https://blog.csdn.net/ltyzsd/article/details/79062183

3、访问过程分析
在这里插入图片描述

4、具体配置

第一步:在windows系统中 C:\Windows\System32\drivers\etc\hosts文件配置域名映射

192.168.1.103 www.123.com

第二步:在Nginx进行请求转发的配置(反向代理配置)

这里注意的是因为这里演示tomcat也是在该虚拟机上配置的,所以启动的ip地址也是该虚拟机的地址,假如是在windows上启动的tomcat 那么在proxy_pass上填写的IP地址就应该是windows上的IP地址
在这里插入图片描述

第三步:在windows浏览器中输入www.123.com就可以访问到Tomcat主页就是成功的反向代理

Nginx 配置实例-1-反向代理2

1、实现效果

使用nginx反向代理,根据访问的路径跳转到不同端口的服务器中,nginx箭筒端口为9001

访问http://127.0.0.1:9001/edu/ 直接跳转到127.0.0.1:8080

访问http://127.0.0.1:9001/vod/ 直接跳转到127.0.0.1:8081

2、准备

​ 利用docker开启两个Tomcat服务器 ,并把tomcat 里面的配置复制两份分别在Tomcat8080,Tomcat8081文件夹里面,然后挂载启动两个不同的端口,并且在对应的webapps下面创建测试的html
在这里插入图片描述

3、具体配置

修改对应的配置文件 内容,我这里是将其拷贝多一份配置为default9001.conf。
在这里插入图片描述

挂载启动
在这里插入图片描述

在浏览其中分别输入

访问http://127.0.0.1:9001/edu/ 直接跳转到192.168.56.3:8080/edu/edu.html

访问http://127.0.0.1:9001/vod/ 直接跳转到192.168.56.3:8081/vod/vod.html

Nginx 配置实例-2-负载均衡

1、实现效果:

在浏览器中输入http://192.168.56.3:9001/edu/edu.html负载均衡效果,,平均8080和8081端口中

2、准备工作

(1)准备两个端口的Tomcat服务器

(2)在两台tomcat里面webapps,创建名称时edu文件夹,在文件夹中创建页面eud.html,用于测试

3、修改对应的nginx配置文件

在nginx.conf配置文件中加入
在这里插入图片描述

在default.conf配置文件中修改为之前起的服务名字
在这里插入图片描述

4、负载均衡既是将负载分摊到不同的服务单元,既保证服务的可用性,又保证响应足够块,给用户很好的体验,在Linux中有Nginx,LVS,Haproxy等等服务可以提供负载均衡服务,而且Nginx提供了几种分配方式(策略)

1、轮询(默认)

每个请求按时间顺讯逐一分配到不同的 后端服务器,如果后端服务器down掉,能自动删除。

2、weight.

weight代表权,重默认为1,权重越高被分配到的客户端越多。

指定轮训几率,weight和访问比率成正比,用于后端服务器性能不均的情况,例如:
在这里插入图片描述

3、ip_hash

每个请求按访问ipde 哈市结果分配,这样每个访客固定一个后端服务器,可以解决session的问题,例如

,即是加入一个用户第一次访问到了htttp://192.168.56.3:8080这个IP,name他往后都是访问到这个IP。
在这里插入图片描述

4、fair(第三方)

按后端服务器的响应事件来分配请求,响应事件短的优先分配
在这里插入图片描述

看哪个IP响应时间短就访问那个。

Nginx 配置实例-3-动静分离

1、什么是动静分离。

​ 严格意义上来讲应该是动态请求和静态请求分开,可以理解成使用Nginx处理静态页面,Tomcat处理动态页面,动静分离从目前实现角度来讲大致分为两种,一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案,另外一种方法就是动态页面跟静态文件混合在一起发布,通过Nginx来分开。

​ 通过 location 指定不同的后缀名实现不同的请求转发。通过 expires 参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。具体 Expires 定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件,不建议使用Expires 来缓存),我这里设置 3d,表示在这 3 天之内访问这个 URL,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码 304,如果有修改,则直接从服务器重新下载,返回状态码 200。
在这里插入图片描述

2、准备工作,利用SSH secure shell client 工具上传文件(因为终端rz问题尚未解决)
在这里插入图片描述
www里面有个HTML文件,image里面有张图片

注意:SSH secure shell client 拉拽文件之后中文乱码问题可以在每次终端运行export LANG=zh_CN.GB2312 永久之法尚未解决

如果使用命令上传和下载文件需要

yum install -y lrzsz 下载工具
rz 上传文件
sz gerrit-2.14.7.war  下载文件

上传文件过大,可以通过使用 rz -be的方式,并且去掉弹出的对话框中“Upload files as ASCII”前的勾选。这样就可以解决大文件上传失败的问题。

-a, –ascii
-b, –binary 用binary的方式上传下载,不解释字符为ascii
-e, –escape 强制escape 所有控制字符,比如Ctrl+x,DEL等

1、rar,gif等文件文件采用 -b 用binary的方式上传。
2、文件比较大而上传出错的话,采用参数 -e

这里写图片描述

3、具体操作

(1)在nginx配置文件中进行
在这里插入图片描述

4、最终测试

(1)浏览器中输入地址

http://192.168.56.3/www/edu.html

http://192.168.56.3/image/

可以访问到资源(暂时还没有完成)

Nginx 配置高可用集群

1、什么是高可用:

就是当我们有台服务器宕机之后,我们系统不会停止工作。
在这里插入图片描述

(1)需要两台nginx 服务器

(2)需要keepalived

(3)需要虚拟主机

2、准备工作

(1)需要两台服务器。(需要两台虚拟机)

(2)在两台服务器中安装nginx

(3)在两台服务器中安装keepalived

3、在两台服务器上安装keepalived

(1)利用yum命令安装

​ yum install keepalived -y

(2)安装之后,在etc里面生成目录keepalived,有文件keepalived.conf

4、完成高可用配置(主从配置)

(1)修改keepalived.conf

主服务器:keepalived.conf
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
这上面的网卡,需要查看自己的虚拟机

(2)检测脚本:
在这里插入图片描述

检测脚本上面的路径就是你Nginx的启动路径

备份服务器:(这里只是显示不同之处,其他与主服务器相同,网卡也是要查看备份服务器的网卡)
在这里插入图片描述

脚本文件一样放一份到备份服务器中

(3)把两台服务器以及keepalived启动起来测试

启动keepalived :systemctl start keepalived

(4)测试

  • 在浏览器中输入虚拟的IP地址
  • 把主服务器停止Nginx和keepalived(成功的话应该是也能真实访问),继续访问

(5)配置文件相关

一:全局模块:
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
二、检查脚本配置
在这里插入图片描述

其中weight 里面的值就是当你宕机之后改变权重的值,这里就可以宕机之后切换主服务器

三、虚拟IP的配置
在这里插入图片描述

advert_int 表示每隔多少时间检测心跳,即看你是否宕机

authentication 权限设置

可以绑定多个虚拟IP

Nginx 原理

1、master和work
在这里插入图片描述
2、
在这里插入图片描述

3、一个master 和 多个worker

(1)可以使用nginx- s reload热部署。利于nginx进行热部署操作

(2)对于每个worker 都是一个独立的进程,不需要加锁,这样就不会带来额外的开销,同时当一个worker宕机之后,其他worker就不会受影响,其他worker继续争抢。

4、我们要设置多少个worker菜式最合适的

​ Nginx和redis类似都采用io多路复用机制(在windows中没有),每个worker都是一个独立的进程,但是每个进程里面只有一个主线程,通过一部非阻塞的方式来处理请求,即是是上万个请求也不在话下。

​ worker 数和服务器的cpu的数量相等是最合适的

5、连接数。

发送一个请求占用;了worker的几个连接数?

答案:2个或者四个

nginx有一个master,有四个worker,每个worker支持最大的连接数据1024,支持的最大并发数是多少?

答案:
在这里插入图片描述

keepalived相关参数:

参考链接:https://www.cnblogs.com/ywrj/p/9483427.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值