Nginx学习笔记

笔记来源:哔哩哔哩尚硅谷nginx教程
nginx官网下载

基本概念

什么是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描述

Nginx作为web服务器

Nginx可以作为静态页面的web服务器,同事还支持CGI协议的动态语言,例如perl、php等。但不支持java。java程序只能通过与Tomcat配合完成。Nginx专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率,能经受高负载的考验,有报告标明能支持高达50000个并发连接数。

反向代理

正向代理:局域网外的Internet看做是一个巨大的资源库,那么局域网中的客户端想要访问Internet,则需要通过代理服务器来访问,这种代理服务就是正向代理

反向代理:我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址

负载均衡

当我们采用服务器集群部署后,代理服务器会根据不同的负载均衡策略,例如轮询之类的,将请求分发到各个服务器

动静分离

为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度,降低原来但发个服务器的压力。这就是动静分离。例如之前我们将html、css等全部打包部署在Tomcat内,因此浏览器请求这些静态资源的时候也要请求Tomcat服务器,为了解决这个问题我们将静态资源单独拿出来放在另外的服务器,减轻Tomcat压力,这就是动静分离。

安装、常用命令及配置文件

在Linux系统中安装Nginx

  1. 下载nginx包
  2. 首先安装nginx依赖的其他包
    1. 安装pcre wget http://downloads.sourceforge.net/project/pcre/pcrepcre/8.37/pcre-8.37.tar.gz
    2. 解压文件到./configure,完成后,回到pcre目录下执行make,再执行make install

算了 不写了,参考 这位歹佬的帖子

在Windows系统中安装

官网下载地址
在这里插入图片描述
下载后解压(切记不能含有中文路径!!),文件结构如图(我解压的路径就有中文,记得拷贝放置于英文目录下即可!):
在这里插入图片描述

启动

两种方法:

1) 直接双击该目录下的"nginx.exe",即可启动nginx服务器;

2) 命令行进入该文件夹,执行start nginx命令,也会直接启动nginx服务器。

验证

开浏览器,输入地址:http://localhost:88,默认端口是80,因此可以直接访问localhost即可,我这里是将配置文件的监听端口改成了88. 访问页面,出现如下页面表示访问成功。如果访问不成功有可能是88端口被占用了,可以使用命令netstat -ano | find ":88"查询端口占用情况,如果被占用,可以在conf/nginx.conf文件中修改端口,修改后再启动。
在这里插入图片描述

Nginx常用命令

  • 查看版本号 ./nginx -v
  • 启动nginx ./nginx
  • 停止关闭nginx ./nginx -s stop
  • 重新加载 nginx ./nginx -s reload (当重新修改了nginx配置文件之后,需要重新启动才能生效,使用这个命令就可以重新加载配置文件,不需要重启)

Nginx配置文件

配置文件的位置

Linux系统中配置文件的位置/usr/local/nginx/conf/nginx.conf

配置文件组成
全局块

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

#user  nobody;
worker_processes  1; # 表示nginx服务器处理并发的配置,这个数值越大,表示能处理并发的数量就越多,但是也会受到软硬件的制约

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

# 上面这部分
events {
    worker_connections  1024;
}

events块

events块设计的指令主要影响nginx服务器与用户的网络连接,常用的设置包括是否开启对多work process下的网络连接进行序列化,是否允许同事接收多个网络连接,选取那种事件驱动模型来处理连接请求,每个work process可以同事支持的最大连接数等。例如下面这个配置就表示支持的最大连接数为1024

events {
    worker_connections  1024;
}
http块(重要)

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

  • 全局块
