Nginx的基本概念
nginx是一个高性能的HTTP和反向代理web服务器
-
反向代理
理解正向代理:用户通过代理服务器访问目标服务器,对用户来说,目标服务是可知的。
反向代理中,用户通过访问反向代理服务器完成访问,但对用户来说,目标服务器并不可知。
-
负载均衡
当请求到达服务器后,服务器会开启线程处理请求,服务器开启线程是需要消耗资源的,对服务器来说,这个就是负载的概念,当nginx服务器作为转发服务器将请求分发到不同的服务器上,就达到了负载均衡
-
动静分离
将请求区分,请求页面等静态资源的请求分发到静态资源服务器,静态资源的响应相当快,将请求动态资源(业务处理请求)分发到动态资源服务器中,此为动静分离
nginx安装、常用命令和配置文件
4. 在linux系统中通过docker安装nginx
//查找镜像
docker search nginx
//拉取镜像
docker pull nginx
//查看镜像
docker images
访问成功
如果无法访问的话,请确保已经在阿里云的安全组策略开放8080端口,开放的端口为8080
-
nginx常用命令
通过docker exec -it nginx-test bash进入容器中,nginx在容器的的启动入口为/usr/sbin下的nginx
./nginx -s reload 重新加载nginx.conf配置
./nginx -s restart 重启nginx
./ngixn -s stop 停止nginx退出容器(pid为1的线程被停止)
-
nginx配置文件
假设从未本地无nginx的配置文件,则需要从docker容器中拷贝nginx的配置文件
获取配置文件后重建nginx容器
通过docker container inspect nginx-test可以查看命令生效的配置
nginx的配置文件主要由三部分构成
1.全局块
从配置文件开始到event块之间的内容,主要设置一些影响nginx服务器整体运行的配置指令,主要包含服务器的用户组,允许生成的worker process数,进程PID存放路径,日志存放路径和类型以及配置文件的引入等
2.event块
主要影响nginx与与用户网络的连接,常用的设置包括是否开启对多worker process下的网络连接进行序列化,是否允许同时接收多个网络连接,选取事件驱动模型处理连接请求,每个worker process可以同时支持的最大连接数
3.http块
设置代理、缓存和日志定义等绝大多数功能和第三方模块的配置,http全局块配置的指令包括文件引入、MIME-TYPE定义、日志自定义、连接超时时间、单链接请求数上限等
server块为http块的子块,每个server块相当于一个虚拟主机
location块为server块的子块,每个server块包含多个location块,定义每个虚拟主机的访问路劲,对请求的路径进行匹配,对特定的请求进行处理,地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置
//全局块
user nginx;
worker_processes 1; //并发处理服务器的关键配置,值越大支持的并发处理数量越大,一般与cpu核数一致
error_log /var/log/nginx/error.log warn; //日志记录位置 日志等级
pid /var/run/nginx.pid;
events {
worker_connections 1024;//每个worker process支持的最大连接数
}
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;
# }
#}
}
详细配置说明,参考:https://www.runoob.com/w3cnote/nginx-setup-intro.html
########### 每个指令必须有分号结束。#################
#user administrator administrators; #配置用户或者组,默认为nobody nobody。
#worker_processes 2; #允许生成的进程数,默认为1
#pid /nginx/pid/nginx.pid; #指定nginx进程运行文件存放地址
error_log log/error.log debug; #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
events {
accept_mutex on; #设置网路连接序列化,防止惊群现象发生,默认为on
multi_accept on; #设置一个进程是否同时接受多个网络连接,默认为off
#use epoll; #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
worker_connections 1024; #最大连接数,默认为512
}
http {
include mime.types; #文件扩展名与文件类型映射表
default_type application/octet-stream; #默认文件类型,默认为text/plain
#access_log off; #取消服务日志
log_format myFormat ‘
r
e
m
o
t
e
a
d
d
r
–
remote_addr–
remoteaddr–remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for’; #自定义格式
access_log log/access.log myFormat; #combined为日志格式的默认值
sendfile on; #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
sendfile_max_chunk 100k; #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
keepalive_timeout 65; #连接超时时间,默认为75s,可以在http,server,location块。
upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333 backup; #热备
}
error_page 404 https://www.baidu.com; #错误页
server {
keepalive_requests 120; #单连接请求上限次数。
listen 4545; #监听端口
server_name 127.0.0.1; #监听地址
location ~*^.+$ { #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
#root path; #根目录
#index vv.txt; #设置默认页
proxy_pass http://mysvr; #请求转向mysvr 定义的服务器列表
deny 127.0.0.1; #拒绝的ip
allow 172.18.5.54; #允许的ip
}
}
}
nginx配置反向代理
实现效果:客户端访问nginx,然后nginx将请求分发到tomcat中
1.启动tomcat容器,设置映射端口和挂载文件目录
docker run -d --name tomcat-test -p 8080:8080 -v /test/tomcat:/usr/local/tomcat/webapps tomcat:8
2.通过nginx实现反向代理
添加配置
访问nginx路径(前面启动nginx的时候重新设置端口号为9090)
http://IP:9090/test/index.html
备注:
location说明:
location [=|||^~] /uri/ { … }
= 开头表示精确匹配
^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)。
~ 开头表示区分大小写的正则匹配
~ 开头表示不区分大小写的正则匹配
!和!*分别为区分大小写不匹配及不区分大小写不匹配 的正则
/ 通用匹配,任何请求都会匹配到。
参考:https://blog.csdn.net/luoyang_java/article/details/83507193
proxy_pass的说明
参考:https://blog.csdn.net/u010433704/article/details/99945557
nginx配置负载均衡
准备条件:准备两个不同的tomcat容器,将其地址配置到nginx中,通过nginx的负载均衡进行路由
nginx配置(配置内容都位于http块下)
实现效果:
访问同一个url,请求分发到不同的tomcat
nginx负载均衡的策略
1.轮询(默认)
每个请求按照时间顺序逐一分配到不同的后端服务,如果后端服务down掉则nginx自动剔除
2.weight权重
weight代表权重,默认为1,权重越高分配给此服务器的请求越多
指定轮询几率,weight和访问比率成正比,常用于服务器性能不均的情况
3.ip_hash
每个请求按访问ip的hash结果分配,每个访客固定访问一个后端服务器,可以解决session的问题
配置:
upstream myserver{
ip_hash;
server IP:PORT ;
server IP:PORT;
}
4.fair公平分配
按后端服务器的响应时间来分配请求,响应时间短的优先分配
upstream myserver{
server IP:PORT ;
server IP:PORT;
fair;
}
nginx配置动静分离
将动态请求和静态请求分开,静态请求主要为页面,动态请求主要为业务逻辑处理,包含数据库变更。主要的动静分类手段为:将静态资源使用静态资源服务器存放,通过域名调用;第二个方法为,通过location配置实现请求分发,具体配置如下
location /path/{
root /path/;
autoindex on; //访问文件夹时,会列出其下的所有文件
}
nginx原理
Nginx 在启动后,会有一个 master 进程和多个 worker 进程。master 进程主要用来管理 worker 进程,包含:接收来自外界的信号,向各 worker 进程发送信号,监控 worker 进程的运行状态,当 worker 进程退出后(异常情况下),会自动重新启动新的 worker 进程。
基本的网络事件,则是放在 worker 进程中来处理, 多个 worker 进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个 worker 进程中处理,一个 worker 进程,不可能处理其它进程的请求。
worker进程数是可以设置的,一般会设置与机器CPU核数一致