一,nginx 基本概念
(1). nginx是什么
- Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发力强
(2). 反向代理
-
正向代理
- **概念 ** : 意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代
- 在客户端(浏览器),配置代理服务器,通过代理服务器进行互联网访问
-
反向代理
- 概念 : 反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时,用户不需要知道目标服务器的地址,也无须在用户端作任何设定。反向代理服务器通常可用来作为Web加速,即使用反向代理作为Web服务器的前置机来降低网络和服务器的负载,提高访问效率
- 客户端对代理是无感知的,因为客户端无需进行任何配置就能访问,只需要将请求发送到反向代理服务器,此时反向代理服务器和目标服务器就相当于同一个服务器,暴露的是反向代理服务器的地址,隐藏了真实的服务器IP地址
(3). 负载均衡
- 概念 : 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性
- 其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。
(4). 动静分离
- 概念 : 动静分离是指在web服务器架构中,将静态页面与动态页面或者静态内容接口和动态内容接口分开不同系统访问的架构设计方法,进而提升整个服务访问性能和可维护性。
二,nginx安装,常用命令和配置文件
(1). 在linux系统中安装nginx
-
安装依赖:
- 安装nginx之前需要安装其依赖:pcre,openssl,zlib
- prce : apt install libpcre3 libpcre3-dev
- openssl : apt install openssl
- zlib : apt install zlib1g-dev
-
安装nginx:
- 下载nginx的tar.gz压缩包,tar -zxvf命令解压,然后使用./configure命令 他会机器上的开发环境来生成相应的makefile,再使用make && make install 编译安装
- 当然也可以像安装依赖一样apt install安装,但是那样安装后的文件不集中,推荐使用压缩包安装,安装依赖的时候也可以使用压缩包安装
- 在使用./configure命令是可能会遇到./configure: error: C compiler cc is not found,那就是没有安装gcc-c++依赖 使用命令安装 gcc和g++
- 如果是使用压缩包安装完nginx后,就会在/usr/local目录下生成nginx文件夹,里面包含了nginx的相关文件,如果是用apt安装,那么这些文件就会比较分散
- apt安装的相关文件存放位置:
- 下载的软件的存放位置:/var/cache/apt/archives
- 安装后软件的默认位置:/usr/share
- 可执行文件位置:/usr/bin
- 配置文件位置:/etc
- lib文件位置:/usr/lib
(2). nginx常用命令
-
nginx命令存放在nginx文件夹下的sbin文件夹,可执行文件名为ngxin
-
查看nginx版本号 : ./nginx -v
-
启动nginx : ./nginx
-
关闭nginx : ./nginx -s stop
-
重新加载nginx : ./nginx -s reload
-
查看进程的命令: ps -ef | grep nginx ps命令是将某个进程显示出来 -ef参数意为显示所有进程并全部列出,grep命令是查找,支持正则
(3). nginx常用配置文件
-
nginx配置文件存放在nginx文件夹下的conf文件,里面有个nginx.conf,即nginx的配置文件
-
nginx配置文件的组成:
-
第一部分,全局块:
-
#主要会设置一些影响nginx服务器整体运行的配置指令. #运行nginx服务器运行的用户(组) #user nobody; #允许生成的woker process数,是nginx的关键配置,值越大,可以处理并发数就越多,但会受硬件,软件等约束 worker_processes 1; #日志配置 #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #进程PID存放路径 #pid logs/nginx.pid;
-
-
第二部分,events块:
-
#主要影响nginx服务器与用户网络连接 events { #支持最大连接数 worker_connections 1024; }
-
-
第三部分,http块:
-
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; # } #} }
-
-
三, nginx实例 1-反向代理1
1. 实现效果
- 打开浏览器,在浏览器输入地www.123.com,跳转linux系统tomcat主页面
2. 具体实现
-
环境: 物理机与虚拟机桥接 物理机ip 192.168.1.70 虚拟机ip 192.168.1.101 web项目位于物理机的tomcat 即 192.168.1.70:8080
-
server { listen 80; server_name 192.168.1.101; #/代表代理所有请求 location / { root html; proxy_pass http://192.168.1.70:8080 index index.html index.htm; } }
-
结果 : 访问localhost:8080即 192.168.1.70:8080 HttpServletRequest.getRemoteHost()打印ip为物理机ip 访问www.123.com即192.168.1.101:80 打印的是虚拟机的ip即192.168.1.101
四, nginx实例 1-反向代理2
1. 实现效果
- 访问www.123.com/test1 跳转到 192.168.1.70:8888 访问www.123.com/test2 跳转到 192.168.1.70:9999
2. 具体实现
-
环境: 物理机开放两个tomcat 两个端口分别为8888,9999,8888处理test1下的请求,9999处理test2下的请求
-
#可以添加多个server server { listen 90; server_name 192.168.1.101; #/~ 为正则匹配 当请求中含有test1就转发到8888 location ~ /test1/ { proxy_pass http://192.168.1.70:8888 } #server中也可以有多个location location ~ /test2/ { proxy_pass http://192.168.1.70:9999 } }
-
location路径匹配:
- = : 用于不含正则表达式的uri,要求请求字符串于uri严格匹配,如果匹配成功就停止向下匹配,并立即处理改请求
- ~ : 区分大小写(可用正则)
- ~* : 不区分大小写(可用正则)
- !~ : 区分大小写
- !~* : 不区分大小写
- ^~ : 如果把这个前缀用于一个常规字符串,那么告诉nginx 如果路径匹配那么不测试正则表达式
五, nginx实例 2-负载均衡
1. 实现效果
- 多个客户端访问http:192.168.1.70/test1/a.html把请求平均分摊到8888和9999两个端口
2. 具体实现
-
http{ #取名为myserver,weight可以配置权重 upstream myserver { ip_hash; fair; server 192.168.1.70:8888 weight=1; server 192.168.1.70:9999 weight=1; } server { listen 99; server_name 192.168.1.101; location / { #myserver为upstream的名字 proxy_pass http://myserver } } }
-
nginx服务器分配策略
- 轮询(默认) : 每个请求按照时间顺序逐一分配到不同的服务器,如果服务器列表中有宕机,能自动剔除
- 按权重 : 默认权重为 1 权重越高,分配的请求越多,指定轮询几率,weight和访问量成正比,用于后端服务器性能不均的情况. 在server 后面添加 weight = 权重 即可.
- ip_hash : 每个请求按访问者ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session问题, 在upstream中添加 ip_hash;即可.
- fair(第三方) : 按后端服务器响应时间进行分配,谁的响应时间短,就分配给谁,在upstream中添加fair;即可
五, nginx实例 3-动静分离
1. 实现效果
- 访问路径带imag的静态资源时,把请求分配给8888,访问带user的非静态资源时,把请求分配给9999
2. 具体实现
-
location /image/ { root http://192.168.1.70:8888; #如果访问 http://www.123.com/user 就会返回一个文件夹的页面 autoindex on; } location /user/ { root http://192.168.1.70:9999; } #静态资源也可以配到本地文件系统 location /image/ { root /date/; autoindex on; }