Nginx学习笔记

文章目录

  • 一、Nginx初始
  • 二、正向代理和反向代理
    • (一)正向代理
    • (二)正向代理的使用场景
    • (三)反向代理
    • (四)反向代理的使用场景
  • 三、Nginx的安装
    • (一):Linux下安装Nginx
    • (二):Windows下安装Nginx
  • 四、Nginx常用命令
  • 五、Nginx配置(nginx.conf文件内容模块及作用)
    • (一)文件内容及模块
    • (1)、全局块的作用
    • (2)、events块的作用
    • (3)、Http块的作用
    • (3.1、虚拟主机的配置
    • (3.2、日志的配置
  • 六、反向代理配置
    • (一)配置反向代理的nginx.conf文件
    • (二)实现在同一域名下,根据不同的访问路径访问不同的项目
  • 七、负载均衡
    • (一)概念
    • (二)负载均衡器可以处理的四大类型的请求
    • (三)负载均衡的调度算法
    • (四)负载均衡的使用
  • 八、动静分离
    • (一)概念
    • (二)实现方式
    • (三)动静分离的应用
  • 九、location块补充
    • (一)、匹配规则
    • (二) URL重写


一、Nginx初始

Nginx是一个高性能的Http和反向代理服务器,也是一个IMAP/POP3/SMTP等邮件代理服务器

二、正向代理和反向代理

如果客户端(client)不能直接访问服务端(server),则需要代理服务器(proxy)进行访问

(一)正向代理

正向代理:客户端通过设置,使用代理服务器去访问远程服务器

(二)正向代理的使用场景

1、可以访问原来无法访问的资源
2、可以做缓存使用,加快访问速度
3、对客户端授权或记录访问信息等

(三)反向代理

反向代理:服务器通过代理服务接收连接请求,然后再转发给内部网络的服务器,将服务器的结果返回给客户端,此时这种代理叫反向代理

(四)反向代理的使用场景

1、保证内网的安全,阻止web攻击
2、负载均衡,优化网站的负载(处理能力)

注意:正向代理知道是通过代理服务器访问服务端的,但是反向代理不知道是通过代理服务器访问服务端的
一句话总结:代理服务器站在客户端一边(客户端知道是通过代理服务器访问的)就是正向代理,代理服务器站在服务器端一边(客户端不知道是通过代理服务器访问的),就是反向代理

三、Nginx的安装

(一):Linux下安装Nginx

以openssl为例:
1、在各官网下载相关组件: Nginx 、openssl 、 zlib 、 pcre等
2、通过rz 上传压缩包
3、通过tar -xvf *.tar.gz进行解压缩
4、通过cd 文件夹名 进入解压后的文件夹中
5、通过 ./config 执行配置相关的检查
6、通过make & make install进行编译和安装

注意:如上过程适用于zlib和pcre ,对于pcre而言,执行检查命令为./configure
7、安装nginx过程中、执行配置检查
图片:
8、仍然执行make以及make install
9、nginx安装成功,./nginx进行验证
注意事项:nginx服务器,需要虚拟机开放80端口的访问
防火墙配置(同样适用于tomcat开放8080 8081端口)
firewall-cmd --list-all 查看当前配置
firewall-cmd --add-service=http --permanent 开放http访问
firewall-cmd --add-port=80/tcp --permanent 开放80端口
firewall-cmd --reload 重启防护墙保护
JDK的安装:
1、解压缩—拷贝目录到/usr/local/java
2、更改环境变量 vim /etc/profile
图片
3、让环境变量生效 source /ect/profile
4、验证版本 java --version
Tomcat的安装
1、解压缩—拷贝目录到 /usr/local/tomcat
2、直接执行 ./startup.sh 启动

(二):Windows下安装Nginx

四、Nginx常用命令

nginx安装包所在目录 /usr/local/src/
nginx安装目录:/usr/local/nginx/
启动命令:./nginx
验证方式:浏览器访问 虚拟机ip地址(出现nginx欢迎页面)
关闭方式:
1、./nginx -s stop 原生命令
2、也可以通过linux关闭进程的命令关闭,
查看文件 cat nginx.pid
杀死进程:kill +参数+pid 形式 (pid表示进程的id)
如:kill -9 pid 强行停止服务
kill -TERM pid 快速停止服务
kill -QUIT pid 平缓停止服务
注意:启动后,进程id存放位置 /usr/local/nginx/nginx.pid
查看所有命令: ./nginx -h
信号处理命令:./nginx -s +(stop,quit,reopen,reload)
其中reload 是重新加载命令,在更改配置后使用
quit仍然是平缓停止的意思(完整有序),stop快速停止

五、Nginx配置(nginx.conf文件内容模块及作用)

查看nginx配置:cat nginx.conf

(一)文件内容及模块


#user  nobody;
worker_processes  1;

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


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

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


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}

分为三个部分:全局块、events块、http块。

(1)、全局块的作用

全局块:全局指令,指定运行时的用户组、进程id存在位置、日志存放位置、worker process数量等
如:

#配置用户或者用户组
#user  nobody;

#允许生成的进程数(支持的并发数量)
worker_processes  1;

#配置日志的路径 可以配置日志级别 (debug | info | notice | warn | error | crit)
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#配置存储进程id的文件地址
#pid        logs/nginx.pid;

(2)、events块的作用

影响nginx服务器和用户网络连接的配置,比如每个进程的最大连接数、选取哪种事件驱动模型、以及在网络连接过程中,是否开启多个,是否序列化等

events {
	#配置每个进程的最大连接数,默认为1024
    worker_connections  1024;
}

(3)、Http块的作用

配置代理、缓存、日志等绝大部分功能的地方,可以嵌套多个server块,而且不同的server可以对应不同的域名(就是在一个nginx服务器上配置多个域名,这种方式通常称为虚拟主机),

虚拟主机:同一台Nginx服务器,可以支持多个网站的运行,每个虚拟主机之间都相互独立,具有完整功能。(可以节约使用成本)

(3.1、虚拟主机的配置

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       80;
        #监听的域名
        server_name  localhost;
        	
		#定位出路径或文件地址
        location / {
        	#部署项目jar包的相对路径
            root   html;
            #默认跳转的首页地址
            index  index.html index.htm;
        }
    }    
}