http {
    include       mime.types;
    default_type  application/octet-stream;

    #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;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;
# 上面这部分就是全局块
    server {
        listen       8888;
        server_name  localhost;
		...
  • server块(重要)
    server块中有很多注释都是一些写好的案例,可以参照来配置,后面会详细讲
    • 全局server块
    • location块
server {
        listen       8888;# nginx监听的端口号
        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;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #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;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }

Nginx配置实例

反向代理实例1

  1. 实现效果:
    • 打开浏览器,在浏览器中输入地址 : www.123.com 跳转Linux系统Tomcat的主界面
  2. 准备工作
    • nginx安装
    • 在Linux系统中安装Tomcat,使用默认端口8080,并启动Tomcat
      • 下载安装包
      • 将安装包上传至Linuxusr/src/(使用xshell或者xftp或者其他工具都行,连接Linux服务器,然后上传即可)
      • 解压压缩包tar -vxf(需要jdk环境)
      • 进入解压后的bin目录
      • 执行startup.sh启动Tomcat
      • 对外开放访问的端口firewall-cmd --add-port=8080/tcp --permanent firewall-cml --reload
      • 查看对外开放的端口命令firewall-cmd --list-all
      • ip+端口访问看是否启动成功
  3. 要实现的效果
    • 在浏览器中输入www.123.com,通过nginx转发访问Linux中的Tomcat
    • www.123.com这个域名要在Windows的host文件中进行配置域名映射的IP地址
  4. 具体配置
    • 在host文件中进行域名和IP的配置在这里插入图片描述
      在这里插入图片描述
    • 在nginx进行请求转发的配置
    server {
        listen       80;# nginx监听的端口号
        server_name  192.168.17.129;# 主机名称
    
        #charset koi8-r;
    
        #access_log  logs/host.access.log  main;
    
        location / {
            root   html;
            proxy_pass http://127.0.0.1:8080
            index  index.html index.htm;
        }
    
    • 测试:启动nginx,在浏览器访问www.123.com 。
      具体步骤:在访问这个域名的时候,会首先查找host文件中是否有对应的映射,如果没有再去dns服务器上找对应的地址 ,那么我们这里已经在host中配置了,因此实际上访问的地址是192.168.14.129 也就是Linux虚拟机的IP地址。然后由于Linux中的nginx监听的是80端口,而IP访问不带端口默认就是80端口,因此通过这种方式访问到了nginx内,然后通过反向代理配置转发到127.0.0.1:8080 ,打开了Tomcat的首页。
      注意:Linux的80端口和8080端口都要开放出来

反向代理实例2

效果:
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
实现步骤:

  1. 在Linux中启动两个Tomcat,然后分别在8080和8081端口启动
  2. 在Linux的usr/src/下新建两个文件夹,一个是Tomcat8080另一个是Tomcat8081,然后在这两个文件夹中放入两个Tomcat,然后解压缩,分别在两个端口启动
  3. 启动成功后在浏览器访问看看是否有Tomcat的欢迎页,如果没有看看是不是端口没有开放
  4. 可以将Tomcat的欢迎页修改一下或者 在刚才的Tomcat8080文件夹中找到Tomcat的解压缩文件夹,在webapp文件夹下新建一个edu文件夹,然后在里面放一个自定义的HTML文件,然后通过127.0.0.1:8080/a.html这种方式访问一下这个文件,如果能访问到,就表示Tomcat启动成功,并且可以通过这两个文件来区分8080和8081
  5. nginx具体配置,设置nginx监听9001端口,然后当访问路径中包含edu,则转发到8080,如果包含vod则转发到8081
server {
        listen       9001;# nginx监听的端口号
        server_name  192.168.17.129;# 主机名称
        location ~ /edu/ {
            proxy_pass http://127.0.0.1:8080
        }
        location ~ /vod/ {
            proxy_pass http://127.0.0.1:8081
        }

location指令说明
该指令用于匹配URL,语法如下:

location [ = | ~ } ~* | ^~ ] url {
}
  • = :用于不含正则表达式的url前,要求请求字符串与URL严格匹配,如果匹配成功,就停止继续下收缩并立即处理该请求。例如URL是192.168.0.134:8080/mms/com/list,则location中的配置URL也是mms/com/list
  • ~ :用于表示URL包含正则表达式,并且区分大小写
  • ~* :用于表示URL包含正则表达式,并且不区分大小写
  • ^~:用于不含正则表达式的URL前,要求nginx服务器找到表示URL和请求字符串匹配度最高的location后,立即使用此location处理请求,而不再使用location块中的正则URL和请求字符串做匹配

负载均衡实例

通过nginx分发请求,将请求通过不同策略分发的不同的服务器实例。

实现步骤:

  1. 还是使用上面的两个Tomcat
  2. nginx 配置如下:upstream、server.location、server.listen、server.server_name
http {
    include       mime.types;
    default_type  application/octet-stream;
    # 在这里配置服务地址
    upstream myserver {
		server 192.168.17.129:8080;
		server 192.168.17.129:8081;
	}
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;# nginx的监听端口
        server_name  192.168.17.129;# nginx的服务地址
        location / {
            root   html;
            # 在这里配置指向服务集群地址的配置,也就是upstream
			proxy_pass  http://myserver;
            index  index.html index.htm;
        }
负载均衡策略
  • 轮询(默认)因此上面的配置会使用这种策略分别发送请求到这两个服务器地址。每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,还能自动剔除
  • weight 权重:weight代表权重,权重越高被分配的客户端越多
upstream server_pool{
	server 192.168.1.11 weight=5 
	server 192.168.1.12 weight=10
}
  • ip_hash:每个请求按访问ip的哈市结果分配,这样每个访客固定访问一个后端服务器,可以解决session问题
upstream server_pool{
	ip_hash
	server 192.168.1.11 
	server 192.168.1.12
}
  • fair (第三方):按照后端服务器的响应时间来分配请求,时间越短,越优先分配
upstream server_pool{
	server 192.168.1.11 
	server 192.168.1.12
	fair
}

动静分离实例

Nginx动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的吧动态页面和静态页面物理分离。严格意义上说应该是动态请求和静态请求分开,可以理解成使用Nginx处理静态页面,Tomcat处理动态页面。动静分离从目前的实现角度来讲大致分两种:

  • 一种就是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方式
  • 另一种就是动态跟静态文件混合在一起发布,通过nginx来分开

Expires:location中可以设置一个参数expires,是给一个资源设定一个过期时间,也就说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额哇喔的流量,非常适合经常不变的资源。如果设置3d,则表示三天内访问这个URL,发送一个请求,对比服务改文件最后更新时间有没有变化,如果没有则不会从服务器抓取,而是返回状态码304,如果有,则从服务器开始下载返回200

实现步骤:

  • 在Linux中准备一个静态资源,在root目录下新建data文件夹,在下面再新建两个文件夹一个叫www另一个叫image。然后在里面分别放两个静态资源文件,一个HTML一个图片
  • nginx 配置:
server {
        listen       80;
        server_name  192.168.17.129;

        location /image/ {
            root   /data/;
            index  index.html index.htm;
        }
        location /www/ {
            root   /data/;
            autoindex on;# 这个配置的意思就是将文件夹内的文件列出来
        }

效果:
在这里插入图片描述
内容列出来就是因为autoindex那个配置,通过上面这个配置就表示nginx可以请求下来静态资源。

高级

高可用集群配置

Nginx原理

在这里插入图片描述
在Linux中Nginx有两个进程,一个是master,另一个是worker,输入命令ps -ef | grep nginx 查看nginx服务的进程。master进程负责给worker分发任务或消息

在这里插入图片描述
当客户端发送请求到nginx,然后由master进程接受,接受后master通知worker,由worker来抢这个请求,抢到的请求会通过转发或反向代理等方式去请求真正的地址,然后由worker拿到服务器返回的数据返回给客户端

一个master 多个worker的好处:

  1. 当我们使用nginx -s reload命令热部署重启nginx的时候,正在工作的worker不会停止,只有没有工作的worker才会重启,然后加载新的配置去在重启之后争抢新进请求,正在工作的worker会在工作完了之后再去更新。因此这种方式利于热部署

  2. 对每个worker进程来说,独立的进程不需要加锁,省掉了锁带来的开销,同事在编程以及问题查找时,也会方便很多。其次采用独立的进程可以让互相之间不会影响,一个进程退出后,其他还在工作,服务不会中断,降低风险

  3. 设置多少个worker才是合适的?
    nginx与redis类似,都是采用io多路复用机制,每个worker都是一个独立的进程,但每个进程里只有一个主线程,通过异步非阻塞的方式来处理请求,即使上千万个请求也不在话下。每个worker的线程可以吧一个cpu的性能发挥到机制,所以worker数和cpu数相等最为合适。设置少了会浪费CPU,多了会造成CPU频繁切换上下文带来的 损耗。

  4. worker_connection

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值