1、Nginx简介
1.1 什么是Nginx
Nginx(engine x)是一个高性能的Web服务器和反向代理服务器,也可以作为邮件代理服务器。
Nginx 特点是占有内存少,并发处理能力强,以高性能、低系统资源消耗而闻名,Nginx官方测试为5万并发请求。
Nginx是免费开源的,同时Nginx也有收费的商业版本,商业版本提供了性能优化、宕机等紧急问题处理等技术支持和服务。
1.2 正向代理和反向代理概念
反向代理(Reverse Proxy)方式是指以==代理服务器==来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器;
正向代理类似一个跳板机,代理访问外部资源。比如:我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这个代理服务器,它能访问那个我不能访问的网站,于是我先连上代理服务器,告诉它我需要那个无法访问网站的内容,代理服务器去取回来,然后返回给我。正向代理应用最广泛的就是“科学上网工具”。
综上所述:==正向代理代理对象是客户端,反向代理代理对象是服务端。==
==软件层面一般常用Nginx来做反向代理服务器,它的性能非常好,用来做负载均衡。==
2、Nginx环境搭建
2.1 下载
wget http://nginx.org/download/nginx-1.14.2.tar.gz
2.2 安装
Nginx的安装需要确定Linux安装相关的几个库,否则配置和编译会出现错误,安装的命令为:
yum install gcc openssl openssl-devel pcre pcre-devel zlib zlib-devel -y
开始安装:
- tar -zxvf nginx-1.14.2.tar.gz
- cd nginx-1.14.2
- ./configure --prefix=/usr/local/nginx(--prefix是指定安装路径)
- make
- make install
2.3 Nginx常用命令
启动:
- 普通启动:cd nginx/sbin/;./nginx
- 通过配置文件启动: ./nginx -c /usr/local/nginx/conf/nginx.conf
- 查看进程,检查Nginx是否启动:ps -ef | grep nginx
关闭:
- kill -QUIT 主pid(这种关闭方式会处理完请求后再关闭)
- kill -TERM 主pid(暴力关闭)
重启Nginx:
./nginx -s reload
检查配置文件是否正确:/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf –t
3、Nginx配置文件说明
Nginx核心配置文件在/nginx/conf目录下,名字为nginx.conf,内容如下:
#配置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进程连接数上限,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压缩输出
###-----------------------------------------------
#配置虚拟主机,可以有多个
server {
listen 80; #配置监听端口
server_name localhost; #配置服务名
#charset koi8-r; #配置字符集
#access_log logs/host.access.log main; #配置本虚拟主机的访问日志
#默认的匹配斜杠/的请求,当访问路径中有斜杠/,会被该location匹配到并进行处理
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错误页面
#精确匹配
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;
# }
#}
}
4、Nginx主要应用
4.1 静态网站部署
Nginx是一个HTTP的web服务器,可以将服务器上的静态文件(如HTML、图片等)通过HTTP协议返回给浏览器客户端。
假设要将一个静态网站ace部署到Nginx服务器上:
- 将ace上传到linux的/opt/static目录下
- 修改nginx.conf配置文件:
//在server中,通过location匹配访问的路径,然后转发给静态资源
location / {
root html;
root /opt/static/ace;
index index.html index.htm;
}
location /ace { //这里接受/ace请求,去/opt/static下找资源
root /opt/static;
index index.html index.htm;
}
- 重启nginx
- 在浏览器中输入http://localhost:80/ace进行访问
location中配置路径讲解:
规则:==ip + port 等于 root==,假设server的配置如下:
server {
listen 80; #端口号
location / {
root /opt/static/ace; #静态文件路径
}
}
替换:
http://localhost:80/ = root = /opt/static/ace
http://localhost:80/ace = root/ace = /opt/static/ace/ace
4.2 负载均衡
在网站创立初期,我们一般都使用单台机器对外提供集中式服务。随着业务量的增大,我们一台服务器不够用,此时就会把多台机器组成一个集群对外提供服务,但是,我们网站对外提供的访问入口通常只有一个,比如 www.web.com。那么当用户在浏览器输入www.web.com进行访问的时候,如何将用户的请求分发到集群中不同的机器上呢,这就是负载均衡要做的事情。
负载均衡通常是指将请求"均匀"分摊到集群中多个服务器节点上执行,这里的均匀是指在一个比较大的统计范围内是基本均匀的,并不是完全均匀。
Nginx负载均衡
Nginx通过在nginx.conf文件进行配置即可实现负载均衡
原理图
配置如下:
- 在http模块内加上upstream配置
upstream myweb {
server 127.0.0.1:9100 weight=5;#这里可以是一个端口号为9100的tomcat
server 127.0.0.1:9200 weight=2;#同上
}
其中weight=1表示权重,用于后端服务器性能不均的情况,访问比率约等于权重之比,权重越大访问机会越多。
upstream是配置nginx与后端服务器负载均衡非常重要的一个模块,并且==它还能对后端的服务器的健康状态进行检查==,若后端服务器中的一台发生故障,则前端的请求不会转发到该故障的机器。
- 在server模块里添加location,并配置proxy_pass
location /myweb {
proxy_pass http://myweb;
}
==其中myweb字符串要和upstream后面的字符串相等==。
==Nginx常用负载均衡策略:==
- 轮询(默认)
upstream backserver {
server 127.0.0.1:8080;
server 127.0.0.1:9090;
}
==注意:这里的轮询并不是每个请求轮流分配到不同的后端服务器,与ip_hash类似,但是按照访问url的hash结果来分配请求,使得每个url定向到同一个后端服务器,主要应用于后端服务器为缓存时的场景下。==
- 权重
upstream backserver {
server 192.168.0.14 weight=5;
server 192.168.0.15 weight=2;
}
每个请求按一定比例分发到不同的后端服务器,weight值越大访问的比例越大,用于后端服务器性能不均的情况。
- ip_hash
upstream backserver {
ip_hash;
server 127.0.0.1:8080;
server 127.0.0.1:9090;
}
==ip_hash也叫IP绑定,每个请求按访问ip的hash值分配,这样每个访问客户端会固定访问一个后端服务器,可以解决会话Session丢失的问题。==
- 最少连接
upstream backserver {
least_conn;
server 127.0.0.1:8080;
server 127.0.0.1:9090;
}
web请求会被转发到连接数最少的服务器上
4.3 静态代理
把所有静态资源的访问改为访问nginx,而不是访问tomcat,这种方式叫静态代理。因为nginx更擅长于静态资源的处理,性能更好,效率更高。
所以在实际应用中,我们将静态资源比如图片、css、html、js等交给nginx处理,而不是由tomcat处理。
Nginx静态代理实现方式
- 在nginx.conf的location中配置静态资源的后缀。例如:当访问静态资源,从linux服务器/opt/static目录下获取。
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;
}
说明:
- ~表示正则匹配,也就是说后面的内容可以是正则表达式匹配。
- 第一个点 . 表示任意字符。
- *表示一个或多个字符。
- . 是转移字符,是后面这个点的转移字符。
- | 表示或者。
- $ 表示结尾。
- 在nginx.conf的location中配置静态资源所在目录。例如当访问静态资源,则从linux服务器/opt/static目录下获取。
location ~ .*/(css|js|img|images) {
root /opt/static;
}
xxx/css
xxx/js
xxx/img
xxx/images
我们将静态资源放入 /opt/static 目录下,然后用户访问时由nginx返回这些静态资源。
4.4 动静分离
Nginx的负载均衡和静态代理结合在一起,我们可以实现动静分离,这是实际应用中常见的一种场景。
动态资源,如jsp由tomcat或其他web服务器完成。
静态资源,如图片、css、js等由nginx服务器完成。
它们各司其职,专注于做自己擅长的事情。
动静分离充分利用了它们各自的优势,从而达到更高效合理的架构。
整个架构中,一个nginx负责负载均衡,两个nginx负责静态代理。Nginx在一台Linux上安装一份,可以启动多个Nginx,每个Nginx的配置文件不一样即可。
4.5 虚拟主机
虚拟主机,就是把一台物理服务器划分成多个“虚拟”的服务器,这样我们的一台物理服务器就可以当做多个服务器来使用,从而可以配置多个网站。
Nginx提供虚拟主机的功能,就是为了让我们不需要安装多个Nginx,就可以运行多个域名不同的网站。
Nginx下,一个server标签就是一个虚拟主机。nginx的虚拟主机就是通过nginx.conf中server节点指定的,想要设置多个虚拟主机,配置多个server节点即可;
配置虚拟主机方式
- 基于端口的虚拟主机
基于端口的虚拟主机配置,使用端口来区分。
浏览器使用 同一个域名+端口 或 同一个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;
}
}
需要修改一下本地的hosts文件,在hosts文件中配置:
本机ip www.myweb.com
本机ip www.p2p.com