nginx静态资源配置
本文参考:https://blog.csdn.net/hzsunshine/article/details/63687054
一、准备工作
1、nginx配置文件
Nginx文件查找:sudo nginx -t
找到配置文件nginx.conf所在目录,进入目录
进入文件:vi nginx.conf
修改文件:先按insert,修改完后按esc,输入“:wq”(保存退出),不保存退出(“:q”)
nginx重启:service nginx restart
如果重启出现:nginx: [emerg] invalid parameter "server" in /etc/nginx/nginx.conf:37
nginx: configuration file /etc/nginx/nginx.conf test failed
表示配置文件第37行有错误,返回检查修改。
2、配置文件目录结构
见文首链接,如果新手实际操作,一定要打开这个链接进行对照思考。
3、情景设置
有两台服务器A、B,有4个应用分别是一个前端资源a,一个消息系统b,两个相同的应用c1、c2。
现在考虑a、b应用性能消耗很小,部署情况是A(a、b、c1),B(c2)。目标是实现同一入口访问,计划用nginx实现对a的静态资源部署,对b的反向代理,对c1、c2进行负载均衡配置。
二、框架结构设计
使用nginx在A上搭建3台虚拟主机x,y,z,x做总调度+负载均衡(c1、c2),y做a静态资源部署,z做b消息系统部署。
对公共参数部分我们不做任何修改。
初始状态下,http内部应该已经存在一个server,默认监听80端口。我们暂时不去动它,后面做负载均衡把它改造成一个总调度。
server { }
|
1、静态资源设置
在http内部新建一个server,与默认的server同级,内容如下,分别设置html页面和其他静态资源的路径。
注意:如果网页显示不出来,那一定是路径的问题。
#虚拟主机2——静态资源
|
2、反向代理
反向代理的作用是可以实现请求转发,负载均衡也是在这个基础上实现的。这里为了作为区分,把反向代理认为是两台主机之间固定的连接通信,用户请求到达A,被虚拟主机x接受,然后转发y处理。同样是新建一个server并配置。
#虚拟主机3——消息系统
|
3、负载均衡
剩下应用c1、c2做负载均衡。首先需要在http内部做一个upstream的服务器池,把c1、c2所在服务器配置进去。
#负载均衡池
|
接下来把负载均衡配置进server1,顺便把它改造成总调度。请求转发依靠资源路径匹配(location),它对配置的顺序有要求。思路是按照静态资源配置、特殊动态资源配置、通用动态资源配置的顺序,虚拟主机收到请求后按照上述顺序对资源进行转发。因此我们将配置如下:先配置静态资源a,然后配置消息系统b,最后配置c1、c2并做负载均衡配置。
#虚拟主机1——总调度 server { listen 8079; server_name localhost_1; #调度对象1:虚拟主机2——静态资源 location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ { proxy_pass http://localhost:8081; } #调度对象2:虚拟主机3——消息系统 location /highway/ { proxy_pass http://localhost:8082; } #调度对象3——负载均衡 location / { proxy_pass http://serverPool; # 后端的Web服务器可以通过X-Forwarded-For获取用户真实IP # proxy_set_header Host $host; # proxy_set_header X-Real-IP $remote_addr; # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
} } |
三、总结
nginx的http是http服务器,server是虚拟主机,可以在http中配置多个server监听不同的端口。Server内部的location是资源路径匹配,可以把磁盘资源和服务器资源无差别对待,只不过内部一个用root表示,一个用proxy_pass表示。一个server中如果有多个资源,应该按照后缀匹配、特殊匹配和其余匹配的顺序进行配置。
本文算是对nginx几大功能的一个实践性配置,关于性能的更多配置还需要请教有经验的人和自己摸索。
完整配置:
#全局配置
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
#http服务器
http {
include /etc/nginx/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 /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
#负载均衡服务器池
upstream serverPool {
server 47.93.232.XXX:8080 weight=1;
server 123.207.231.XXX:8081 weight=5 max_fails=2 fail_timeout=30s ;
}
#虚拟主机1——总调度
server {
listen 8079;
server_name localhost_1;
#调度对象1:虚拟主机2——静态资源
location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$
{
proxy_pass http://localhost:8081;
}
#调度对象2:虚拟主机3——消息系统
location /highway/
{
proxy_pass http://localhost:8082;
}
#调度对象3——负载均衡
location / {
proxy_pass http://serverPool;
# 后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
# proxy_set_header Host $host;
# proxy_set_header X-Real-IP $remote_addr;
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
}
}
#虚拟主机2——静态资源
server {
listen 8081;
server_name localhost_2;
# 配置Nginx动静分离(html)
location ~ .*\.(html|htm)$
{
root /etc/staticSource/resources/templates/;
}
# 配置Nginx动静分离(static)
location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)$
{
root /etc/staticSource/resources/;
}
# 配置Nginx动静分离(缓存)
location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)$
{
root /etc/staticSource/resources/;
#expires定义用户浏览器缓存的时间为7天,如果静态页面不常更新,可以设置更长,这样可以节省带宽和缓解服务器的压力
expires 7d;
}
}
#虚拟主机3——消息系统
server {
listen 8082;
server_name localhost_3;
location / {
proxy_pass http://localhost:8083;
# proxy_redirect off;
# # 后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
# proxy_set_header Host $host;
# proxy_set_header X-Real-IP $remote_addr;
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
}
}
}