1. 什么是Nginx
1.1. 介绍
Nginx是一款高性能的http 服务器、反向代理服务器及电子邮件(IMAP/POP3)代理服务器。由俄罗斯的程序设计师Igor Sysoev用c语言所开发,官方测试nginx能够支支撑5万并发链接,并且cpu、内存等资源消耗非常低,运行非常稳定。
1.2. 主要运用场景
http服务器。Nginx是一个http服务可以独立提供http服务。可以做网页静态服务器。
虚拟主机。可以实现在一台服务器虚拟出多个网站。例如个人网站使用的虚拟主机。
反向代理,负载均衡。当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要用多台服务器集群可以使用nginx做反向代理。并且多台服务器可以平均分担负载,不会因为某台服务器负载高宕机而某台服务器闲置的情况。
2. Nginx的安装与使用
2.1. 准备安装环境
第一步:在Linux系统上安装gcc环境。
yum -y install gcc-c++
第二步:安装第三方开发包PCRE库,nginx的http模块使用pcre来解析正则表达式,所以需要在linux上安装pcre库。
yum install -y pcre pcre-devel
第三步:安装第三方zlib库,nginx使用zlib对http包的内容进行压缩与解压缩。
yum install -y zlib zlib-devel
第四步:安装OpenSSL安全套接字密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议。
yum install -y openssl openssl-devel
2.2. 安装Nginx
第一步:下载Nginx源码包,并解压到自己创建目录。
第二步:进入到解压目录,依次输入指令./configure、make、make install,进行安装,安装完成后Nginx的相关文件在/usr/local/nginx目录下。如需要改变相关路径,首先创建client目录,然后在执行configure命令时,添加配置路径项,指令如下:
mkdir /var/temp/nginx/client -p
./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi
第三步:进入安装目录/usr/local/nginx/sbin/,启动nginx,执行命令:
[root@localhost sbin]# ./nginx
第四步:输入指令ps aux|grep nginx检查nginx是否启动成功,并在浏览器中输入ip进行访问。
注:访问的默认端口是80端口。注意:看是否关闭防火墙。
2.3. Nginx相关命令
/usr/local/nginx/sbin/nginx # 启动服务
/usr/local/nginx/sbin/nginx -s reload # 重新加载服务
/usr/local/nginx/sbin/nginx -s stop # 停止服务
/usr/local/nginx/sbin/nginx -s quit # 停止服务
补充:为Nginx添加开机自动启动。
第一步:修改/etc/rc.local文件,添加一行/usr/local/nginx/sbin/nginx,保存并退出。
第二步:在/etc目录下执行指令,使其生效。
chmod 755 rc.local
3. Nginx配置多个虚拟主机
虚拟的主机就是在一台服务器启动多个网站。Nginx可以通过端口不同和域名不同来区分不同的网站。
3.1. 通过端口区分虚拟主机
第一步:vim打开配置文件/usr/local/nginx/conf/nginx.conf,添加两个不同端口的Server,并修改listen访问端口和root对应的访问目录,此目录默认为/usr/local/nginx/html,这里改为html1和html2。
第二步:复制/usr/local/nginx/html文件夹两份,名字分别为html1和html2。注意名字要去第一步root修改的名字一样。
第四步:为了区分是否为不同虚拟主机,修改html1和html2目录下的index.html文件,如下:
第三步:执行Nginx重启命令,重启。
/usr/local/nginx/sbin/nginx -s reload
第四步:在浏览器中输入地址+端口,访问如下,表示配置成功。
3.2. 通过域名区分虚拟主机
3.2.1 域名的分类
域名分为一级域名(顶级域名)、二级域名和三级域名。举例如下:
一级域名:又叫顶级域名
Baidu.com
Taobao.com
Jd.com
二级域名:
Image.baidu.com
Item.baidu.com
三级域名:
1.Image.baidu.com
Aaa.image.baidu.com
3.2.2 域名访问网站的过程
域名访问网站,其本质还是通过Tcp/ip协议访问,以下为通过域名访问的流程图:
DNS服务器:把域名解析为ip地址。保存的就是域名和ip的映射关系,可以简单的理解为一个MAP<KEY,VALUE>。
本地测试可以修改host文件。修改window的hosts文件:(C:\Windows\System32\drivers\etc),可以通过SwitchHosts工具,以管理员权限运行的方式进行修改。
3.2.3 配置域名并访问
第一步:修改Window系统文件C:\Windows\System32\drivers\etc\hosts,添加需要访问的域名,可以通过SwitchHosts工具添加。
第二步:打开hosts文件,检查是否添加成功。如果没有添加成功,请检查是否开启相关权限控制软件,如360安全卫士。
第三步:在Linux系统中,vim打开配置文件/usr/local/nginx/conf/nginx.conf,添加两个不同端口的Server,并修改server_name访问域名和root对应的访问目录,这里改为html3和html4。
第四步:复制/usr/local/nginx/html文件夹两份,名字分别为html3和html4。注意名字要去第三步root修改的名字一样。
第五步:为了区分是否为不同虚拟主机,修改html3和html4目录下的index.html文件,如下:
第六步:执行Nginx重启命令,重启。
/usr/local/nginx/sbin/nginx -s reload
第七步:在浏览器中输入域名,访问如下,表示配置成功。
4. Nginx代理模式
Nginx代理模式分为正向代理和反向代理。正向代理指的是,用户访问代理服务器,代理服务器直接转发请求到指定服务器;反向代理指的是,用户访问公网ip网站入口,由代理服务器决定内部网络上哪一台服务器提供对应服务。以下正向代理和反向代理通过tomcat服务器演示。
4.1. 配置正向代理
正向代理,需要在客户机中安装代理软件。用户访问网站时,会被代理软件拦截,然后代理软件去请求用户访问的网站,获得网站数据,在返回给用户,在访问过程中,浏览器地址栏网站不会发生改变。
4.2. 配置反向代理
第一步:安装两个tomcat,修改配置文件端口分别为8081和8082。为了进行区分,修改tomcat目录下/ webapps/ROOT/index.jsp文件,然后启动两个tomcat。
第二步:修改Window系统文件C:\Windows\System32\drivers\etc\hosts,添加需要访问的域名,可以通过SwitchHosts工具添加。
第三步:在Linux系统中,vim打开配置文件/usr/local/nginx/conf/nginx.conf,添加两个不同端口的Server,并修改server_name访问域名;分别添加upstream tomcat1和upstream tomcat2;在location中添加proxy_pass 为tomcat1和tomcat2访问地址。(也可不添加upstream,直接在proxy_pass中添加访问地址)
第四步:执行Nginx重启命令,重启。
第五步:在浏览器中输入指定域名,访问如下,表示配置成功。
5. 负载均衡
如果一个服务由多台服务器提供,需要把负载分配到不同的服务器处理,需要配置负载均衡,默认的负载均衡的策略就是轮询的方式。
upstream tomcat2 {
server 192.168.25.130:8081;
server 192.168.25.130:8082;
}
也可以根据服务器的实际情况调整服务器权重。权重越高分配的请求越多,权重越低分配的请求越,默认是都是1。
upstream tomcat2 {
server 192.168.25.130:8081;
server 192.168.25.130:8082 weight=2;
}
其他的负载均衡的策略:1.通过IP地址的hash值 做映射。2.通过URL的方式计算出Hash值 。3.随机策略。4.最少并发量。
查考nginx.conf
配置方案:
user nginx;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream myapp1 {
server 192.168.25.132:9090 weight=2;
server 192.168.25.132:9091 weight=10;
}
server {
listen 80;
server_name www.demon.com;
location / {
proxy_pass http://myapp1;
index index.jsp index.html index.htm;
}
}
}
6. 扩展知识
6.1. Nginx解决跨域问题
以下为文件上传的跨域配置方案:
user nginx;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name www.demon.com;
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range';
location / {
proxy_pass http://192.168.25.134:8888;
if ($request_method = 'OPTIONS') {
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers X-Requested-With;
add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,PATCH,OPTIONS;
# 解决假请求问题,如果是简单请求则没有这个问题,但这里是上传文件,首次请求为 OPTIONS 方式,实际请求为 POST 方式
# Provisional headers are shown.
# Request header field Cache-Control is not allowed by Access-Control-Allow-Headers in preflight response.
add_header Access-Control-Allow-Headers DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range;
return 200;
}
}
}
}
6.2. Keepalived实现Nginx主备
Keepalived是集群管理中保证集群高可用的一个服务软件,用来防止单点故障。
Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。
6.3 配置HTTPS
编译命令
./configure --prefix=/data/test/nginx/ --with-http_stub_status_module --with-http_ssl_module --with-stream
配置文件:
#user nobody;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name fin-uatms.vvtechnology.cn;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
# HTTPS server
#
server {
listen 443 ssl;
server_name fin-uatms.vvtechnology.cn;
ssl_certificate /data/test/nginx/fin-uatms.vvtechnology.cn.pem;
ssl_certificate_key /data/test/nginx/fin-uatms.vvtechnology.cn.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
}
}