目录
1、nginx是什么
nginx是一个使用c语言开发的高性能http服务器及反向代理服务器
2、nginx能做什么
2.1、网页静态服务器
2.1.1 使用nginx解决浏览器本地缓存
1、什么是浏览器缓存
简单来说,浏览器缓存就是把一个已经请求过的Web资源(如html页面,图片,js,数据等)拷贝一份副本储存在浏览器中。缓存会根据进来的请求保存输出内容的副本。当下一个请求来到的时候,如果是相同的URL,缓存会根据缓存机制决定是直接使用副本响应访问请求,还是向源服务器再次发送请求。比较常见的就是浏览器会缓存访问过网站的网页,当再次访问这个URL地址的时候,如果网页没有更新,就不会再次下载网页,而是直接使用本地缓存的网页。只有当网站明确标识资源已经更新,浏览器才会再次下载网页。
2、 为什么使用缓存:
(1)减少网络带宽消耗
(2)降低服务器压力
(3)减少网络延迟,加快页面打开速度
浏览器端的缓存规则:
新鲜度(过期机制):也就是缓存副本有效期。
校验值(验证机制):资源的实体标签Etag(EntityTag)
在HTTP请求和响应的消息报头中,常见的与缓存有关的消息报头有:
3、 nginx.conf配置
server {
listen 80;
server_name XXXXXX;
client_max_body_size 80M;
location / {
root /usr/local/src/web/test;
index index.html index.htm;
##缓存配置
add_header Cache-Control no-cache;
add_header Pragma no-cache;
add_header Expires 0;
}
location /test1 {
proxy_pass http://ip:8081;
}
location /test2 {
proxy_pass http://ip:80;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
2.2、反向代理、负载均衡
2.2.1 使用反向代理解决跨域问题
1、 什么是跨域
跨域,指的是浏览器不能执行其他网站的脚本或者访问服务端。它是由浏览器的同源(域名,协议,端口)策略造成的,是浏览器对JavaScript施加的安全限制。
2、为什么会产生跨域
当前端调用第三方网页或者服务端所用(协议+域名+端口)与前端页面调用不一致时,就会出现跨域问题。
- 浏览器先根据同源策略对前端页面和后台交互地址做匹配,若同源,则直接发送数据请求;若不同源,则发送跨域请求。
- 服务器解析程序收到浏览器跨域请求后,根据自身配置返回对应文件头。若未配置过任何允许跨域,则文件头里不包含
Access-Control-Allow-origin
字段,若配置过域名,则返回Access-Control-Allow-origin
+对应配置规则里的域名的方式
。 - 浏览器根据接受到的http文件头里的
Access-Control-Allow-origin
字段做匹配,若无该字段,说明不允许跨域;若有该字段,则对字段内容和当前域名做比对,如果同源,则说明可以跨域,浏览器发送该请求;若不同源,则说明该域名不可跨域,不发送请求
3、什么是同源策略
1、同源策略/SOP(Same origin policy)是一种约定,由Netscape公司1995年引入浏览器,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到XSS、CSFR等攻击。
2、所谓同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个ip地址,也非同源。
3、同源策略限制以下几种行为:
(1)Cookie、LocalStorage 和 IndexDB 无法读取
(2)DOM 和 Js对象无法获得
(3)AJAX 请求不能发送
2.3、虚拟主机
3、使用docker安装nginx
1. 拉取nginx镜像
$ docker pull nginx
2. 启动容器
$ netstat -lnt | grep 8082
$ docker run -it --name nginx-test --restart=always -p 8082:80 -d nginx
3. 创建挂载文件目录
$ mkdir -p /usr/local/docker/nginx/{html,conf,logs,conf.d}
#html: nginx存储网站网页的目录
#logs: nginx日志目录
#conf: nginx配置文件目录
4. 给conf挂载目录中拷贝一份配置文件,html下放置index.html文件
$ docker cp nginx-test:/etc/nginx/nginx.conf /usr/local/docker/nginx/conf/
$ docker cp nginx-test:/usr/share/nginx/html/index.html /usr/local/docker/nginx/html/
4. 挂载目录
$ docker run -it -p 80:80 --name nginx-web \
> -v /usr/local/docker/nginx/logs:/var/log/nginx \
> -v /usr/local/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
> -v /usr/local/docker/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf \
> -v /usr/local/docker/nginx/html:/usr/share/nginx/html \
> --restart=always \
>--privileged=true \
> -d nginx
5. 修改宿主机中的nginx.conf,并没有实时同步到容器中,解决办法为修改文件后重启容器
$ docker restart nginx-web
4、修改配置文件
4.1 修改主配置nginx.conf文件
1. 文件路径
/etc/nginx/nginx.conf
2. 文件内容说明
-- 全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
user nginx; #运行用户,默认即是nginx,可以不进行设置
worker_processes 4; #Nginx进程,一般设置为和CPU核数一样
error_log /var/log/nginx/error.log warn; #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
#进程pid存放位置
pid /var/run/nginx.pid;
-- events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
events {
accept_mutex on; #设置网路连接序列化,防止惊群现象发生,默认为on
multi_accept on; #设置一个进程是否同时接受多个网络连接,默认为off
#use epoll; #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
worker_connections 1024; #最大连接数,默认为512
}
-- http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
http {
include mime.types; #文件扩展名与文件类型映射表
default_type application/octet-stream; #默认文件类型,默认为text/plain
#access_log off; #取消服务日志
#设置日志模式
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; #nginx访问日志存放位置
sendfile on; #开启高效传输模式
#tcp_nopush on; #减少网络报文段的数量
sendfile_max_chunk 100k; #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
keepalive_timeout 65; #保持连接的时间,也叫超时时间,默认为75s,可以在http,server,location块。
#gzip on; #开启gzip压缩
error_page 404 https://www.baidu.com; #错误页
proxy_intercept_errors on; #如果被代理服务器返回的状态码为400或者大于400,设置的error_page配置起作用。默认为off。
#proxy_method get; #支持客户端的请求方法。post/get;
include /etc/nginx/conf.d/*.conf; #包含的子配置项位置和文件
upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333 backup; #热备
}
}
#惊群现象:一个网路连接到来,多个睡眠的进程被同时叫醒,但只有一个进程能获得链接,这样会影响系统性能。
#每个指令必须有分号结束。
4.2 修改从配置default.conf文件
-- server块:配置虚拟主机的相关参数,一个http中可以有多个server。
server {
listen 80; //监听端口为80,可以自定义其他端口,也可以加上IP地址,如:listen 127.0.0.1:8080;
server_name localhost; //定义网站域名,可以写多个,用空格分隔。
#charset koi8-r; //定义网站的字符集,一般不设置,而是在网页代码中设置。
#access_log logs/host.access.log main; //定义访问日志,可以针对每一个server(即每一个站点)设置它们自己的访问日志。
-- location块:配置请求的路由,以及各种页面的处理情况。
location / {
root /usr/share/nginx/html; //静态文件根目录,目录可以是相对路径也可以是绝对路径。
index index.html index.htm; //首页的索引文件(站点的默认页)
}
#error_page 404 /404.html; //指定错误页面
# redirect server error pages to the static page /50x.html
# 把后台错误重定向到静态的50x.html页面,当状态码为500、502、503、504时,则访问50x.html
error_page 500 502 503 504 /50x.html;
当路径是/50x.html去找/usr/share/nginx/html里面的文件
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
如果访问的是.php结尾会把请求转发给http://127.0.0.1;
# 代理PHP脚本到80端口上的apache服务器
值Apache服务器
#location ~ \.php$ {
# proxy_pass http://127.0.0.1; //proxy_pass后面指定要访问的url链接,用proxy_pass实现代理。
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
# 把PHP脚本9000端口上监听的FastCGI服务
执行时PHP服务器
如果访问的是.php结尾会把请求转发给127.0.0.1:9000;
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000; /定义FastCGI服务器监听端口与地址,支持两种形式,1 IP:Port, 2 unix:/path/to/sockt
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; //定义SCRIPT_FILENAME变量,后面的路径/scripts为上面的root指定的目录
# include fastcgi_params; //引用prefix/conf/fastcgi_params文件,该文件定义了fastcgi相关的变量
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#allow:允许ip访问
#deny:禁止ip访问
#all:所有ip
# 不允许访问.htaccess文件
#location ~ /\.ht { //访问的url中,以/.ht开头的,如,www.example.com/.htaccess,会被拒绝,返回403状态码。
# deny all; //禁止所以人访问
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000; //监听8000端口
# listen somename:8080; //指定ip:port
# server_name somename alias another.alias; //指定多个server_name
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl; //监听443端口,即ssl
# server_name localhost;
### 以下为ssl相关配置
# ssl_certificate cert.pem; //指定pem文件路径
# ssl_certificate_key cert.key; //指定key文件路径
# ssl_session_cache shared:SSL:1m; //指定session cache大小
# ssl_session_timeout 5m; //指定session超时时间
# ssl_protocols TLSv1 TLSv1.1 TLSv1.2; //指定ssl协议
# ssl_ciphers HIGH:!aNULL:!MD5; //指定ssl算法
# ssl_prefer_server_ciphers on; //优先采取服务器算法
# location / {
# root html;
# index index.html index.htm;
# }
#}
4.3 负载均衡