Nginx基础学习

一、Nginx简介

简单来讲,Nginx就是一个服务器,它可以作为http服务器、反向代理服务器,也可以作为邮件代理服

务器。

Nginx的特点是占用内存少,并发处理能力强(nio)。Nginx的并发处理能力在同类的Web服务器中表现

极好,有大量的网站使用了Nginx,如的:淘宝、新浪、搜狐、网易、美团等。

Nginx是开源免费的,同时Nginx也有收费的商业版本,商业版本提供了性能优化、宕机紧急处理等技

术支持和服务。

二、Nginx环境搭建

0、安装前置库

下载阿里云 CentOS 7 镜像源

复制代码
# 下载阿里云 CentOS 7 基础源
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

# 下载阿里云 Epel 源(扩展包)
curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo

清理并重建 YUM 缓存

复制代码
# 清理旧缓存
yum clean all

# 重建缓存
yum makecache

完成以上配置后,再执行你需要的安装命令:

复制代码
yum install -y gcc gcc-c++ make pcre pcre-devel zlib zlib-devel openssl openssl-devel

# 安装编译器、依赖库、开发工具
sudo yum install -y gcc gcc-c++ make automake autoconf libtool
# 安装核心依赖(正则、压缩、SSL)
sudo yum install -y pcre pcre-devel zlib zlib-devel openssl openssl-devel

1、下载安装

nginx: download

在nginx安装包的根目录下执行configure脚本

复制代码
配置安装路径
[root@localhost nginx-1.12.2]# ./configure --prefix=/usr/local/nginx

configure是用于做配置的,-prefix指定了nginx的安装路径,这里仅仅只是指定安装路径,并没有真

正安装nginx。执行完该脚本后,会生成一个objs文件夹

编译

复制代码
make

安装

复制代码
make install

进入nginx的安装好以后的根路径

conf文件夹中存放了nginx的配置文件。其中包含了nginx的主配置文件:nginx.conf

html文件夹中存放了nginx默认的页面:50x.htmlindex.html

logs文件夹中将会存放nginx的日志文件,当访问nginx后,access.log就会记录访问信息

sbin文件夹中包含了nginx的启动命令:nginx

2、配置Nginx环境变量

启动Nginx
复制代码
/usr/local/nginx/sbin/nginx
复制代码
nginx -c /usr/local/nginx/conf/nginx.conf

当我们键入nginx命令启动nginx服务时,默认使用的就是以上的配置文件

关闭Nginx
复制代码
./nginx -s stop

优雅地关闭nginx:不再接收新的请求,等正在处理的请求全部完成后再关闭nginx服务

复制代码
nginx -s quit

让nginx重读nginx自己的配置文件,但不会重启服务

复制代码
nginx -s reload

要实现任何位置输入nginx执行运行,需要配置环境变量:

复制代码
export PATH=$PATH:/usr/local/nginx/sbin
复制代码
netstat -tunlp
yum -y install net-tools
检查配置

当修该nginx的配置后,可以使用以下命令对配置文件进行语法检查:

3、防火墙配置

复制代码
[root@localhost yt]# firewall-cmd --add-port=80/tcp
success
[root@localhost yt]# firewall-cmd --add-port=80/tcp --permanent
success
[root@localhost yt]# firewall-cmd --reload
success
[root@localhost yt]# firewall-cmd --list-all

浏览器访问正常

三、Nginx主要目录简介

conf文件

备份源配置文件:

复制代码
cp nginx.conf nginx.conf.bak

html文件

复制代码
[root@localhost html]# ls
50x.html  index.html

验证一下是在index.html

在该HTML最后追加内容:

复制代码
 echo '<br /> I AM NGINX <br />' >> index.html

logs文件

注意:

误删后的解决办法:

