认识nginx
了解nginx
Nginx (engine x)采用C语言开发编写的,是一个高性能的Web服务器和反向代理服务器,也可以作为邮件代理服务器。
Nginx 特点是占有内存少,并发处理能力强,以高性能、低系统资源消耗而闻名,Nginx官方测试为5万并发请求。与Nginx同类型的Web服务器还有Apache、Lighttpd(音同lighty)、Tengine(阿里巴巴的) 等。
正向代理和反向代理概念
反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器;
正向代理类似一个跳板机,代理访问外部资源。比如:我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这个代理服务器,它能访问那个我不能访问的网站,于是我先连上代理服务器,告诉它我需要那个无法访问网站的内容,代理服务器去取回来,然后返回给我。
综上所述:正向代理代理对象是客户端,反向代理代理对象是服务端。
软件层面一般常用Nginx来做反向代理服务器,它的性能非常好,用来做负载均衡。
Linux安装nginx
安装nginx步骤
安装前准备
安装前需要确定Linux安装一下几个库:gcc、openssl、pcre、zlib
一次性安装命令:
yum install gcc openssl openssl-devel pcre pcre-devel zlib zlib-devel -y
如果已经安装,则不会重复安装,会跳过;如果有需要升级的库,则会下载升级包安装
检查是否安装,例如检查gcc是否安装:
yum list installed | grep gcc
其他检查一样,将gcc换成对应的库即可
单个安装:
gcc编译器安装
yum install gcc -y
openssl库安装
yum install openssl openssl-devel -y
pcre库安装
yum install pcre pcre-devel -y
zlib库安装
yum install zlib zlib-devel -y
正式安装
- 解压下载下来的nginx文件,执行命令:tar -zxvf nginx-1.14.2.tar.gz
- 切换至解压后的nginx主目录,执行命令:cd nginx-1.14.2
- 在nginx主目录nginx-1.14.2下执行命令:./configure --prefix=/usr/local/nginx
(其中–prefix是指定nginx安装路径) 注意:等号左右不要有空格
注意:如果安装步骤3执行完后出现下面情况,可以忽略,继续向下执行
Configuration summary
+ using system PCRE library
+ OpenSSL library is not used
+ using system zlib library
- 执行命令进行编译:make
- 执行命令进行安装:make install
这时候才算安装成功,切换到/usr/local/nginx目录下,查看内容
配置文件说明(注意每一行最后的“;”不要忽略)
#配置worker进程运行用户 nobody也是一个linux用户,一般用于启动程序,没有密码
#user nobody;
#配置工作进程数目,根据硬件调整,通常等于CPU数量或者2倍于CPU数量
worker_processes 1;
#配置全局错误日志及类型,[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 logs/nginx.pid; #配置进程pid文件
###====================================================
#配置工作模式和连接数
events {
worker_connections 1024; #配置每个worker进程连接数上限,worker_connections 连接上限是65535个请求 ,nginx支持的总连接数就等于worker_processes * worker_connections
}
###===================================================
#配置http服务器,利用它的反向代理功能提供负载均衡支持
http {
#配置nginx支持哪些多媒体类型,可以在conf/mime.types查看支持哪些多媒体类型,文件内容左侧是文件名,右侧是文件扩展名
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日志及存放路径,并使用上面定义的main日志格式,打开当前日志配置,需要打开上面的日志格式配置
#access_log logs/access.log main;
sendfile on; #开启高效文件传输模式
#tcp_nopush on; #防止网络阻塞(重点),默认被注释,在项目上线时,打开当前配置
#keepalive_timeout 0;
keepalive_timeout 65; #长连接超时时间,单位是秒
#gzip on; #开启gzip压缩输出(重点),项目上线时打开配置。提高服务响应速度,网络传输是IO流的形式,压缩输出可以减少访问的体积,去掉多余部分(像空格之类的)
###-----------------------------------------------
#配置虚拟主机,一个server相当于一个计算机
server {
listen 80; #配置监听端口
server_name localhost; #配置服务名,通常使用域名倒写
#charset koi8-r; #配置字符集
#access_log logs/host.access.log main; #配置本虚拟主机的访问日志
#默认的匹配斜杠/的请求,当访问路径中有斜杠/,会被该location匹配到并进行处理,请求拦截规则,类似于Tomcat
location / {
#root是配置服务器的默认网站根目录位置,默认为nginx安装主目录下的html目录
root html;
#配置首页文件的名称
index index.html index.htm;
}
#error_page 404 /404.html; #配置404页面
# redirect server error pages to the static page /50x.html
#error_page 500 502 503 504 /50x.html; #配置50x错误页面
#精确匹配,直接寻找50x.html文件
location = /50x.html {
root html;
}
#PHP 脚本请求全部转发到Apache处理
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
#PHP 脚本请求全部转发到FastCGI处理
# 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;
#}
#禁止访问 .htaccess 文件
# 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服务,安全的网络传输协议,加密传输,端口443,运维来配置
#
# 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
启动
方式一:安装目录的sbin文件夹下执行命令:./nginx
方式二:配置文件启动,执行安装目录下sbin文件加下的nginx
+conf文件夹下的nginx.conf
文件,如下:
假设在sbin目录下
./nginx -c /usr/local/nginx/conf/nginx.conf
-c
表示这之后指定配置文件路径,配置文件路径必须指定绝对路径
./nginx
也可以使用绝对路径
关闭
使用杀死进程的方式关闭nginx
查找nginx进程:ps -ef | grep nginx
这里端口号108371是父进程,杀掉父进程同时可以杀掉子进程。
杀死进程命令:kill 108371
强制杀死进程:kill -9 108371
执行完成后再使用ps -ef | grep nginx
检查是否关闭nginx
部署静态网站
修改配置文件
修改配置文件中的http–>server–>location(注意每一行最后的“;”不要漏掉)
原文:
server {
listen 80;#端口号
server_name localhost;#请求地址,一般使用域名倒写
location / {
root html;
index index.html index.htm;
}
}
修改:location 后面跟的是请求,root后面是静态资源存放的位置
server{
listen 80;#端口号
server_name localhost;#请求地址,一般使用域名倒写
location / {
root html;
index index.html index.htm;
}
location /ace {
root /opt/static/ace;
index index.html index.htm;
}
}
关于访问的解释:
http://IP地址:80/ = root = /opt/static/ace
http://IP地址:80/ace = root/ace = /opt/static/ace/ace (这里就是说在static/ace目录下还要有个文件夹ace)
上传静态文件资源
在/opt/static/ace/ace目录下上传静态文件资源,index.html一定放在这个文件夹下,不然找不到
启动nginx,访问
切换到nginx安装目录的sbin目录,启动nginx命令:./nginx
在外部浏览器访问:IP地址:80/ace
注意:这里80 可以省略,能正常访问
补充:location匹配顺序
在没有标识符的请求下,匹配规则如下:
- nginx服务器首先在server块的多个location块中搜索是否有标准的uri和请求字符串匹配。如果有多个标准uri可以匹配,就匹配其中匹配度最高的一个location。
- 然后,nginx在使用location块中,正则uri和请求字符串,进行匹配。如果正则匹配成功,则结束匹配,并使用这个location处理请求;如果正则匹配失败,则使用标准uri中,匹配度最高的location。
备注:
- 如果有精确匹配,会先进行精确匹配,匹配成功,立刻返回结果。
- 普通匹配与顺序无关,因为按照匹配的长短来取匹配结果。
- 正则匹配与顺序有关,因为是从上往下匹配。(首先匹配,就结束解析过程)
- 在location中,有一种统配的location,所有的请求,都可以匹配,如下:
location / {
# 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求
# 但是正则和最长字符串会优先匹配
}
结合标识符,匹配顺序如下:
(location =) > (location 完整路径) > (location ^~ 路径) > (location ,* 正则顺序) > (location 部分起始路径) > (location /)
即
(精确匹配)> (最长字符串匹配,但完全匹配) >(非正则匹配)>(正则匹配)>(最长字符串匹配,不完全匹配)>(location通配)
负载均衡
概述
负载均衡通常是指将请求"均匀"分摊到集群中多个服务器节点上执行,这里的均匀是指在一个比较大的统计范围内是基本均匀的,并不是完全均匀。
实现方式
硬负载均衡
比如 F5、深信服、Array 等
优点是有厂商专业的技术服务团队提供支持,性能稳定
缺点是费用昂贵,对于规模较小的网络应用成本太高
软负载均衡
比如 Nginx、LVS、HAProxy 等
优点是免费开源,成本低廉
Nginx负载均衡的实现
Nginx通过在nginx.conf文件进行配置即可实现负载均衡
配置2步即可
- 在http模块加上upstream配置,upstream在http内部,server外部(注意每一行最后的“;”不要漏掉)
upstream www.myweb.com {
server 127.0.0.1:9100 weight=3;
server 127.0.0.1:9200 weight=1;
}
其中weight=1表示权重,用于后端服务器性能不均的情况,访问比率约等于权重之比,权重越大访问机会越多
weight不添加则表示轮询方式实现负载均衡
upstream是配置nginx与后端服务器负载均衡非常重要的一个模块,并且它还能对后端的服务器的健康状态进行检查,若后端服务器中的一台发生故障,则前端的请求不会转发到该故障的机器
- 在server模块里添加location,并配置proxy_pass(注意每一行最后的“;”不要漏掉)
location /myweb {
proxy_pass http://www.myweb.com;
}
其中 www.myweb.com 字符串要和 upstream 后面的字符串相等,当然这部分内容也可以随便填写,只是为了保证和upstream后的字符串相同
- 测试
部署项目
配置两个Tomcat,修改端口号,将一个相同的项目放在Tomcat中,运行程序,访问相同地址
Nginx常用负载均衡策略
轮询
就是均匀的将请求分配给不同的服务器。
注意:这里的轮询并不是每个请求轮流分配到不同的后端服务器,与ip_hash类似,但是按照访问url的hash结果来分配请求,使得每个url定向到同一个后端服务器,主要应用于后端服务器为缓存时的场景下。如果后端服务器down掉,将自动剔除
upstream backserver {
server 127.0.0.1:8080;
server 127.0.0.1:9090;
}
权重
每个请求按一定比例分发到不同的后端服务器,weight值越大访问的比例越大,用于后端服务器性能不均的情况
upstream中需要添加weight
upstream backserver {
server 192.168.0.14 weight=5;
server 192.168.0.15 weight=2;
}
ip_hash
ip_hash也叫IP绑定,每个请求按访问ip的hash值分配,这样每个访问客户端会固定访问一个后端服务器,可以解决会话Session丢失的问题
ip_hash可能会出现过载问题。
upstream中需要添加ip_hash;
算法:hash(“124.207.55.82”) % 2 = 0, 1
upstream backserver {
ip_hash;
server 127.0.0.1:8080;
server 127.0.0.1:9090;
}
最少连接
web请求会被转发到连接数最少的服务器上
upstream中需要添加least_conn;
upstream backserver {
least_conn;
server 127.0.0.1:8080;
server 127.0.0.1:9090;
}
静态代理
概念
把所有静态资源的访问改为访问nginx,而不是访问tomcat,这种方式叫静态代理。因为nginx更擅长于静态资源的处理,性能更好,效率更高。
在实际应用中,我们将静态资源比如图片、css、html、js等交给nginx处理,而不是由tomcat处理。
实现方式
放静态资源时在root指定路径下需要向创建一个以war包包名的文件夹,静态资源放在这个文件加下
方式一:在nginx.conf的location中配置静态资源的后缀
例如:部署myweb.war ,当访问静态资源,则从linux服务器/opt/static目录下获取(举例)
root 指定的是根路径,我们要访问的是 ip地址:8080/myweb/,root的根路径=ip地址:8080,所以要在static下添加myweb文件夹
location ~ .*\.(js|css|htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ {
root /opt/static;
}
更具体的位置是/opt/static/myweb/静态资源文件(夹)
说明
- ~ 表示正则匹配,也就是说后面的内容可以是正则表达式匹配
- 第一个点 . 表示任意字符
- *表示一个或多个字符
- . 是转移字符,是后面这个点的转移字符
- | 表示或者
- $ 表示结尾
整个配置表示以.
后面括号里面的这些后缀结尾的文件都由nginx处理
放置静态资源的目录,要注意一下目录权限问题,如果权限不足,给目录赋予权限; 否则会出现403错误 chmod 755
方式二:在nginx.conf的location中配置静态资源所在目录实现
例如:部署myweb.war ,当访问静态资源,则从linux服务器/opt/static目录下获取(举例)
root 指定的是根路径,我们要访问的是 ip地址:8080/myweb/,root的根路径=ip地址:8080,所以要在static下添加myweb文件夹
location ~ .*/(css|js|img|images) {
root /opt/static;
}
更具体的位置是/opt/static/myweb/静态资源文件(夹)
xxx/css
xxx/js
xxx/img
xxx/images
我们将静态资源放入 /opt/static 目录下,然后用户访问时由nginx返回这些静态资源
动静分离
概念
Nginx的负载均衡和静态代理结合在一起,我们可以实现动静分离,这是实际应用中常见的一种场景。
动态资源,如jsp由tomcat或其他web服务器完成
静态资源,如图片、css、js等由nginx服务器完成
整个架构中,一个nginx负责负载均衡,两个nginx负责静态代理。Nginx在一台Linux上安装一份,可以启动多个Nginx,每个Nginx的配置文件不一样即可
实现方式
动态资源通过负载均衡,静态资源也通过负载均衡来访问。
首先明确一点:nginx服务启动可以通过携带配置文件的方式启动多个服务。
- 首先拷贝nginx.conf文件两份,依次做出如下修改
配置文件nginx1.conf
server{
listen 81;
server_name localhost;
...
location ~ .*/(css|js|img|images) {
root /opt/static;
}
}
配置文件nginx2.conf
server{
listen 82;
server_name localhost;
...
location ~ .*/(css|js|img|images) {
root /opt/static;
}
}
配置文件nginx.conf
upstream www.myweb.com{
server IP地址:8080;
server ip地址:8081;
}
upstream static.myweb.com{
server ip地址;81;
server ip地址;82;
}
server{
listen 80;
server_name localhost;
...
location /myweb{
proxy_pass http://www.myweb.com;
}
location ~ .*/(css|js|img|images) {
proxy_pass http://static.myweb.com;
}
}
- 在两台Tomcat服务器,部署myweb.war项目
- 启动三台nginx服务器,启动两台tomcat服务器
- 浏览器输入http://IP地址/myweb/进行测试
虚拟主机
概念
虚拟主机,就是把一台物理服务器划分成多个“虚拟”的服务器,这样我们的一台物理服务器就可以当做多个服务器来使用,从而可以配置多个网站。
Nginx提供虚拟主机的功能,就是为了让我们不需要安装多个Nginx,就可以运行多个域名不同的网站。
Nginx下,一个server标签就是一个虚拟主机。nginx的虚拟主机就是通过nginx.conf中server节点指定的,想要设置多个虚拟主机,配置多个server节点即可;
例如:www.meituan.com 切换城市,可以看到不同的城市地址不一样(二级域名)
比如一个公司有多个二级域名,没有必要为每个二级域名都提供一台Nginx服务器,就可以使用虚拟主机技术,在一台nginx服务器上,模拟多个虚拟服务器。
配置虚拟主机方式
基于端口的虚拟主机(了解)
基于端口的虚拟主机配置,使用端口来区分:同域名不同端口
浏览器使用 同一个域名+端口 或 同一个ip地址+端口访问;
server {
listen 8080;
server_name www.myweb.com;
location /myweb {
proxy_pass http://www.myweb.com;
}
}
server {
listen 9090;
server_name www.myweb.com;
location /p2p {
proxy_pass http://www.p2p.com;
}
}
基于域名的虚拟主机(掌握)
可以理解为:同端口不同域名
基于域名的虚拟主机是最常见的一种虚拟主机
server {
listen 80;
server_name www.myweb.com;
location /myweb {
proxy_pass http://www. myweb.com;
}
}
server {
listen 80;
server_name www.p2p.com;
location /myweb {
proxy_pass http://www.p2p.com;
}
}
因为nginx安装在了Linux虚拟机上,所以在自己计算机上测试需要修改一下本地的hosts文件,文件位置:C:\Windows\System32\drivers\etc\hosts
在hosts文件配置:
192.168.208.128 www.myweb.com
192.168.208.128 www.p2p.com
前面是Linux的IP,后面是你自定义的域名
案例:模拟城市站点网站
案例架构图
实现步骤
- 配置3个Tomcat,每个Tomcat一个站点项目
- 部署在Tomcat的ROOT目录下,目的是访问的时候不用加上下文根,测试方便
- 修改server.xml配置文件中的端口号:第22行左右的<Server port="8008" shutdown="SHUTDOWN">
,第69行和第116行左右的<Connector port="8083"
标签,这三个port修改,每个Tomcat的这三个端口不能重复 - 清空三个tomcat的webapps/ROOT目录
- 使用Xftp将三个war包上传到三个tomcat的ROOT目录
- 使用unzip命令,直接解压三个war包,否则tomcat启动的时候,自动解压,还是有一个上下文目录的 - 在nginx.conf中配置3个Nginx虚拟主机(两种方式)
方式一:直接在nginx.conf中配置
在nginx.conf文件添加三个server节点,用于配置三个虚拟主机
server {
listen 80;
server_name beijing.myweb.com;
location / {
proxy_pass http://beijing.myweb.com;
}
}
server {
listen 80;
server_name nanjing.myweb.com;
location / {
proxy_pass http://nanjing.myweb.com;
}
}
server {
listen 80;
server_name tianjin.myweb.com;
location / {
proxy_pass http://tianjin.myweb.com;
}
}
方式二:B、通过单独的配置文件配置虚拟主机
通过include的方式引入虚拟主机配置
include /usr/local/nginx/conf/vhost/vhost.conf;
将虚拟目录的配置文件加入到”http {}”部分的末尾,与其他server并列;
文件是隔开的,配置更清晰,主文件没有那么多是server
- 在nginx.conf中配置每个虚拟主机请求转发所对应的后端服务器(负载均衡,可以配置多个服务器)
upstream beijing.myweb.com {
server 127.0.0.1:9100;
}
upstream nanjing.myweb.com {
server 127.0.0.1:9200;
}
upstream tianjin.myweb.com {
server 127.0.0.1:9300;
}
- 修改hosts文件,让Linux的ip指向到三个站点的域名
C:\Windows\System32\drivers\etc\hosts
ip地址 beijing.myweb.com
ip地址 nanjing.myweb.com
ip地址 tianjin.myweb.com
- 启动3个Tomcat服务器
- 启动nginx,通过浏览器访问nginx进行测试
xshell文件上传下载命令
windows文件上传:rz -y (首先切换到要上传的文件路径)
Linux文件下载:sz 要下载的文件名