1.Nginx 动静态资源分离
1.配置反向代理
1.基本的配置
# 修改配置文件需要重启服务器
user liujun liu;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
keepalive_timeout 65;
# 1.创建虚拟主机(主机名称为:www.liujun.com)
server {
listen 8090;
server_name www.liujun.com;
location / {
# 2.把所有对 www.liujun.com:8090 的请求转发到 https://www.taobao.com
proxy_pass https://www.taobao.com;
}
}
}
这种反向代理可以实现 把 HTTP 转换成更安全的 HTTPS 的方案
2.其它配置
代理其他的服务器
# 修改配置文件需要重启服务器
user liujun liu;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
keepalive_timeout 65;
# 1.创建虚拟主机(主机名称为:www.liujun.com)
server {
listen 8090;
server_name www.liujun.com;
location / {
# 2.把所有对 www.liujun.com:8090 的请求转发到 https://news-at.zhihu.com
proxy_pass https://news-at.zhihu.com;
# 3.其它配置
proxy_redirect off; # off使 location 或者 refresh 字段维持不变
# 默认情况下反向代理是不会转发请求中的 Host 头部的。如果需要转发,那么必须加上下面的配置
proxy_set_header Host $proxy_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
浏览器访问:http://www.liujun.com:8090/api/4/news/latest 反向代理后变成请求 https://news-at.zhihu.com/api/4/news/latest,最终获取到结果.
地址栏没有变还是http://www.liujun.com:8090/api/4/news/latest
代理同一台服务器的同一个端口
# 修改配置文件需要重启服务器
user liujun liu;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
keepalive_timeout 65;
# 1.创建虚拟主机(主机名称为:www.liujun.com)
server {
listen 8090;
server_name www.liujun.com;
location / {
# 2.把所有对 www.liujun.com:8090 的请求转发到 www.new.liujun.com:8090
proxy_pass http://www.new.liujun.com:8090;
# 3.其它配置
proxy_redirect off; # off使 location 或者 refresh 字段维持不变
# 默认情况下反向代理是不会转发请求中的 Host 头部的。如果需要转发,那么必须加上下面的配置
# 参考文章:https://blog.csdn.net/felix_yujing/article/details/51682655
proxy_set_header Host $proxy_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
# 2.创建第二个虚拟主机(虚拟主机名称为:www.new.liujun.com)
server {
listen 8090;
server_name www.new.liujun.com; # 本地测试要在hosts中添加对 www.new.liujun.com 的解析
location / {
root /usr/local/var/www/webapps/new; # (new项目中只有一个index.html)
index index.html index.htm;
}
}
}
浏览器访问:http://www.liujun.com:8090/ 显示的是new项目的网页
地址栏没有变还是http://www.liujun.com:8090/
2.配置动静态资源的分离
1.动态资源 :api接口 、文件 、压缩包 、软件 、 .jsp 、.php 、.shtml 、.ejs 等等
2.静态资源:html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css
# 修改配置文件需要重启服务器
user liujun liu;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
keepalive_timeout 65;
# 创建虚拟主机(主机名称为:www.liujun.com)
server {
listen 8090;
server_name www.liujun.com;
# 1.动态资源的加载。
location / {
# 把所有对 www.liujun.com:8090 的动态资源的请求转发到 https://news-at.zhihu.com
proxy_pass https://news-at.zhihu.com;
# 其它配置
proxy_redirect off;
proxy_set_header Host $proxy_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# 2.静态资源的加载。匹配以.html 、.htm 、.gif、.jpg、.jpeg结尾的请求
# ( ~ 表示匹配 URI 时是字母大小写敏感的; ~* 大小写不敏感; \. 是转译.)
location ~* \.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ {
root /usr/local/var/www/webapps/new; # (new项目中只有一个index.html)
# expires定义用户浏览器缓存的时间为3天,如静态页不常更新,可以设更长
expires 30d;
}
}
}
上面两个 location 配置快是并列关系
1)浏览器访问:http://www.liujun.com:8090 反向代理到:https://news-at.zhihu.com 这个网站( 地址栏不变 )
2)浏览器访问:http://www.liujun.com:8090/api/4/news/latest 反向代理到 :https://news-at.zhihu.com/api/4/news/latest 这个api 接口
3)浏览器访问:http://www.liujun.com:8090/index.html 直接获取本地的服务器 /usr/local/var/www/webapps/new;
路径下的静态资源。
2.Nginx 负载均衡
由于 Nginx 具有“强悍”的高并发高负载能力,因此一般会作为前端的服务器直接向客户端提供静态文件服务。但也有一些复杂、多变的业务不适合放到 Nginx 服务器上,这时会用Apache、Tomcat 等服务器来处理。于是Nginx 通常会被配置为既是静态 Web 服务器也是反向代理服务器,不适合 Nginx 处理的请求就会直接转发到上游服务器中处理。而upstream 块定义了一个上游服务器的集群,便于反向代理中的 proxy_pass 使用。
# 修改配置文件需要重启服务器
user liujun liu;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
keepalive_timeout 65;
#4.负载均衡配置。负载均衡是指选择一种策略,尽量把请求平均地分布到每一台上游服务器上
# weight: 设置向这台上游服务器转发的权重,默认为 1;
# max_fails: 与 fail_timeout 配合使用,在fail_timeout时间内检查max_fails次数,失败则剔除均衡
# fail_timeout: 表示该时间段内转发失败多少次后就认为上游服务器暂时不可用,用于优化反向代理功能
upstream backend_api_service{ # backend_api_service 是负载均衡的名称
server www.liujun.com:8888 weight=1 max_fails=2 fail_timeout=30s;
server www.liujun.com:9999 weight=1 max_fails=2 fail_timeout=30s;
}
# 1.创建虚拟主机(主机名称为:www.liujun.com)
server {
listen 8090;
server_name www.liujun.com;
location / {
# 4.把所有对 www.liujun.com:8090 动态资源的请求转发到 http://backend_api_service
proxy_pass http://backend_api_service; # backend_api_service 是负载均衡的名称
# 5.其它配置
# 如果后端的服务器返回502,504执行超时等错误,自动将请求转发到upstream负载均衡池
# 中的另一台服务器,实现故障转移
proxy_next_upstream http_502 http_504 error timeout invalid_header;
}
location ~* \.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ {
root /usr/local/var/www/webapps/blog; # (blog项目中只有一个index.html)
expires 30d;
}
}
# 2.创建虚拟主机(主机名称为:www.liujun.com)
server {
listen 8888;
server_name www.liujun.com;
location / {
root /usr/local/var/www/webapps/new; # 2.修改发布项目的目录
index index.html index.htm;
}
}
# 3.创建虚拟主机(主机名称为:www.liujun.com)
server {
listen 9999;
server_name www.liujun.com;
location / {
root /usr/local/var/www/webapps/music; # 2.修改发布项目的目录
index index.html index.htm;
}
}
}
1)浏览器访问:http://www.liujun.com:8090/index.html 访问的blog项目
2)浏览器访问:http://www.liujun.com:8090 访问的是new 项目 或者 是music项目
真实环境中负载均衡
backend_api_service
里面配的都是同一个项目发布在不同的服务器上
3.Nginx 的性能优化
1.全局的配置的优化
user liujun liu;
# 1.Nginx worker 进程个数 (启动进程数,通常和cpu的数量相等)
worker_processes 8;
# 2.绑定 Nginx worker 进程到指定的 CPU 内核。( 为每个进程分配cpu,上例将8个进程分配到8个cpu,
# 当然可以写多个,或者将一个进程分配到多个cpu )
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
#3.*指定 Nginx worker 进程可以打开的最大句柄描述符个数。( 指当一个nginx进程打开的最多文件描述数目,
# 理论应该是最多打开文件数 ulimit -n 与 nginx进程数相除,但是nginx分配请求并不是那么均匀,
# 所以最好以ulimit -n的值保持一致 )
worker_rlimit_nofile 102400;
# 4.全局error 日志的设置(语法:error_log /path/file level;)
# 错误等级level[ debug | info | notice | warn | error | crit ]
# error_log logs/error.log; # 这种写法nginx启动失败,要编写全路径,并且该文件要存在(如下写法)
error_log /usr/local/etc/nginx/logs/error.log error;
error_log /usr/local/etc/nginx/logs/error.log info;
# 5.pid 文件的路径( 保存 master 进程 ID 的 pid 文件存放路径,例如:/usr/local/nginx/nginx.pid )
pid /usr/local/etc/nginx/logs/nginx.pid; # 要编写全路径,并且该文件要存在
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
keepalive_timeout 65;
server {
listen 8090;
server_name localhost;
location / {
root /usr/local/var/www/webapps/blog; # 2.修改发布项目的目录
index index.html index.htm;
}
}
}
2.event 配置块的优化
user liujun liu;
worker_processes 1;
events {
# 1.选择事件模型(epoll是多路复用io中的一种方式,但是 仅用linux2.0 以上的内核。
# 可以处理大并发连接,大大提高nginx的性能)
# use epoll;
# 2.每个 worker 的最大连接数( 单个后台worker process进程的最大并发链接数:最大连接=连接数*进程数 )
worker_connections 102400;
# 3.批量建立新连接 (尽可能多的接受请求)
multi_accept on;
}
http {
include mime.types;
default_type application/octet-stream;
keepalive_timeout 65;
server {
listen 8090;
server_name localhost;
location / {
root /usr/local/var/www/webapps/blog; # 2.修改发布项目的目录
index index.html index.htm;
}
}
}
3.http配置块的优化(一)
user liujun liu;
worker_processes 1;
events {
worker_connections 1024;
}
http {
# 1.设定mime类型,类型由/usr/local/etc/nginx/mime.types文件定义
include mime.types;
# 2.当找不到相应的 MIME type 与文件扩展名之间的映射时,
# 使用默认的 MIME type 作为HTTP header 中的 Content-Type
# ( 默认的数据流:octet-stream是下载数据流)
default_type application/octet-stream;
# 3.keepalive 超时时间( 默认 keepalive_timeout 75; 秒 )
# 客户端到服务器端的连接持续有效时间。当出现对服务器请求之后,继续请求,它可避免建立或者重新建立连接,提高性能
keepalive_timeout 65;
# 4.定义日志格式。可以使用负载均衡功能提供的变量( log_format 要与 access_log 一同使用 )
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# 5.将负载均衡时的一些信息记录到 access_log 日志中(配置http访问日志的保存路径)
access_log /usr/local/etc/nginx/logs/access.log main; # 注意:access.log文件要存在
server {
listen 9090;
server_name localhost;
location / {
root /usr/local/var/www/webapps/blog; # 2.修改发布项目的目录
index index.html index.htm;
}
}
}
4.http配置块的优化(二)
http://nginx.org/en/docs/http/ngx_http_core_module.html
user liujun liu;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
keepalive_timeout 65;
# 1.指定nginx是否调用sendfile函数(zero copy方式)来输出文件,对于普通的应用必须为on
# 如果用来进行下载等应用磁盘IO负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的uptime
sendfile on;
# 2.在打开 sendfile 选项时,确定是否开启 FreeBSD 系统上的 TCP_NOPUSH 或 Linux 系统上
# 的 TCP_CORK 功能。打开 tcp_nopush 后,将会在发送响应时把整个响应包头放到一个 TCP 包中发送
# ( 防止网络阻塞 )
tcp_nopush on;
# 3.开始目录列表访问,适合下载服务器(例如:镜像下载网站),默认关闭
autoindex on;
# 4.提高数据的实时响应性
tcp_nodelay on;
# 5.打开文件缓存( 这个将为打开文件制定缓存,默认是没有启用的,max制定缓存数量,建议和打开文件数一致
# , inactive 是指经过多长时间文件没有被请求后删除缓存。)
open_file_cache max=102400 inactive=20s;
# 6.检验缓存中元素有效性的频率, 默认60s( 这个是指定多长时间检查一次缓存有效信息 )
open_file_cache_valid 30s;
# 7.不被淘汰的最小访问次数( open_file_cache指令中的inactive参数时间内文件的最少使用次数,如果
# 超过这个数字,文件描述符一直是在缓存中打开的)
open_file_cache_min_uses 1;
server {
listen 9090;
server_name localhost;
location / {
root /usr/local/var/www/webapps/blog; # 2.修改发布项目的目录
index index.html index.htm;
}
}
}
5.http配置块的优化(三)
http://nginx.org/en/docs/http/ngx_http_gzip_module.html
user liujun liu;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
keepalive_timeout 65;
# 1.启动gzip压缩( 可以对css , js, image静态资源压缩)
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
# 2.压缩级别大小,最大为9,最小为1,压缩后比例越小越好,cpu处理更快(例如下面:100k-> 80k)
# 设值的值越大,消耗cpu比较高(例如设置 9 :100k-> 10k )
gzip_comp_level 2;
server {
listen 9090;
server_name localhost;
location / {
root /usr/local/var/www/webapps/new; # 2.修改发布项目的目录
index index.html index.htm;
}
}
}
6.http配置块的优化(四)
http://nginx.org/en/docs/http/ngx_http_core_module.html
user liujun liu;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
keepalive_timeout 65;
# 1.HTTP 请求包体的最大值。允许客户端请求的最大单个文件字节数(php后端用的多)
client_max_body_size 10m;
# 2.存储 HTTP 包体的内存 buffer 大小( 缓存区代理缓冲用户端请求的最大字节数 )
client_body_buffer_size 128k;
# 3.存储超大 HTTP 头部的内存 buffer 大小(设定请求缓冲)
large_client_header_buffers 4 4k;
# 4.存储 HTTP 头部的内存 buffer 大小
# 客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一般一个请求的头部大小不会超过1k
# 不过由于一般系统分页都要大于1k, 所以这里设置分页大小为4k
client_header_buffer_size 4k;
server {
listen 9090;
server_name localhost;
location / {
root /usr/local/var/www/webapps/new; # 2.修改发布项目的目录
index index.html index.htm;
}
}
}
7.http配置块的优化(五)
http://nginx.org/en/docs/http/ngx_http_proxy_module.html
user liujun liu;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
keepalive_timeout 65;
# 1.nginx跟后端服务器连接超时时间( 代理连接超时 )
proxy_connect_timeout 90;
# 2.后端服务器数据回传时间(代理发送超时)
proxy_send_timeout 90;
# 3.连接成功后,后端服务器响应时间(代理接受超时)
proxy_read_timeout 90;
# 4.设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffer_size 4k;
# 5.proxy_buffers 缓冲区,网页平均在32k一下的话,着用设置
proxy_buffers 4 32k;
# 6.高负荷下缓冲大小( 一般等于=proxy_buffer * 2 )
proxy_busy_buffers_size 64k;
server {
listen 9090;
server_name localhost;
location / {
root /usr/local/var/www/webapps/new; # 2.修改发布项目的目录
index index.html index.htm;
}
}
}
7.server配置块的优化
http://nginx.org/en/docs/http/ngx_http_core_module.html
user liujun liu;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
keepalive_timeout 65;
server {
listen 9090;
server_name localhost;
# 1.使用的字符集
#charset koi8-r;
location / {
root /usr/local/var/www/webapps/new; # 2.修改发布项目的目录
index index.html index.htm;
}
# 2.错误码404跳转的页面
error_page 404 /404.html;
# 3.定义错误提示页面(错误码404跳转的页面)
error_page 500 502 503 504 /50x.html;
location = /50x.html {
# 5.只有当用户请求是 /50x.html 时,才会使用该 location 下的配置
root html;
}
# 6.设定查看Nginx状态的地址:http://localhost:9090/NginxStatus
location /NginxStatus {
stub_status on;
}
}
}