目前主流的web服务5大神器 Nginx、Apache、Tomcat、Jetty、iis
今天讲一下nginx的常规操作,剩下几个后续再讲。
一、负载均衡(正反代理)
有nginx的服务架构,通常nginx放在最外层接受入口流量,既我们说的正向代理。
nginx一般代理的都是 静态资源、tomcat、apache、jetty、iis等,当然 这个顺序不是绝对的,这里面有些组件功能也比较强,也能承担nginx的部分工作。
1、正向代理
当你访问 www.baidu.com 时,其实是要请求到baidu服务器的www资源,好比你知道一个人电话号码,打这个号码就可以找到号码持有者一样,这就是一个正向过程。
通常我们的正向代理配置是这样的:
server
{
listen 80;
server_name 你的dns或者ip(www.badiu.com 或 公网ip);
location / {
proxy_pass http://localhost:8080/;
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Accept-Encoding '';
proxy_cache_valid any 1m;
client_max_body_size 100m;
client_body_buffer_size 128k;
}
error_page 500 502 503 504 /50x.html;
}
访问 server_name的地址时会经过dns解析到服务器 nginx监听80端口请求获得请求信息,进行location声明资源处理,正向代理完成。 这里有很多方式可以配置,比如 请求的路径过滤,跨域(带请求头、cookie转发等等)可以自行去查阅nginx文档
正向代理完成后,如果出现多个服务都是需要被这个请求代理的就很尴尬了,而且只配置一个服务,当这个localhost:8080服务挂了之后,这个请求就会变成502,于是需要有反向代理来完善
2、反向代理
#======java服务代理
upstream java {
server localhost:8890;
server localhost:8990;
}
server
{
listen 80;
server_name 你的dns或者ip(www.badiu.com 或 公网ip);
location / {
proxy_pass http://java/;
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Accept-Encoding '';
proxy_cache_valid any 1m;
client_max_body_size 100m;
client_body_buffer_size 128k;
}
error_page 500 502 503 504 /50x.html;
}
总共有2处不同,第一处在原来的配置上修改了localtion 中的 proxy_pass参数;第二处增加了代理服务器声明
upstream 中有几个需要注意的地方:
1、upstream 后面跟着的名称要和localtion 中的 proxy_pass 对应。
2、每个 server 可以增加负载策略,常用的有权重分配和轮询,有很多扩展,可以自行查阅nginx文档。
3、每个server 后面的ip地址 可以是域名,可以是ip ,但是免费版的nginx不支持动态dns。如何理解动态的dns,比如 www.test.com ip解析为 123.123.123.123 当 www.test.com的a记录指向变成了其他ip了之后 nginx不会更新这个ip,而是在启动的时候会进行一次解析然后自身存储起来。商业版的有很多强大的功能,也包括动态dns解析的能力。要解决免费版nginx的动态dns问题有2个方案:a:选择时段手动重启nginx b:写一个脚本去轮询这个动态dns,发现指向ip变更后自动重启nginx
二、代理静态资源
server
{
listen 80;
server_name 你的dns或者ip(www.badiu.com 或 公网ip);
location /images {
root /data;
autoindex on;
}
error_page 500 502 503 504 /50x.html;
}
假设在系统盘/data下有一个文件 test.jpg
当你请求 http://${server_name}/images/test.jpg 时 会直接把这个test.jpg给你展现到当前页面,当然也可以下载它
三、https ssl证书
server
{
listen 443;
server_name 你的dns或者ip(www.badiu.com 或 公网ip);
ssl on;
ssl_certificate cert.pem;
ssl_certificate_key cert.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://disk/;
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Accept-Encoding '';
proxy_cache_valid any 1m;
client_max_body_size 100m;
client_body_buffer_size 128k;
}
error_page 500 502 503 504 /50x.html;
}
证书制作有很多方式,可以申请阿里云免费证书,可以自己制作证书。
千万要记住 nginx配置文件下 listen和server_name两个的配置不要一样