配置指定域名(www.ceshi.com),访问到虚拟机的页面
1、在安装目录下,创建一个存放要部署的项目文件夹,如:mkdir ceshi
2、将要部署的文件存放在ceshi文件夹中
3、注意在配置config文件时记得备份一份,防止配置出错
更改配置如下

 server {
        listen       80;
        server_name  www.ceshi.com;
        location / {
            root   ceshi;
            index  index.html index.htm;
        }
    }    

4、给域名配置ip地址的映射(更改C:\Windows\System32\drivers\etc 下的host文件)

# Copyright (c) 1993-2009 Microsoft Corp.
#
		.............
		
# localhost name resolution is handled within DNS itself.
#	127.0.0.1       localhost
#	::1             localhost

#给域名配置ip地址的映射
192.168.1.20		www.ceshi.com

5、浏览器输入虚拟机地址或者域名,均能返回项目首页

(3.2、日志的配置

通过日志,可以获取用户的地址信息、跳转来源、终端、以及url访问量的

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

日志的demo

127.0.0.1 - - [12/Sep/2022:17:56:58 +0800] "GET /favicon.ico HTTP/1.1" 404 555 "http://localhost/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36 Edg/105.0.1343.33"

log_format main 参数说明

名字 用途
remote_addr 客户端的ip地址
remote_user 客户端的用户名称
time_local 访问时间和时区
request 请求方法
status 响应状态码 如:200
body_bytes_sent 主体内容字节数 如:612
http_referer 记录是从哪个链接访问过来的
http_user_agent 代表用户使用的代理,一般为浏览器
http_x_forwarded_for 通过代理服务器来记录客户端的ip地址

可以通过脚本实现日志切割(每天生成一份日志)
1、重命名日志文件
2、让nginx重新从配置文件总读取日志文件名,这样就可以达到在新的日志文件中记录日志效果

六、反向代理配置

前提:在linux系统中安装好jdk和tomcat(配置好环境变量)
安装路径:
1、jdk路径:/usr/local/java/
2、tomcat路径:/usr/local/tomcat/
启动方式:/usr/local/tomcat/bin 执行 ./startup.sh
关闭方式:执行 ./shutdown.sh
验证方式: 虚拟机ip:8080 可以看到tomcat页面

需求:
访问www.ceshi.com 显示百度的页面

(一)配置反向代理的nginx.conf文件

	#配置对应的虚拟主机
    server {
    	#监听的端口
        listen       80;
        #监听的域名
        server_name  www.ceshi.com;
        	
		#定位出路径或文件地址
        location / {
        	#部署项目jar包的相对路径
            root   ceshi;
            #将域名请求,跳转发送到百度上,相当于直接访问https://www.baidu.com
            proxy_pass  https://www.baidu.com
            #默认跳转的首页地址
            index  index.html index.htm;
        }
    }    

注意:更改配置文件nginx.conf文件后,执行重加载命令 ./nginc -s reload

(二)实现在同一域名下,根据不同的访问路径访问不同的项目

**需求:**一个nginx服务器连接多个项目,当域名对应的路径不同时,跳转不同的项目

配置nginx.conf配置文件

#配置对应的虚拟主机
    server {
    	#监听的端口
        listen       80;
        #监听的域名
        server_name  www.ceshi.com;
        	
		#定位出路径或文件地址
        location ~/baidu1 {  #~/baidu1 表示当访问www.ceshi.com+baidu1时跳转的页面为https://baidu.com
        	#部署项目jar包的相对路径
            root   ceshi;
            #将域名请求,跳转发送到百度上,相当于直接访问https://www.baidu.com
            proxy_pass  https://www.baidu.com
            #默认跳转的首页地址
            index  index.html index.htm;
        }
        #定位出路径或文件地址
        location ~/guge1 {  #~/guge1 表示当访问www.ceshi.com+guge时跳转的页面为https://www.guge.com
        	#部署项目jar包的相对路径
            root   guge1;
            #将域名请求,跳转发送到百度上,相当于直接访问https://www.baidu.com
            proxy_pass  https://www.guge.com
            #默认跳转的首页地址
            index  index.html index.htm;
        }
    }    

七、负载均衡

(一)概念

早期使用DNS(域名解析系统)做负载,具体而言,给客户端解析不同的ip地址,让流量直接到达服务器。
clientN 先到达负载均衡器(load balancer) 再通过调度算法 分配到不同的serverN
优点:
1、通过健康检测,避免单点故障
2、当发现节点故障时,从集群中移除,保证应用的高可用
四层负载均衡,在OSI模型的传输层,主要是转发
七层负载均衡,在OSI模型的应用层,主要是代理

(二)负载均衡器可以处理的四大类型的请求

HTTP/HTTPS/TCP/UDP等

(三)负载均衡的调度算法

1、轮询:相当于将服务器从第一台到最后一台形成一个环状,每接收一个请求,则从第一台开始循环遍历。
2、最小连接,优先选择连接数最小的服务器,适用于会话时间较长的业务处理
3、ip映射,根据请求的ip地址进行散列,让同一个ip下的请求都映射到同一服务器上,可以解决session问题(粘性会话)

(四)负载均衡的使用

需求:当访问虚拟机ip 192.168.2.10/lb/index.html时,通过负载均衡,让请求平均分配到8080和8081tomcat端口中
1、分别找到两个tomcat的安装目录,如/usr/local/tomcat/webapps
创建lb目录, mkdir lb
创建访问页面 ,cp tomcat1/index.html
查看页面内容, cat lb/index.html
2、配置nginx.conf
注意:使用负载均衡时,需要在http块下创建一个upstream 名字 块,如

http{
	#创建upstream块,用来记录server列表的的地址和端口
	upstream  myserver{
		server 192.168.1.20:8080
		server 192.168.1.20:8081
	}
	server{
	
	}
}

再增加一个location

location ~/lb/ {
	#将请求映射到负载均衡器中 参数为配置的upstream名称
	proxy_pass  http://myserver;
}

完整如:

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;
    
    #创建upstream块,用来记录server列表的的地址和端口
	upstream  myserver{
		server 192.168.1.20:8080
		server 192.168.1.20:8081
	}
    
	#配置对应的虚拟主机
    server {
    	#监听的端口
        listen       80;
        #监听的域名
        server_name  localhost;
        	
		location ~/lb/ {
			#将请求映射到负载均衡器中  参数为配置的upstream名称
			proxy_pass  http://myserver;
		}
    }    
}

