一、下载
http://nginx.org/en/download.html
1.1 准备工作
1.nginx是C语言开发,建议在linux上运行,所以我们选择在linux上安装Nginx
安装nginx需要先将官网下载的源码进行编译,编译依赖gcc环境,如果没有gcc环境,需要安装gcc
2.PCRE(Perl Compatible Regular Expressions)是一个Perl库,包括 perl 兼容的正则表达式库。nginx的http模块使用pcre来解析正则表达式,所以需要在linux上安装pcre库。
3.zlib库提供了很多种压缩和解压缩的方式,nginx使用zlib对http包的内容进行gzip,所以需要在linux上安装zlib库。
4. OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。
5.nginx不仅支持http协议,还支持https(即在ssl协议上传输http),所以需要在linux安装openssl库。
yum install gcc-c++
yum install -y pcre pcre-devel
yum install -y zlib zlib-devel
yum install -y openssl openssl-devel
1.2. nginx的源码上传到linux系统,并解压
nginx-1.16.1.tar.gz包拷贝到“/usr/local/src”下。然后解压。
tar -zxvf nginx-1.16.1.tar.gz -C /usr/local/src/
mv nginx-1.16.1/ nginx
1.3. 安装
在/usr/local/src里面会有一个nginx的文件夹,进入后
创建/usr/nginx目录 ---安装目录
在源码目录里面编译安装
mkdir /usr/nginx
运行 [nginx]./configure --prefix=/usr/ngix 编译 make & make install
1.4. 启动停止
启动
cd /usr/nginx
cd sbin
./nginx
停止
./nginx -s stop
刷新:当修改了conf文件夹里面配置文件之后要执行的命令 ./nginx -s reload
二、配置文件
2.1 Nginx的配置
在/usr/nginx/conf目录下nginx.conf文件是nginx的配置文件。
在nginx.conf文件中添加一个server节点,修改端口号就可以【自行添加。不影响原来的】
也就是一个nginx里面可以跑多个端口的项目,这个是tomcat是有本质的区别的
一个tomcat只能对应一个端口的多个项目服务
一个nginx可以对应多个端口下面的多个项目服务
三、反向代理与正向代理
3.1 正向代理
正向代理
拿借钱打个比方,A想向C借钱,但是C不认识A所以不借给他,然后A就通过B向C借钱,B借到钱之后再转交给A,在这个过程中B就扮演了一个正向代理的角色,这个过程中,真正借钱的人是谁,C是不知道的~
我们常说的代理也就是指正向代理,正向代理的过程,它隐藏了真实的请求客户端,服务端不知道真实的客户端是谁,客户端请求的服务都被代理服务器代替来请求,科学上网工具 Shadowsocks 扮演的就是典型的正向代理角色。
如 VPN
比如我想访问www.google.com,要想翻越这堵墙,你可以在国外用Shadowsocks来搭建一台代理服务器,代理帮我们请求www.google.com,代理再把请求响应结果再返回给我。
3.2 反向代理
还用借钱的例子,A想向C借钱,然后C借给他了,但是实际上这个钱可能C向B借的~至于钱到底是谁的,A是不知道的~
这里的C扮演着一个反向代理的角色,客户不知道真正提供服务的人是谁。
反向代理隐藏了真实的服务端,当我们访问www.baidu.com的时候,背后可能有成千上万台服务器为我们服务,但具体是哪一台,你不知道,也不需要知道,你只需要知道反向代理服务器是谁就好了。www.baidu.com就是我们的反向代理服务器,反向代理服务器会帮我们把请求转发到提供真实服务的服务器那里去。Nginx就是性能非常好的反向代理服务器,它可以用来做负载均衡
四、负载均衡
网站的访问量越来越大,服务器的服务模式也得进行相应的升级,比如分离出数据库服务器、分离出图片作为单独服务,这些是简单的数据的负载均衡,将压力分散到不同的机器上。有时候来自web前端的压力,也能让人十分头痛。怎样将同一个域名的访问分散到两台或更多的机器上呢?这其实就是另一种负载均衡了,nginx自身就可以做到,只需要做个简单的配置就行。
nginx不单可以作为强大的web服务器,也可以作为一个反向代理服务器,而且nginx还可以按照调度规则实现动态、静态页面的分离,可以按照轮询、ip哈希、URL哈希、权重等多种方式对后端服务器做负载均衡,同时还支持后端服务器的健康检查。
Nginx负载均衡一些基础知识:
nginx 的 upstream目前支持 4 种方式的分配
1)、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
2)、weight
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
2)、ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
3)、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
4)、url_hash(第三方)
五、反向代理+负载均衡配置
5.1 架构
5.2 准备工作
1.准备三个tomcat
#把原来的tomcat改个名这字
mv apache-tomcat-7.0.90 tomcat1
#复制两个
cp -r tomcat1 tomcat2/
cp -r tomcat1 tomcat3/
#修改端口号
tomcat1 8005 8080 8443 8009 8443 保持默认
tomcat2 8015 8090 8453 8019 8453
tomcat3 8025 8100 8463 8029 8463
5.3 修改三个tomcat里面的webapps里面页面。让其有点区别【这里不做代码展示,自行去改】
#启动三个tomcat
cd tomcat1/bin
./startup
cd tomcat2/bin
./startup
cd tomcat3/bin
./startup
5.4 配置nginx服务器【轮询】
#打开/usr/nginx
cd /usr/nginx
#打开conf配置目录
cd conf
#备份里面的nginx.conf[防止改错]
cp -r nginx.conf nginxbak.confbak
#编辑里面的nginx.conf
vi nginx.conf
#在server节点上加入以下配置
upstream www.carrent.com {
server 192.168.15.131:8080;
server 192.168.15.131:8090;
server 192.168.15.131:8100;
#ip_hash;这是是用来解决登陆的session的问题
}
#修改location的配置
server {
listen 80;
server_name www.carrent.com;#配置访问的域名
location / {
# root html;
# index index.html index.htm;
proxy_pass http://www.carrent.com; #指向上面配置的server的节点
}
}
5.4.1 若配置nginx服务器【轮询】
5.4.2 若配置【IP_HASH算法】
用来解决Session的问题,同一台保持连接。
5.5 启动nginx和访问
#启动
./nginx
#访问
http://192.168.15.131/erp
5.6 解决请求过慢的问题
#在nginx.conf文件的location里面加入如下配置
proxy_redirect off ;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 50m; #允许客户端请求的最大单文件字节数
client_body_buffer_size 256k;#缓冲区代理缓冲用户端请求的最大字节数,
proxy_connect_timeout 1; #nginx跟后端服务器连接超时时间(代理连接超时)
proxy_send_timeout 30; #后端服务器数据回传时间(代理发送超时)
proxy_read_timeout 60; #连接成功后,后端服务器响应时间(代理接收超时)
proxy_buffer_size 256k;#设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffers 4 256k; #proxy_buffers缓冲区,网页平均在256k下,这样设置
proxy_busy_buffers_size 256k; #高负荷下缓冲大小(proxy_buffers*2)
proxy_temp_file_write_size 256k; #设定缓存文件夹大小
proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
proxy_max_temp_file_size 128m;
5.7 可以配置window的host去指向http://www.erp.com
打开C:\Windows\System32\drivers\etc\hosts
添加如下配置
192.168.15.131 www.carrent.com
5.8 配置hosts不生效的解决方法
1,关闭浏览器再打开
2,刷新DNS
|--打开dos窗口
|--输入ipconfig /flushdns
5.9 登陆session的配置问题
1、不使用session,换用cookie
session是存放在服务器端的,cookie是存放在客户端的,我们可以把用户访问页面产生的session放到cookie里面,就是以cookie为中转站。你访问web服务器A,产生了session然后把它放到cookie里面,当你的请求被分配到B服务器时,服务器B先判断服务器有没有这个session,如果没有,再去看看客户端的cookie里面有没有这个session,如果也没有,说明session真的不存,如果cookie里面有,就把cookie里面的sessoin同步到服务器B,这样就可以实现session的同步了。
说明:这种方法实现起来简单,方便,也不会加大数据库的负担,但是如果客户端把cookie禁掉了的话,那么session就无从同步了,这样会给网站带来损失;cookie的安全性不高,虽然它已经加了密,但是还是可以伪造的。
2、session存在数据库(MySQL等)中可以配置将session保存在数据库中,这种方法是把存放session的表和其他数据库表放在一起,如果mysql也做了集群了话,每个mysql节点都要有这张表,并且这张session表的数据表要实时同步。
说明:用数据库来同步session,会加大数据库的IO,增加数据库的负担。而且数据库读写速度较慢,不利于session的适时同步。
3、session存在memcache或者redis中
memcache可以做分布式,php配置文件中设置存储方式为memcache,这样php自己会建立一个session集群,将session数据存储在memcache中。
说明:以这种方式来同步session,不会加大数据库的负担,并且安全性比用cookie大大的提高,把session放到内存里面,比从文件中读取要快很多。但是memcache把内存分成很多种规格的存储块,有块就有大小,这种方式也就决定了,memcache不能完全利用内存,会产生内存碎片,如果存储块不足,还会产生内存溢出。
4、ip_hash
upstream www.erp.com {
server 192.168.15.131:8080;
server 192.168.15.131:8090;
server 192.168.15.131:8100;
ip_hash;#一种IP的算法,只要用户使用同一个IP请求,nginx会分流到之前请求的服务器
}
nginx中的ip_hash技术能够将某个ip的请求定向到同一台后端应用服务器,这样一来这个ip下的某个客户端和某个后端就能建立起稳固的session,ip_hash是在upstream配置中定义的:
说明:因为这种方式只能用IP来分配后端,所以要求nginx一定要是最前端的服务器,否则nginx会取不到真实的客户端ip,那ip_hash就失效了。例如在服务器架构中使用squid做前端高速缓存,那么nginx取到的就是squid服务器的ip,用这个ip来做ip_hash肯定是不对的。再有,如果nginx的后端还有其他的负载均衡,将请求又分流了,那么对于某个客户端的请求,肯定不能定位到同一台应用服务器(例如php的fast-cgi服务器等),这样也不能做到session共享,如果在nginx后面再做负载均衡,我们可以再搭一台squid,然后再直接到应用服务器,或者用 location作一次分流,将需要session的部分请求通过ip_hash分流,剩下的走其它后端。
六、动静分离
6.1 概述
静动分离,就是将css、js、jpg等静态资源和jsp等动态资源分开处理,以此提高服务器响应速度,提高性能。
6.2 动静分离的配置
接上面的例子,我们使用的erp系统。查看erp里面的静态文件的路径可以看出
<link rel="stylesheet" href="${ctx }/resources/layui/css/layui.css" media="all" />
因为项目的发布名为erp所有要按下面的规则来设置动静分离 1,把tomcat1里面的webapps/erp/resources 拷贝到nginx/里面
#在nginx下创建resources目录
mkdir resources
#在resources下面创建erp目录
cp -r /root/software/tomcat1/webapps/erp/resources/ /usr/nginx/
2,修改conf/nginx.conf的server里面的配置
#动态分离的配置
location ~* \.(css|js|html)$ {
root resources;#可以使用相对路径和绝对路径 /usr/resources就是绝对路径
expires 7d;#有效天数
}
location ~* \.(avi|txt|png|gif|jpg|mp3|mp4|rmvb)$ {
root resources;
expires 20d;
}
3,动静分离的配置正则说明
http.server.localtion语法
基本语法: location [=|~|~*|^~]/uri/{...}
= 严格匹配, 如果这个查询匹配,将停止搜索并立即处理此请求
~ 区分大小写匹配(可用正则表达式)
~* 不区分大小写匹配(可用正则表达式)
!~ 区分大小写匹配
!~* 不区分大小写匹配
^~ 如果把这个前缀用于一个常规字符串,那么告诉nginx如果路径匹配那么不测试正则表达式
location = /{
#只匹配/查询
}
location /{
#匹配任何查询,因为所有请求都以/开头。但是正则表达式和长的块规则将被优先查询匹配
}
location ^~ /images/{
#匹配任何以/images/开头的查询并停止搜索。任何正则表达式将不会被测试。
}
location ~*.(gif|jpg|jpeg)${
#匹配任何以gif|jpg|jpeg结尾的请求
}
评论