复制代码
[root@localhost logs]# ps -ef | grep nginx
root      14399      1  0 17:45 ?        00:00:00 nginx: master process nginx -c /usr/local/nginx/conf/nginx.conf
nobody    14400  14399  0 17:45 ?        00:00:00 nginx: worker process
root      14698  14680  0 18:19 pts/2    00:00:00 grep --color=auto nginx
[root@localhost logs]# kill -9 14399
[root@localhost logs]# kill -9 14400
[root@localhost logs]# ps -ef | grep nginx
root      14700  14680  0 18:20 pts/2    00:00:00 grep --color=auto nginx
[root@localhost logs]# nginx
[root@localhost logs]# ll
总用量 4
-rw-r--r--. 1 root root 0 3月  19 18:21 access.log
-rw-r--r--. 1 root root 0 3月  19 18:21 error.log
-rw-r--r--. 1 root root 6 3月  19 18:21 nginx.pid

sbin文件

四、Nginx常见用法

先备份一下nginx.conf配置文件

Nginx配置文件语法规则

a.Nginx的配置文件由指令与指令块构成

b.每条指令以";"结尾,指令与参数之间以空格分隔

c.指令块以"{ }"将多条指令组织在一起

d.使用#来添加注释

全局块

全局配置作用于所有的虚拟主机。

复制代码
#配置哪个用户可以运行worker进程,这里指定nobody用户,也就是所有用户
#nobody是一个linux系统的用户,往往用于启动服务,没有密码,无法直接登录
user nobody;

#配置worker工作进程的数目,通常设置为服务器cpu的数量或cpu数量的2倍,为了高并发
worker_processes  1;
复制代码
[root@localhost conf]# vi nginx.conf
[root@localhost conf]# nginx -s stop
[root@localhost conf]# nginx
[root@localhost conf]# ps -ef | grep nginx
root      14754      1  0 18:35 ?        00:00:00 nginx: master process nginx
nobody    14755  14754  0 18:35 ?        00:00:00 nginx: worker process
nobody    14756  14754  0 18:35 ?        00:00:00 nginx: worker process
nobody    14757  14754  0 18:35 ?        00:00:00 nginx: worker process
nobody    14758  14754  0 18:35 ?        00:00:00 nginx: worker process
root      14760  14680  0 18:35 pts/2    00:00:00 grep --color=auto nginx

nobody用户启动worker进程

复制代码
#配置日志级别:debug info notice warn error crit,默认是error,大于该级别的日志会进行记录
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
复制代码
#配置进程pid文件
#pid        logs/nginx.pid;

nginx.pid文件中存放着当前启动nginx后,nginx进程的pid,当关闭nginx服务后,该文件也会被删除

events块

复制代码
events {
	#配置每个worker进程的连接数上限
	#nginx支持的总连接数: worker_processes * worker_connection
    worker_connections  1024;
}

注意,worker_connection的最大值是65535

http块

http块可以包含多个server块,每一个server块配置的都是一个虚拟主机,而一个server块中又可以包含多个location块,每一个location块都是一个虚拟主机中的一个资源路径。在server块以外的内容,是所有server的公共基础配置。(提醒自己:先学虚拟主机配置,再学其他配置)

将Nginx中配置的注释行全部删除:

删除前:

删除注释之后:

复制代码
worker_processes 4;

events {
    worker_connections  1024;
}