以上时默认的轮询调度算法

如果需要某个服务器处理的更多些,则需要额外设置权重,则在server 后面加 weigth=数字,weight的默认值是1

如:

     upstream  myserver{
		server 192.168.1.20:8080 weight=2
		server 192.168.1.20:8081 weigth=1
	}

如果需要根据ip地址,固定server处理,可以使用ip_hash。
如:

upstream  myserver{
		server 192.168.1.20:8080 weight=2;
		server 192.168.1.20:8081 weigth=1;
		ip_hash;
	}

八、动静分离

(一)概念

将动态和静态请求分离开,不能单纯的理解为动态页面和静态页面的物理分离。
如果是静态资源请求,直接查找nginx上的静态资源地址
如果是动态资源请求,通过反向代理,映射到tomcat路径下的资源

(二)实现方式

1、单独把静态文件放在独立的服务器及独立的域名下,推荐方案
2、将动态资源和静态资源混合在一起,通过nginx来分开

(三)动静分离的应用

需求:
访问图片等静态资源时,可以直接从nginx中获取,访问jsp等动态资源时,通过tomcat返回结果
处理流程
1、在/usr/local/tomcat/webapps下通过rz命令上传本地的index.jsp
2、在/usr/local/nginx/image下通过rz命令上传本地的test.png图片
3、配置nginx.conf文件
如:

