一、Nginx是什么
Nginx(engine x)是一款轻量级、高性能的HTTP和反向代理服务。
二、Nginx的优势所在
1、高并发,高性能。Nginx采用异步非阻塞事件驱动模型,可以同时处理大量并发连接,适用于高负载环境。
2、高可靠,可以7*24小时不间断的运行
3、可扩展性强,可以添加第三方模块,模块化设计,使得添加模块非常平稳
4、热部署,可以在不停止服务器的情况下升级nginx
5、BSD许可证--nginx不止开源免费的我们还可以更具实际需求进行定制修改源代码
三、Nginx的两种安装方式
(1) Nginx的编译安装
1.1、安装编译所需环境及依赖
[root@localhost ~]# yum -y install gcc gcc-c++ pcre pcre-devel gd-devel openssl openssl-devel zlib zlib-devel
1.2、安装Nginx
[root@localhost ~]# wget http://nginx.org/download/nginx-1.16.0.tar.gz //此处下载的nginx版本是1.61.0,若想下载其他版本,请前往nginx官网nginx官网
[root@localhost ~]# tar xzf nginx-1.16.0.tar.gz -C /usr/local/ //此处的/usr/local是nginx安装路径,可以替换为你想安装的路径即可
[root@localhost ~]# cd /usr/local/nginx-1.16.0/
[root@localhost nginx-1.16.0]# ./configure --prefix=/usr/local/nginx --group=nginx --user=nginx --sbin-path=/usr/local/nginx/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/tmp/nginx/client_body --http-proxy-temp-path=/tmp/nginx/proxy --http-fastcgi-temp-path=/tmp/nginx/fastcgi --pid-path=/var/run/nginx.pid --lock-path=/var/lock/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-pcre --with-http_realip_module --with-stream
[root@localhost nginx-1.16.0]# make && make install //编译及编译安装
[root@localhost nginx-1.16.0]# /usr/local/nginx/sbin/nginx //启动nginx即可,/usr/local/是安装nginx的路径,需自行替换。(关闭nginx:/usr/local/nginx/sbin/nginx -s stop)
(2)Nginx的Yum安装
[root@localhost ~]# yum install -y https://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
[root@localhost ~]# yum -y install nginx-1.22.1 //nginx-1.22.1表示下载的nginx版本是1.22.1。只需将其替换为你想下载的nginx版本即可
[root@localhost ~]# systemctl start nginx //启动nginx (关闭nginx:systemctl stop nginx)
四、Nginx反向代理
(1)反向代理产生的背景
在计算机世界里,由于单个服务器的处理客户端(用户)请求能力有一个极限,当用户的接入请求蜂拥而入时,会造成服务器忙不过来的局面,可以使用多个服务器来共同分担成千上万的用户请求,这些服务器提供相同的服务,对于用户来说,根本感觉不到任何差别。
(2)反向代理的实现
需要有一个负载均衡设备(即反向代理服务器)来分发用户请求,将用户请求分发到后端正真提供服务的服务器上。服务器返回自己的服务到负载均衡设备。负载均衡设备将服务器的服务返回用户。
(3)Nginx proxy配置(Nginx反向代理的配置)
Nginx的反向代理是用Proxy(ngx_http_proxy_module)模块实现的,而这个模块在下载Nginx的时候会自带。
反向代理指的是为了避免只有一个服务器来处理众多的用户请求,造成响应速度变慢,或者宕机,所以把多个服务器组成一个集群,由一个反向代理器来给集群中的众多服务器做分发,这样就算其中一个服务器宕机,那么还有其他服务器可以继续来工作。用一个反向代理器作为入口(称其是A机器),有1个后端服务器即真正处理客户端请求的服务器(称其是B机器),当有很多用户来请求A机器的时候,A机器会将其分分配给B机器,但显然这是没有意义的,因为还是一台机器B一直在累死累活的工作,为了便于理解,我们先用这种方法。
A机器(反向代理器)192.168.91.128
B机器(后端服务器)192.168.91.129
两台机器都下载nginx
[root@nginx-server ~]# vim /etc/nginx/conf.d/default.conf
server {
server {
listen 80;
server_name localhost;location / {
proxy_pass http://192.168.91.129:80; //真实后端服务器的地址
proxy_redirect default;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
}
}
[root@nginx-server ~]# nginx -s reload //重新加载nginx
这时去浏览器输入代理服务器A的ip之后,出来的是后端服务器的处理结果。
五、Nginx负载均衡
Nginx的负载均衡是用upstream模块实现的,这个模块在下载Nginx的时候也会自带。负载均衡和反向代理一般是配合使用的,我们刚才说了Nginx的反向代理是由一个反向代理器将客户端的请求分发给后端服务器(真正处理用户请求的服务器),那它怎么分发呢,基于什么原则才能做到将客户端的请求高效合理的分配给后端服务器呢,这就用到了负载均衡算法。
(1)负载均衡算法
1、轮询:nginx默认的轮询权重是1,即平均的分发给每台后端服务器,假如有ABCD四台后端服务器,当客户端对代理器发起请求时,客户端会通过轮询将那些请求平均分发给后端服务器(ABCDABCDABCD.....)
2、加权轮询:跟据配置的权重的大小而分发给不同服务器不同数量的请求。
upstream myweb {
server 172.17.14.2:8080 weight=1;
server 172.17.14.3:8080 weight=2;
}
服务器处理请求的顺序是ABBABBABB....
3、IP-hash:同一个ip客户端总是被分配到同一个后端服务器,但是这达不到负载均衡。
4、url-hash:同一个url总是被分配到同一个后端服务器。
5、fair:这个比较智能,根据后端服务器的响应速度,哪个快就被分发到哪个后端服务器,但是,Nginx本身是不支持 fair的,如果需要使用这种调度算法,必须下载Nginx的 upstream_fair模块。
(2)Nginx的负载均衡配置
代理服务器:192.168.91.128
后端服务器A:192.168.91.129
后端服务器B:192.168.91.130
upstream testweb
server 192.168.91.129:80 weight=2 max_fails=2 fail_timeout=2s;
server 192.168.91.130:80 weight=2 max_fails=2 fail_timeout=2s;
}
server {
listen 80;
server_name www.test.com;
charset utf-8;
#access_log logs/host.access.log main;
location / {
proxy_pass http://testweb; //这里放的是你上面集群的名字,可以自己起
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}}
去浏览器输入代理ip地址进行测试,刷新,会发现,页面出来的顺序ABABAB...,即代理服务器将你的请求平均的分配给了两个后端服务器(默认是轮询)
六、Nginx动静分离
之所以要实现动静分离,是因为再有很多用户发起,请求时,如果一个服务器同时处理静态和动态的话,那么服务器的响应速度就会很慢,用户的体验感不好,而且这个服务器的压力很重。所以我们采取动静分离,当用户请求动的时候,将其分配到一个后端服务器,当用户请求静的时候,将其分配到另一个后端服务器。简单来说,就是使用正则表达式匹配过滤,然后交个不同的服务器。
准备三台机器,都下载nginx
代理服务器:192.168.91.128
后端服务器A(处理静):192.168.91.129
后端服务器B(处理动):192.168.91.130
配置静态的后端服务器:
server {
listen 80;
server_name localhost;location ~ \.(html|jpg|png|js|css) {
root /home/www/nginx;
expires 1d; #为客户端设置静态资源缓存时间
}
}
配置动态的后端服务器:
[root@nginx-server ~]# rpm -Uvh https://mirror.webtatic.com/yum/el7/epel-release.rpm
[root@nginx-server ~]# rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
[root@nginx-server ~]# yum install php71w-xsl php71w php71w-ldap php71w-cli php71w-common php71w-devel php71w-gd php71w-pdo php71w-mysql php71w-mbstring php71w-bcmath php71w-mcrypt -y
[root@nginx-server ~]# yum install -y php71w-fpm[root@nginx-server ~]# systemctl start php-fpm
server {
listen 80;
server_name localhost;
location ~ \.php$ {
root /home/nginx/html; #指定网站目录
fastcgi_pass 127.0.0.1:9000; #开启fastcgi连接php地址
fastcgi_index index.php; #指定默认文件
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; #站点根目录,取决于root配置项
include fastcgi_params; #包含fastcgi使用的常量
}
}
代理服务器配置:
upstream static {
server 192.168.91.129:80 weight=1 max_fails=1 fail_timeout=60s;
}
upstream php {
server 192.168.91.130:80 weight=1 max_fails=1 fail_timeout=60s;
}server {
listen 80;
server_name localhost
#动态资源加载
location ~ \.(php|jsp)$ {
proxy_pass http://php;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
#静态资源加载
location ~ .*\.(html|jpg|png|css|js)$ {
proxy_pass http://static;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}