基础配置学习目标:
nginx入门
学习内容:
1、了解正向代理和反向代理
2、了解nginx功能
3、了解nginx基本配置
学习时间:
2020年8月
学习产出:
一、正向代理
正向代理即通常所说的代理,用于代表内部网络用户向Internet上的服务器(或称外部服务器,通常为Web服务器)发出连接请求,并接收响应结果,执行该代理功能的服务器称为代理服务器。使用代理服务器访问外部网络时,客户端必须在局域网设置中指明代理服务器的地址以及要代理的服务的端口号。
常用代理软件:nginx、squid、nat123(我们使用的是squid,下次学习squid的配置)
二、反向代理
反向代理的方向与正向代理相反,指代表外部网络用户向内部服务器发出请求,即接收来自Internet上用户的连接请求,并将这些请求转发给内部网络上的服务器,然后将从内部服务器上得到的响应返回给Internet上请求连接的客户:执行反向代理服务的服务器称为反向代理服务器,反向代理服务器对外部用户表现为一个服务器。
常用代理软件:HAProxy、ngrok、Apache TS、Varnish、Nginx(我们使用的是nginx,先详细了解)
三、Nginx
1、nginx是一个高性能的HTTP和反向代理web服务器。
2、特点是占有内存少,并发能力强,支持热部署等。
3、应用功能:
- web服务器:nginx可以作为静态页面的Web服务器,但不支持java,java程序只能通过与tomcat配合完成。
- 反向代理:在反向代理中,其实客户端对代理是无感的,因为客户端不需要任何配置就能可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器的ip地址。
- 负载均衡:负载均衡在实际项目操作过程中,有硬件负载均衡和软件负载均衡两种,硬件负载均衡也称为硬负载,如F5负载均衡,相对造价昂贵成本较高,但是数据的稳定性安全性等等有非常好的保障;软件负载均衡是利用现有的技术结合主机硬件实现的一种消息队列分发机制。
4、安装和启动
安装:
windows:下载对应的版本的nginx压缩包,解压到自己电脑上存放软件的文件夹中即可.
linux:nginx安装依赖GCC、openssl-devel、pcre-devel和zlib-devel软件库。
1、wget http://downloads.sourceforge.net/project/pcre/pcre/8.37/pcre-8.37.tar.gz
tar -xvf pcre-8.37.tar.gz
./configure
2、yum install gcc-c++
make && make install
3、yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
4、wget https://nginx.org/download/nginx-1.19.1 tar.gz
tar -xvf nginx-1.19.1 tar.gz
./configure
make && make install
启动:
windows:
1) 直接双击该目录下的nginx.exe,即可启动nginx服务器
2) 命令行进入该文件夹,执行nginx命令,也会直接启动nginx服务器。
linux:
cd /usr/local/nginx/sbin/执行./nginx
访问:打开浏览器,输入地址:http://localhost,访问页面,出现欢迎页面。
重启:
windows:命令行进入nginx根目录,执行nginx -s reload。
liunx:./nginx -s reload
停止:
windows:命令行进入nginx根目录,执行nginx -s stop或nginx -s stop。
linux:./nginx -s stop
5、配置
进入nginx安装目录/conf目录下,对nginx.conf文件进行修改。
整体:
main # 全局配置
events { # nginx工作模式配置
...
}
http { # http设置
....
server { # 服务器主机配置:主要用于指定虚拟主机域名、IP和端口
....
location { # 路由配置:URL匹配特定位置后的设置,反向代理、内容篡改相关设置
....
}
location path {
....
}
location otherpath {
....
}
}
server {
....
location {
....
}
}
upstream name { # 负载均衡配置
....
}
}
main模块:
# user nobody nobody; #用来指定nginx worker进程运行用户以及用户组,默认nobody账号运行
worker_processes 2; #指定nginx要开启的子进程数量,指定nginx要开启的子进程数量
#定义错误日志文件的位置及输出级别【debug / info / notice / warn / error / crit】
# error_log logs/error.log
# error_log logs/error.log notice
# error_log logs/error.log info
# pid logs/nginx.pid #指定进程id的存储文件的位置
worker_rlimit_nofile 1024; #用于指定一个进程可以打开最多文件数量的描述
event 模块:
event {
worker_connections 1024; #指定最大可以同时接收的连接数量
multi_accept on; #配置指定nginx在收到一个新连接通知后尽可能多的接受更多的连接
use epoll; #配置指定了线程轮询的方法
}
http模块:nginx最核心的一个模块
http {
##
# 基础配置
##
sendfile on; #开启高效文件传输模式
tcp_nopush on; #防止网络阻塞
tcp_nodelay on;
keepalive_timeout 65; # #长连接超时时间,单位是秒,默认为0
types_hash_max_size 2048;
# server_tokens off;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
default_type application/octet-stream; #默认文件类型
##
# SSL证书配置
##
#用于启动特定的加密协议
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
#设置协商加密算法时,优先使用我们服务端的加密套件,而不是客户端浏览器的加密套件
ssl_prefer_server_ciphers on;
##
# 日志配置
##
access_log /var/log/nginx/access.log; #设置存储访问记录的日志
error_log /var/log/nginx/error.log; #设置存储记录错误发生的日志
##
# Gzip 压缩配置
##
gzip on; #是告诉nginx采用gzip压缩的形式发送数据。这将会减少我们发送的数据量。
gzip_disable "msie6"; #为指定的客户端禁用gzip功能
# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/javascript
text/xml application/xml application/xml+rss text/javascript;
##
# 虚拟主机配置
##
#include 是个主模块指令,可以将配置文件拆分并引用,可以减少主配置文件的复杂度
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
server模块:http模块中的一个子模块,用来定义一个虚拟访问主机,也就是一个虚拟服务器的配置信息
#一个虚拟主机的配置,一个http中可以配置多个server
server {
listen 80; #监听端口
server_name localhost 192.168.1.100; #指定ip地址或者域名,多个配置之间用空格分隔
root /nginx/www; #表示整个server虚拟主机内的根目录,所有当前主机中web项目的根目录
index index.php index.html index.html; #用户访问web网站时的全局首页
charset utf-8; #用于设置www/路径中配置的网页的默认编码格式
access_log logs/access.log; #用于指定该虚拟主机服务器中的访问记录日志存放路径
error_log logs/error.log; #用于指定该虚拟主机服务器中访问错误日志的存放路径
......
}
location模块:nginx配置中出现最多的一个配置,主要用于配置路由访问信息,在路由访问信息配置中关联到反向代理、负载均衡等等各项功能
#基本配置
# 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求
location / { #表示匹配访问根目录
root /nginx/www; #用于指定访问根目录时,访问虚拟主机的web目录
index index.php index.html index.htm; #在不指定访问具体资源时,默认展示的资源文件列表
}
#反向代理配置
location / {
proxy_pass http://localhost:8888; # 设置要代理的 uri
proxy_redirect off; # 设置后端服务器“Location”响应头和“Refresh”响应头的替换文本
proxy_set_header X-real-ip $remote_addr; # 获取用户的真实 IP 地址
proxy_set_header Host $http_host; # 允许重新定义或者添加发往后端服务器的请求头。
#后端的Web服务器可以通过 X-Forwarded-For 获取用户真实IP,多个 nginx 反代的情况下
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m; #允许客户端请求的最大单文件字节数
client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数,
proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时)
proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时)
proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时)
proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的设置
proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
proxy_temp_file_write_size 64k;
#设定缓存文件夹大小,大于这个值,将从upstream服务器传
}
upstream模块:主要负责负载均衡的配置,通过默认的轮询调度方式来分发请求到后端服务器
upstream name {
ip_hash; #指定请求调度算法,默认是weight权重轮询调度,可以指定
server 192.168.1.100:8000; #分发服务器的列表配置
server 192.168.1.100:8001 down; #表示该主机暂停服务
server 192.168.1.100:8002 max_fails=3; #表示失败最大次数,超过失败最大次数暂停服务
#表示如果请求受理失败,暂停指定的时间之后重新发起请求
server 192.168.1.100:8003 fail_timeout=20s;
server 192.168.1.100:8004 max_fails=3 fail_timeout=20s;
}
Nginx的负载均衡模块目前支持4种调度算法:
轮询(默认)
。每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响。Weight 指定轮询权值,Weight值越大,分配到的访问机率越高,主要用于后端每个服务器性能不均的情况下。ip_hash
。每个请求按访问IP的hash结果分配,这样来自同一个IP的访客固定访问一个后端服务器,有效解决了动态网页存在的session共享问题。fair
。这是比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身是不支持fair的,如果需要使用这种调度算法,必须下载Nginx的upstream_fair模块。url_hash
。此方法按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身是不支持url_hash的,如果需要使用这种调度算法,必须安装Nginx 的hash软件包。
location如何匹配
location = / {
# 精确匹配 / ,主机名后面不能带任何字符串
[ configuration A ]
}
location / {
# 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求
# 但是正则和最长字符串会优先匹配
[ configuration B ]
}
location /documents/ {
# 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索
# 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
[ configuration C ]
}
location ~ /documents/Abc {
# 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索
# 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
[ configuration CC ]
}
location ^~ /images/ {
# 匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条。
[ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {
# 匹配所有以 gif,jpg或jpeg 结尾的请求
# 然而,所有请求 /images/ 下的图片会被 config D 处理,因为 ^~ 到达不了这一条正则
[ configuration E ]
}
location /images/ {
# 字符匹配到 /images/,继续往下,会发现 ^~ 存在
[ configuration F ]
}
location /images/abc {
# 最长字符匹配到 /images/abc,继续往下,会发现 ^~ 存在
# F与G的放置顺序是没有关系的
[ configuration G ]
}
location ~ /images/abc/ {
# 只有去掉 config D 才有效:先最长匹配 config G 开头的地址,继续往下搜索,匹配到这一条正则,采用
[ configuration H ]
}
location ~* /js/.*/\.js