Nginx (engine x)采用C语言开发编写的,是一个高性能的Web服务器和反向代理服务器,也可以作为邮件代理服务器。
Nginx 特点是占有内存少,并发处理能力强,以高性能、低系统资源消耗而闻名,Nginx官方测试为5万并发请求。与Nginx同类型的Web服务器还有Apache、Lighttpd(音同lighty)、Tengine(阿里巴巴的) 等。
反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器;
正向代理类似一个跳板机,代理访问外部资源。比如:我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这个代理服务器,它能访问那个我不能访问的网站,于是我先连上代理服务器,告诉它我需要那个无法访问网站的内容,代理服务器去取回来,然后返回给我。
综上所述:正向代理代理对象是客户端,反向代理代理对象是服务端。
软件层面一般常用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
Configuration summary
+ using system PCRE library
+ OpenSSL library is not used
+ using system zlib library
#配置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;
# }
#}
}
方式一:安装目录的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安装目录的sbin目录,启动nginx命令:./nginx
在外部浏览器访问:IP地址:80/ace
注意:这里80 可以省略,能正常访问
在没有标识符的请求下,匹配规则如下:
备注:
location / {
# 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求
# 但是正则和最长字符串会优先匹配
}
结合标识符,匹配顺序如下:
(location =) > (location 完整路径) > (location ^~ 路径) > (location ,* 正则顺序) > (location 部分起始路径) > (location /)
即
(精确匹配)> (最长字符串匹配,但完全匹配) >(非正则匹配)>(正则匹配)>(最长字符串匹配,不完全匹配)>(location通配)
负载均衡通常是指将请求"均匀"分摊到集群中多个服务器节点上执行,这里的均匀是指在一个比较大的统计范围内是基本均匀的,并不是完全均匀。
比如 F5、深信服、Array 等
优点是有厂商专业的技术服务团队提供支持,性能稳定
缺点是费用昂贵,对于规模较小的网络应用成本太高
比如 Nginx、LVS、HAProxy 等
优点是免费开源,成本低廉
Nginx通过在nginx.conf文件进行配置即可实现负载均衡
配置2步即可
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与后端服务器负载均衡非常重要的一个模块,并且它还能对后端的服务器的健康状态进行检查,若后端服务器中的一台发生故障,则前端的请求不会转发到该故障的机器
location /myweb {
proxy_pass http://www.myweb.com;
}
其中 www.myweb.com 字符串要和 upstream 后面的字符串相等,当然这部分内容也可以随便填写,只是为了保证和upstream后的字符串相同
就是均匀的将请求分配给不同的服务器。
注意:这里的轮询并不是每个请求轮流分配到不同的后端服务器,与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绑定,每个请求按访问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包包名的文件夹,静态资源放在这个文件加下
例如:部署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
例如:部署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服务启动可以通过携带配置文件的方式启动多个服务。
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;
}
}
虚拟主机,就是把一台物理服务器划分成多个“虚拟”的服务器,这样我们的一台物理服务器就可以当做多个服务器来使用,从而可以配置多个网站。
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,后面是你自定义的域名
,第69行和第116行左右的 标签,这三个port修改,每个Tomcat的这三个端口不能重复
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
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;
}
C:\Windows\System32\drivers\etc\hosts
ip地址 beijing.myweb.com
ip地址 nanjing.myweb.com
ip地址 tianjin.myweb.com
windows文件上传:rz -y (首先切换到要上传的文件路径)
Linux文件下载:sz 要下载的文件名