http {
	#include用于引入mime.types文件,nginx会在nginx.conf所在路径找该文件
	#配置虚拟主机支持的数据类型,在mime.types文件中描述了很多数据类型
    include       mime.types;
    #如果是虚拟主机不能识别的数据类型,则直接使用二进制流传输
    #此时浏览器会提示下载
    default_type  application/octet-stream;

	#开启零拷贝(nio),通俗讲就是开起高效文件传输模式
    sendfile        on;

	#HTTP有一个KeepAlive模式,它告诉webserver在处理完一个
	#请求后保持这个TCP连接的打开状态。若接收到来自客户端的其它
	#请求,服务端会利用这个未被关
	#闭的连接,而不需要再建立一
	#个连接。KeepAlive在一段时间内保持打开状态,它们会在这段时
	#间内占用资源。占用过多就会影响性能。Nginx使用keepalive_timeout
	#来指定KeepAlive的超时时间。指定每个TCP连接最多可以保持多长时间。
	#Nginx的默认值是75秒,有些浏览器最多只保持60秒,所以可以设定为
	#60秒。若将它设置为0,就禁止了keepalive连接。
    keepalive_timeout  65;

	#使用gzip压缩响应数据,在响应数据较大的情况下
	#服务器会使用gzip方式压缩数据,并通过响应头
	#Content-Encoding告诉浏览器使用gzip格式解压
    #gzip  on;

    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虚拟主机配置

配置虚拟主机讲解:

复制代码
# 配置虚拟主机
server {
        listen       80;
        server_name  localhost;

		# "/"表示通用匹配,当请求无法匹配其他1ocation时,就会匹配到该location
        location / {
        	#root用于转换请求路径中的"/"为html
            root   html;
            #当"/"后面没有写资源名的时候,就寻找index.html或index.htm
            #index这个配置,只能用于"/"这个通用路径
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        # "="表示精确匹配
        location = /50x.html {
            root   html;
        }

    }

五、部署静态网站

Nginx是一个可以接收HTTP请求,且发出HTTP响应的web服务器。web服务器上只能部署静态资源(HTML、JS、CSS、图片),它无法解析处理动态资源(JSP、Servlet)。所以动态资源不要部署到Nginx服务器上。

准备一个静态网站

静态网站:disney

修改nginx.conf的配置,配置路径

重启Nginx

注意:开启防火墙

复制代码
# 格式:firewall-cmd --add-port=端口号/协议 --permanent
firewall-cmd --add-port=8080/tcp --permanent

# 关键步骤:重新加载防火墙规则,使永久配置生效
firewall-cmd --reload

访问修改之后的情况:

六、负载均衡搭建

负载均衡概述

在一个网站创立初期,我们一般都使用单台机器对外提供集中式服务。随着业务量的增大,一台服务器的压力会越来越大,此时就会使用"集群"对外提供服务,所谓负载均衡就是将请求分配给集群中不同的服务器节点上。

Nginx负载均衡原理图

准备tomcat

配置woniusales:Tomcat下配置woniusales-CSDN博客

复制代码
解压到指定目录,注意和上面jdk的路径要保持一致
tar -zxvf apache-tomcat-8.5.59.tar.gz -C /usr/soft/
复制代码
配置环境变量
vi ~/.bash_profile
执行环境变量的配置:
source .bash_profile

准备好2个tomcat服务,分别占用8006&8081、8007&8082端口

修改t8081的配置,占用8006&8081

复制代码
vi t8081/conf/server.xml 

修改t8082的配置,占用8007&8082端口

复制代码
vi t8082/conf/server.xml

分别启动8081、8082服务

防火墙开放8081、8082端口

截止到现在,并没有实现负载均衡,分别是通过Tomcat的不同端口号进行访问的,想要实现负载均衡需要再Nginx中配置,使其从同一的入口进行访问。

Nginx负载均衡配置

复制代码
cd /usr/local/nginx/
vi conf/nginx.conf

    upstream myloadbalance {
         server 192.168.102.149:8081;
         server 192.168.102.149:8082;
    }

    server {
       listen 8888;
       server_name loadbalance;

       location / {
              proxy_pass http://myloadbalance;
       }

   }
复制代码
vi /usr/soft/t8081/webapps/ROOT/index.jsp
复制代码
vi /usr/soft/t8082/webapps/ROOT/index.jsp

负载均衡配置成功:

七、负载均衡策略

轮询(默认)

Nginx会将请求均匀地转发给tomcat服务器

权重轮询

使用的是平滑加权轮询算法

八、反向代理和正向代理

反向代理的特点:

1.客户端不知道自己的请求最终会被转发到哪个服务器上。

2.反向代理,是存在于服务器端的

正向代理的特点:

1.客户端知道自己的请求,最终会被转发到哪个服务器上。

2.正向代理,是存在于客户端的

九、静态代理

所谓的静态代理,就是把静态资源部署到Nginx服务中,而不是部署到tomcat中。因为Nginx更擅长于

静态资源的处理(支持0拷贝),性能更好,效率更高!所谓静态资源,就是:html,css,Js,jpg...

所以在实际应用中,我们将静态资源(图片、css、htmI、js等)都交给Nginx处理,而不是由tomcat

处理。

静态代理实现方式一

在nginx.conf的location中配置静态资源的后缀

复制代码
1ocation ~.*\.(js|css|htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt){
    root /opt/static
}

~表示正则匹配,也就是说后面的内容是正则表达式。以上整个配置表示:以这些指定后缀结尾的文件都由nginx处理。

要注意放置静态资源的目录,如果用户对该目录的操作权限不足的话,就是出现403的错误,可以通过"chmod 777"来设置所有用户都能对该目录进行"读、写、执行"的操作。

静态代理实现方式二

复制代码
location ~.*/(css|js|img|images){
    root /opt/static;
  }

以下的ip地址:192.168.88.129是Nginx服务器的ip地址。

比如,用户访问http://192.168.88.129/myweb/css/all.css,则nginx就会访问到linux系统中的这个目录: /opt/static/myweb/css/all.css

比如,用户访问http:/192.168.88.129/myweb/js/index.js,则nginx就会访问到linux系统中的这个目录: /opt/static/myweb/js/index.js

比如,用户访问http://192.168.88.129/myweb/img/a.jpg,则nginx就会访问到linux系统中的这个目录: /opt/static/myweb/img/a.jpg

十、动静分离

没有动静分离的日子里:

有了动静分离的日子里:

Nginx的动静分离,一般用于前后端分离,我们会把前端应用直接部署到Nginx服务器中。

十一、会话共享

分布式会话解决方案:

1.ip_hash

2.会话复制(不推荐,面试的谈资)

3.第三方管理会话

这里我们学习一下会话复制的解决方案

1.修改2个tomcat的server.xml文件,将cluster的注释去掉

2.web应用下的web.xml,增加标签

配置改为之后重新Tomcat,Nginx。

3.让nginx重新加载配置文件,且重启2个tomcat,此时再访问nginx,会发现在不同的tomcat服务器

之间,有了相同的会话id!

注意:

2个tomcat服务器,1.要开放4000和45564端口,2.要重启防火墙,而不是重新加载防火墙

Nginx原理

一个master和多个worker的好处,可以使用热部署:nginx -s reload

对于每个worker进程来说,都是独立的进程。采用独立的进程,可以让worker之间互不干扰,一个worker退出后,其他woker不受影响,保证整个nginx服务不会中断。

woker的数量

nginx采用了io多路复用机制(select pselect poll),每个worker都是一个独立的进程,但每个进程里只有一个线程,就是主线程,通过异步非阻塞的方式来处理请求,即使是成干上万个请求,nginx也能够处理。

每个worker的线程可以把cpu的性能发挥到极致,所以worker数的最佳数量就是cpu的数量。设置少了会浪费cpu,设置多了会造成cpu频繁切换上下文,导致不必要的性能损耗!

相关推荐
星幻元宇VR2 小时前
VR生产安全学习机|将安全教育带入沉浸式实训新时代
科技·学习·安全·vr·虚拟现实
背包客(wyq)2 小时前
基于Android手机的语音数据采集系统(语音数据自动上传至电脑端)
android·网络
CaracalTiger2 小时前
Windows 环境下 OpenClaw 的安装与千问Qwen、Kimi、MiniMax、GLM国产大模型配置完全指南
运维·ide·windows·开源·github·aigc·ai编程
默|笙2 小时前
【Linux】进程信号(2)_信号保存
linux·运维·服务器
啥咕啦呛2 小时前
java打卡学习2:Stream高级与Optional
java·windows·学习
试试勇气2 小时前
Linux学习笔记(十九)--生产消费模型与线程安全
java·笔记·学习
jiayong232 小时前
0基础学习VUE3 第 3 课:任务页怎么把列表、筛选、表单、弹窗串起来
前端·javascript·学习
2301_807367192 小时前
Linux(CentOS)安装 Nginx
linux·nginx·centos
天行健,君子而铎2 小时前
联动闭环、精确、动态:医疗行业数据库审计与风险监测实践方案
网络·数据库