Nginx web服务器使用
nginx Linux 安装
-
安装依赖
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
-
下载并解压安装包
# 在/usr/local/src 创建nginx文件夹 cd /usr/local/src/nginx # 下载tar包 wget http://nginx.org/download/nginx-1.17.3.tar.gz tar -xf nginx-1.17.3.tar.gz
执行 ./configure --prefix=/usr/local/nginx (其中 --prefix是指定nginx 安装路径 也就是最后安装到哪)
执行 make
执行 make install
nginx 相关命令
/usr/local/nginx/sbin/nginx -s reload # 重新载入配置文件
/usr/local/nginx/sbin/nginx -s reopen # 重启 Nginx
/usr/local/nginx/sbin/nginx -s stop # 停止 Nginx
nginx 配置文件 /conf/nginx.conf
#user nobody; # 配置worker进程运行用户 默认为任何用户都可以
worker_processes 1; #配置工作进程数目,根据硬件调整,通常等于CPU数量或2倍与CPU数量
#error_log logs/error.log; # 配置全局错误日志及类型 [debug|info|notice|warn|error|crit] 默认为error
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid; # 配置进程编号 pid文件
# 配置工作模式和连接数
events {
# 配置事件模型
# use epoll;
# 配置每个worker进程连接数上限,nginx支持的总连接数就等于worker_processes * worker_connections
worker_connections 1024; # 最大可写55535
}
# 配置http服务器,利用他的反向代理功能提供负载均衡支持
http {
include mime.types; # 配置nginx支持哪些多媒体类型,可以在cong/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; # 防止网络阻塞 在sendfile 开启后使用
#keepalive_timeout 0;
keepalive_timeout 65; # 连接时长 超时显示连接失败
#tcp_nodelay on; # 实时发送不进行等待 在keepalive开启后使用,提供网络包的传输实时性
#gzip on; # 开启gzip 压缩输出
# 配置虚拟主机
server {
listen 80; # 配置监听端口
server_name localhost; # 配置服务名
#charset koi8-r; # 配置字符集 通用UTF-8
#access_log logs/host.access.log main; #配置本虚拟主机的访问日志
# 默认 / 请求,当访问路径中出现 / 会被该location匹配到 并进行处理
# 类似于路由的概念 / 路径为默认路径
location / { # location 用于匹配路由
root html; # root 时配置服务器的默认网站根目录位置,默认为nginx安装目录下的html目录
index index.html index.htm; # 在html目录下查找index.html 配置首页文件的名称
}
#error_page 404 /404.html; # 配置 404 页面
# redirect server error pages to the static page /50x.html #配置50x 页面
#
error_page 500 502 503 504 /50x.html;
location = /50x.html { # location = /50x.html 表示 精确匹配
root html; # 去html 目录下查看 50x.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;
#}
}
# 另一个混合使用基于IP、名称和端口的配置的虚拟主机
# 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 服务
# 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;
# }
#}
}
nginx的主要应用
静态网站
server{
listen 80;# 端口号
# ip + port = root root也就是项目文件所在目录
location /{
root /opt/www/ # 静态文件路径
index index.html # 静态文件
}
}
server {
listen 8080; # 配置监听端口
server_name localhost; # 配置服务名
#charset koi8-r; # 配置字符集 通用UTF-8
#access_log logs/host.access.log main; #配置本虚拟主机的访问日志
# 配置路由 www文件夹与nginx.exe 同级目录
location / { # location 用于匹配路由
root www; # root 时配置服务器的默认网站根目录位置,默认为nginx安装目录下的html目录
index index.html index.htm; # 在html目录下查找index.html 配置首页文件的名称
}
# 配置404 页面
error_page 404 /404.html; # 配置 404 页面
location = /404.html {
root www;
}
# 配置50x 页面
error_page 500 502 503 504 /50x.html;
location = /50x.html { # location = /50x.html 表示 精确匹配
root www; # 去html 目录下查看 50x.html
}
}
负载均衡
-
负载均衡概述
网站创立初期,我们一般都使用单台及其对外提供集中式服务,但随着业务量的正大,我们一台服务器不够用,此时就会把多台服务器组成一个集群对外提供服务;但是,我们网站对外提供的访问入口通常只有一个,比如www.xxx.com;那么当用户访问 www.xxx.com的时候,如何将用户的请求分发到集群中不同的机器上呢,这就是负载均衡要做的事情;负载均衡通常是指将请求“均匀”分摊到集群中多个服务器节点上执行,这里的均匀是指在一个较大的统计范围内是基本均匀的,并不是完全均匀
-
负载均衡实现方式:
- 硬件的负载均衡
- 比如F5、深信服、Array等;优点是有厂商专业的技术服务团队提供支持;性能稳定;缺点是费用昂贵,对应规模较小的网络应用成本高
- 软件的负载均衡
- 比如 Nginx、LVS、HAProxy等;免费开源,成本低廉
- 硬件的负载均衡
-
Nginx 实现负载均衡
-
Nginx实现负载均衡:通过在Nginx的nginx.conf中 进行配置即可
-
配置如下
- 在http模块中加入:
upstream test { server 127.0.0.1:8000 weight=3; server 127.0.0.1:8001 weight=1; }
其中 weight 表示权重,用于后端服务器性能不均的情况,访问比率约等于权重之比,权重越大访问的机会越大;
upstream 是配置nginx与后端服务器负载均衡非常重要的一个模块,并且它还能对后端的服务器的健康状态进行检查,若后端服务器中一台发生故障,则客户端的请求不会转发到该故障机器
- 在server模块中添加:
location / { # 访问项目某个路径时 # 代理转发的地址 域名或地址和端口 proxy_pass http://test; # http:// 必须存在 }
其中location中 的www.xxx.com字符串要和 upstream 后面的字符串相同
-
-
负载均衡常用策略
-
轮询(默认):
每个请求轮流分配到不同的后端服务器,如果后端服务器挂掉或假死,将自动剔除,不在进行分配;
upstream demo{ server 127.0.0.1:8000; server 127.0.0.1:8001; }
-
权重
每个请求按比例分发到不同的后端服务器,weight的值越大,访问的几率越大,用于后端服务器性能不均
upstream demo{ server 127.0.0.1:8000 weight=2; server 127.0.0.1:8001 weight=2; }
-
ip_hash
ip_hash也叫IP绑定,每个请求按照ip的hash值分配,这样每个访问客户端会固定访问一个后端服务器,可以解决session会话丢失问题
# 通过hash("ip")%服务器的台数 = 结果匹配到对应的ip # hash('183.199.76.201')% 2 = 1 因此会匹配到 127.0.0.1:8001 upstream demo{ ip_hash; server 127.0.0.1:8000; server 127.0.0.1:8001; }
-
最少连接
web请求会转发到连接数最少的服务器上
upstream demo{ least_conn; server 127.0.0.1:8000; server 127.0.0.1:8001; }
-
其他配置
-
backup(预备机器) 其他所有的非backup机器down的时候,才请求backup机器
upstream demo{ server 127.0.0.1:8000; server 127.0.0.1:8001 backup; }
-
down(停止机器) 当前的server为down状态,不参与负载均衡
upstream demo{ server 127.0.0.1:8000; server 127.0.0.1:8001 down; }
-
-
静态代理
把所有的静态资源的访问改为访问nginx,而不是再去访问tomact ,因为nginx更擅长与静态资源的处理,性能更好,效率更高
所有在实际应用中,我们将静态资源比如图片、css、html、js等交割给nginx 处理,而不是由tomcat处理;
通过在nginx.conf 配置文件中添加静态资源的文件名
放置静态资源的目录,要注意目录权限的问题
location ~ .*\.(js|css|html|htm|gif|png|jpg|jpeg|bmp|swf|icon|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|mp4|wma)$ {
root static;
}
# 当 访问页面图片为 /src/img/001.jpg
# 那么 是访问的 static/src/img/001.jpg
通过在nginx.conf配置文件中配置静态资源所在目录实现
location ~ .*/(css|img|js|images){
root static
}
# 当 访问页面图片为 demo/img/001.jpg
# 那么 nginx可以匹配到 img 就会去static/img中寻找001.jpg
我们将静态资源放入 /static 目录下,然后用户访问时由nginx 返回这些静态资源
配置如下
// 创建一个服务器
const express = require('express')
const path = require('path')
let app = express()
app.get('/',(req,res)=>{
// 发送响应 一个html的img图片
res.send('<img src="/src/image/2444379.png"/ art="图片">')
})
app.listen(8000,(err) => {
if(err) throw err
console.log('服务器开启成功')
})
# 配置nginx
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream resource {
server 127.0.0.1:8000;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://resource;
}
# 访问图片
location ~ .*\.(js|css|html|htm|gif|png|jpg|jpeg|bmp|swf|icon|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|mp4|wma)$ {
root static;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
动静分离
Nginx 的负载均衡和静态代理结合在一起,我们就可以实现动静分离,这是实际应用中常见的一种场景;
动态资源,如jsp有tomact或其他web服务器完成
静态资源,如图片、css、js等由nginx服务器完成
配置如下
// 8000 服务器
const express = require('express')
const path = require('path')
let app = express()
app.get('/',(req,res)=>{
res.send('<img src="/src/image/2444379.png"/ art="图片">')
})
app.listen(8001,(err) => {
if(err) throw err
console.log('服务器开启成功')
})
// 8001 服务器
const express = require('express')
const path = require('path')
let app = express()
app.get('/',(req,res)=>{
res.send('<img src="/src/image/2444379.png"/ art="图片">')
})
app.listen(8001,(err) => {
if(err) throw err
console.log('服务器开启成功')
})
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
# 配置 动态资源
upstream resource {
server 127.0.0.1:8000;
server 127.0.0.1:8001;
}
# 配置 静态资源
upstream staticResource {
server 127.0.0.1:8080;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://resource;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 8080;
server_name localhost;
# 访问图片
# location ~ .*\.(js|css|html|htm|gif|png|jpg|jpeg|bmp|swf|icon|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|mp4|wma)$ {
# root static;
# }
location ~ .*/(css|img|js|images){
root static;
}
}
}
虚拟主机
虚拟主机,就是把一台物理服务器划分成多个 “ 虚拟 ” 的服务器,这样我们的一台物理服务器就可以当做多个服务器来使用,从而配置多个服务器;
Nginx提供虚拟主机的功能,就是为了让我们不需要安装对个Nginx,就可以运行多个网站
Nginx下,一个server标签就是一个虚拟主机
nginx的虚拟主机就是通过nginx.conf 中 server 节点指定的 , 想要设置多个虚拟主机,配置多个server即可
-
基于端口的虚拟主机
基于端口的虚拟主机配置,使用端口来区分
-
浏览器使用 同一个域名 + 端口 或 同一个IP地址 + 端口访问
server { listen 80; server_name localhost; location / { proxy_pass http://resource; } } server { listen 81; server_name localhost; location / { proxy_pass http://resource; } }
-
基于域名的虚拟主机
-
基于域名的虚拟主机是最常见的一种虚拟主机
server { listen 80; server_name www.shop.com; location / { root www; index index.html index.htm; } }
-
-
配置虚拟主机
# 此时域名无法被解析 需要修改hosts文件 server { listen 80; server_name myblogsing.com; location / { root www; index index.html index.htm; } }
-
修改hosts文件,实现本地域名重定向
- C:\Windows\System32\drivers\etc\hosts 文件
# Copyright (c) 1993-2009 Microsoft Corp. # # This is a sample HOSTS file used by Microsoft TCP/IP for Windows. # # This file contains the mappings of IP addresses to host names. Each # entry should be kept on an individual line. The IP address should # be placed in the first column followed by the corresponding host name. # The IP address and the host name should be separated by at least one # space. # # Additionally, comments (such as these) may be inserted on individual # lines or following the machine name denoted by a '#' symbol. # # For example: # # 102.54.94.97 rhino.acme.com # source server # 38.25.63.10 x.acme.com # x client host # localhost name resolution is handled within DNS itself. # 127.0.0.1 localhost # ::1 localhost # 新增 域名重定向 127.0.0.1 myblogsing.com
-
- 使用include 的方式引入虚拟主机配置
- include /test/demo.conf
- 将虚拟目录的配置文件加入到“http{}” 部分的末尾,与其他server并列
nginx 安装模块
gzip
gzip on : 打开或关闭gzip
-
gzip_buffers : 设置用于处理请求亚索的缓冲器数量和大小
gzip on; #32 4k 表示安装内存页大小 以4k为单位,申请32倍内存空间 gzip_buffers 32 4k|16 8k;
-
gzip_comp_level :设置gzip压缩几倍,级别越低压缩速度越快文件压缩比越小,反速度越慢文件压缩比越大
gzip on; gzip_comp_level 1;
我们以一个大小为92.6K的脚本文件为例,如下所示。其中最后三个数值分别表示压缩比、包大小、平均处理时间(使用ab压测,100用户并发下,
./ab -n 10000 -c 100 -H 'Accept-Encoding: gzip' http://10.27.180.75/jquery.js
)以及CPU消耗。从这我们可以得出结论:
- 随着压缩级别的升高,压缩比有所提高,但到了级别6后,很难再提高;
- 随着压缩级别的升高,处理时间明显变慢;
- gzip很消耗cpu的性能,高并发情况下cpu达到100%;
因此,建议:
- 不是压缩级别越高越好,其实gzip_comp_level 1的压缩能力已经够用了,后面级别越高,压缩的比例其实增长不大,反而很吃处理性能。
- 压缩一定要和静态资源缓存相结合,缓存压缩后的版本,否则每次都压缩高负载下服务器肯定吃不住。
-
**gzip_disable 通过表达式,表明那些UserAgent有不使用gzip **
Syntax: gzip_disable regex ...; Default: — Context: http, server, location This directive appeared in version 0.6.23.
-
gzip_min_length: 当返回内容大于此指时才会使用gzip进行压缩 以k为单位,所有页面都压缩
gzip on; gzip_min_length 20;
-
gzip_http_version: 识别http版本,早期浏览器不支持gzip,因此添加该属性
gzip on; gzip_http_version 1.1;
-
gzip_proxied
Nginx做为反向代理的时候启用:
- off – 关闭所有的代理结果数据压缩
- expired – 如果header中包含”Expires”头信息,启用压缩
- no-cache – 如果header中包含”Cache-Control:no-cache”头信息,启用压缩
- no-store – 如果header中包含”Cache-Control:no-store”头信息,启用压缩
- private – 如果header中包含”Cache-Control:private”头信息,启用压缩
- no_last_modified – 启用压缩,如果header中包含”Last_Modified”头信息,启用压缩
- no_etag – 启用压缩,如果header中包含“ETag”头信息,启用压缩
- auth – 启用压缩,如果header中包含“Authorization”头信息,启用压缩
- any – 无条件压缩所有结果数据
Syntax: gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...; Default: gzip_proxied off; Context: http, server, location
-
gzip_vary: 增加响应头“Vary : Accept-Encoding”
Syntax: gzip_vary on | off; Default: gzip_vary off; Context: http, server, location
-
gzip_types 设置需要压缩的MIME类型,如果不在设置类型范围内的请求不进行压缩
字体类型扩展名 Content-type .eot application/vnd.ms-fontobject .ttf font/ttf .otf font/opentype .woff font/x-woff .svg image/svg+xml
浏览器过期设置
- 设置缓存过期 expires
expires 20h