Nginx 极简教程,常用场景统统解析( 三 )

IP Hashupstream bck_testing_01 {ip_hash;# with default weight for all (weight=1)server 192.168.250.220:8080server 192.168.250.221:8080server 192.168.250.222:8080}普通 Hashupstream bck_testing_01 {hash $request_uri;# with default weight for all (weight=1)server 192.168.250.220:8080server 192.168.250.221:8080server 192.168.250.222:8080}网站有多个 webapp 的配置当一个网站功能越来越丰富时 , 往往需要将一些功能相对独立的模块剥离出来 , 独立维护 。这样的话 , 通常 , 会有多个 webapp 。
举个例子:假如 www.helloworld.com 站点有好几个 webapp , finance(金融)、product(产品)、admin(用户中心) 。访问这些应用的方式通过上下文(context)来进行区分:
www.helloworld.com/finance/
www.helloworld.com/product/
www.helloworld.com/admin/
我们知道 , http 的默认端口号是 80 , 如果在一台服务器上同时启动这 3 个 webapp 应用 , 都用 80 端口 , 肯定是不成的 。所以 , 这三个应用需要分别绑定不同的端口号 。
那么 , 问题来了 , 用户在实际访问 www.helloworld.com 站点时 , 访问不同 webapp , 总不会还带着对应的端口号去访问吧 。所以 , 你再次需要用到反向代理来做处理 。
配置也不难 , 来看看怎么做吧:
http { #此处省略一些基本配置 upstream product_server{server www.helloworld.com:8081; } upstream admin_server{server www.helloworld.com:8082; } upstream finance_server{server www.helloworld.com:8083; } server {#此处省略一些基本配置#默认指向product的serverlocation / {proxy_pass http://product_server;}location /product/{proxy_pass http://product_server;}location /admin/ {proxy_pass http://admin_server;}location /finance/ {proxy_pass http://finance_server;} }}静态站点有时候 , 我们需要配置静态站点(即 html 文件和一堆静态资源) 。
举例来说:如果所有的静态资源都放在了 /app/dist 目录下 , 我们只需要在 nginx.conf 中指定首页以及这个站点的 host 即可 。
配置如下:
worker_processes1;events { worker_connections1024;}http {includemime.types;default_typeapplication/octet-stream;sendfileon;keepalive_timeout65;gzip on;gzip_types text/plain application/x-JavaScript text/css application/xml text/javascript application/javascript image/jpeg image/gif image/png;gzip_vary on;server {listen80;server_namestatic.zp.cn;location / {root /app/dist;index index.html;#转发任何请求到 index.html} }}然后 , 添加 HOST:
127.0.0.1 static.zp.cn
此时 , 在本地浏览器访问 static.zp.cn  , 就可以访问静态站点了 。
搭建文件服务器有时候 , 团队需要归档一些数据或资料 , 那么文件服务器必不可少 。使用 Nginx 可以非常快速便捷的搭建一个简易的文件服务 。
Nginx 中的配置要点:
将 autoindex 开启可以显示目录 , 默认不开启 。
将 autoindex_exact_size 开启可以显示文件的大小 。
将 autoindex_localtime 开启可以显示文件的修改时间 。
root 用来设置开放为文件服务的根路径 。
charset 设置为 charset utf-8,gbk; , 可以避免中文乱码问题(windows 服务器下设置后 , 依然乱码 , 本人暂时没有找到解决方法) 。一个最简化的配置如下:
autoindex on;# 显示目录autoindex_exact_size on;# 显示文件大小autoindex_localtime on;# 显示文件时间server {charsetutf-8,gbk; # windows 服务器下设置后 , 依然乱码 , 暂时无解listen9050 default_server;listen[::]:9050 default_server;server_name_;root/share/fs;}解决跨域web 领域开发中 , 经常采用前后端分离模式 。这种模式下 , 前端和后端分别是独立的 web 应用程序 , 例如:后端是 Java 程序 , 前端是 React 或 Vue 应用 。
各自独立的 web app 在互相访问时 , 势必存在跨域问题 。解决跨域问题一般有两种思路:
1.CORS在后端服务器设置 HTTP 响应头 , 把你需要允许访问的域名加入 Access-Control-Allow-Origin 中 。
2.jsonp把后端根据请求 , 构造 json 数据 , 并返回 , 前端用 jsonp 跨域 。
这两种思路 , 本文不展开讨论 。
需要说明的是 , nginx 根据第一种思路 , 也提供了一种解决跨域的解决方案 。
举例:www.helloworld.com 网站是由一个前端 app  , 一个后端 app 组成的 。前端端口号为 9000 ,  后端端口号为 8080 。


推荐阅读