#配置动态资源的请求转发	
		location ~.*.jsp$ {
			#将请求映射到负载均衡器中  参数为配置的upstream名称
			proxy_pass  http://myserver;
		}
		#配置静态资源的请求转发	
		location ~.*\.(gif|jpg|png|css)$ {
			#配置静态资源的存放路径
			root /usr/local/nginx/image
			#在浏览器端使用缓存,配置过期时间,相当于redis 3d表示三天
			ecpire 3d}

完整配置

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;
    
    #创建upstream块,用来记录server列表的的地址和端口
	upstream  myserver{
		server 192.168.1.20:8080
	}
    
	#配置对应的虚拟主机
    server {
    	#监听的端口
        listen       80;
        #监听的域名
        server_name  localhost;
        #配置动态资源的请求转发	
		location ~.*.jsp$ {
			#将请求映射到负载均衡器中  参数为配置的upstream名称
			proxy_pass  http://myserver;
		}
		#配置静态资源的请求转发	
		location ~.*\.(gif|jpg|png|css)$ {
			#配置静态资源的存放路径
			root /usr/local/nginx/image
			#在浏览器端使用缓存,配置过期时间,相当于redis 3d表示三天
			ecpire 3d}
    }    
}

4、验证方式:分别访问:http://192.168.1.20/jsp/index.html和http://192.168.1.20/test.png

九、location块补充

(一)、匹配规则

1、location=/uri 精确匹配
2、location^~ /uri 前缀匹配 顺序在正则之前
3、location /uri 前缀匹配,顺序在正则匹配之后
4、location -pattern 区别大小写的正则匹配
5、location -*pattern 不区分大小写的正则匹配
6、location / 通用匹配,接受未匹配到其他location的请求

匹配顺序:
首先会精确匹配,然后会进行前缀匹配,具体顺序按照指令长度,从长到短的顺序依次匹配。但是在正则匹配时,是按照配置文件的顺序依次匹配的,如果不希望前缀匹配进行正则匹配,那么使用^~

(二) URL重写

对url的规范处理,域名更换时的新旧跳转,一些额外的参数调整等

#配置对应的虚拟主机
    server {
    	#监听的端口
        listen       80;
        #监听的域名
        server_name  www.ceshi.com;
        #url重写,当访问www.ceshi.com 时,地址栏会变成www.baidu.com
      	rewrite ^/(.*) http://www.baidu.com/$1 pernanent;
    }  

你可能感兴趣的:(Nginx,nginx,学习,服务器)