赞
踩
点击下载nginx+tomcat资源包,并在当前windows系统的host文件中进行配置
127.0.0.1 www.vitamin.com
182.92.187.217 blog.csdn.net
配置tomcat执行环境,并修改资源包nginx中conf/nginx.conf的自己的server_name
高级系统设置-环境变量- 系统变量
新建
TOMCAT_HOME
=D:\apache-tomcat-8.5.69
(我的目录)
新建CATALINA_HOME
=D:\apache-tomcat-8.5.69
(我的目录)
新增Path
=;%TOMCAT_HOME%\bin;%CATALINA_HOME%\lib
环境配置后,在windows的doc窗口通过tomcat启动指令startup
。启动成功【关闭进程服务可在任务管理器中操作】
#启动tomcat
C:\Users\Administrator>startup
验证,chrom地址栏输入www.vitamin.com/kotlin/
,查看到服务启动成功后的网页~
然后通过nginx指令start nginx
启动,启动成功【关闭进程服务可在任务管理器中操作】
#启动nginx
C:\Users\Administrator>start nginx
#终止nginx
C:\Users\Administrator>nginx -s stop
测试Nginx配置的反向代理是否正常,输入server_name+端口号+匹配字符串
验证。
#访问地址
http://192.168.1.106:8091/kotlin/index.html
代码验证ok,下面为Nginx下nginx.conf文件中的代码配置
#nginx.conf 配置 #user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { include 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 logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; server { listen 8091; server_name 192.168.1.105;#当前台式机ip charset utf-8; #access_log logs/host.access.log main; #入口文件的设置 location ^~ /nginx-1.12.2/html/index.html { root C:/Users/Administrator/Desktop; #入口文件的所在目录 index index.html index.htm; #默认入口文件名称 } location ^~ / { root html; #入口文件的所在目录 index index.html index.htm; #默认入口文件名称 } location /index.html { root html; #入口文件的所在目录 index index.html index.htm; #默认入口文件名称 } location = /segment/ { root html; #入口文件的所在目录 index index.html index.htm; #默认入口文件名称 } location = /websocket/ { proxy_pass http://www.vitamin.com:8090; } location = /en/download.html { proxy_pass http://nginx.org; } location = /yao_hou { proxy_pass https://blog.csdn.net; } location = /kotlin/index.html { proxy_pass http://www.vitamin.com:8090; } ... ... ... ... ... ... }
在实际操作过程,遇到一下产生困惑与混乱的几点。这里予以分享:
1,匹配原则
2,访问Nginx服务下的本地资源 {location 匹配字段不能随意写,为什么?}
3,通过Nginx反向代理访问Tomcat下的本地资源 {location 匹配字段不能随意写,为什么?}
~
波浪线表示执行一个正则匹配,区分大小写;
~*
表示执行一个正则匹配,不区分大小写;
^~
表示普通字符匹配,如果该选项匹配,只匹配该选项,不匹配别的选项,一般用来匹配目录。
=
进行普通字符精确匹配;
@
定义一个命名的 location,使用在内部定向时,例如 error_page, try_files
location = / {
# 只匹配"/".
}
location / {
# 匹配任何请求,因为所有请求都是以"/"开始
# 但是更长字符匹配或者正则表达式匹配会优先匹配,比如后边的[location ~* .(gif|jpg|jpeg)$]
}
location ^~ /images/ {
# 匹配任何以 /images/ 开始的请求,并停止匹配。即使后面有http://ip/images/id这样的,前面匹配到就停止不会继续向后观望。
}
location ~* .(gif|jpg|jpeg)$ {
# 匹配以 gif, jpg, or jpeg结尾的请求.
# 但是所有 /images/ 目录的请求将由[location ^~ /images/]抢先执行
}
经过实践操作,通过启动本地Nginx使用反向代理来解决vue访问后台接口跨域问题是可以的。1,vue中配置的baseurl=本机ip或localhost+端口;2,Nginx的代理proxy_pass=后台接口的ip+端口。
经过实践操作,Nginx服务下目录静态资源若在服务已启动的清况下,进行资源更换。通过刷新可以依然实时访问更新或已修改的资源。
经过实践操作,nginx.conf文件内server_name若不是本机ip域名,那么就需要到host文件中进行登记。比如我用到的
182.92.187.217 blog.csdn.net
。否则无法执行就访问。
通过location匹配到且访问root下的资源。那么执行过程是这样的
以41行代码
为例,chrome输入http://192.168.1.105:8091/nginx-1.12.2/html/index.html
然后实际执行就会访问C:/Users/Administrator/Desktop/nginx-1.12.2/html/index.html
。具体如下图
location匹配字段不能随意书写,因为在访问本地资源时,访问的地址部分字段是由location的匹配字段所提供的。
访问Tomcat下的资源与Nginx比较相似。只是访问Tomcat时需要用到反向代理。以72行代码
为例,chrome输入http://192.168.1.105:8091/kotlin/index.html
然后实际执行就会访问http://www.vitamin.com:8090/kotlin/index.html
。location匹配字段不能随意书写,因为在执行反向代理访问Tomcat服务资源时,访问的地址部分字段是由location的匹配字段所提供的。
举例说明在这三种清况下,在Nginx服务下访问静态资源。寻找无法正确加载样式,导致页面布局杂乱的解决方案。
Nginx.conf
脚本代码的初始配置
#user nobody; worker_processes 1; error_log logs/error.log; error_log logs/error.log notice; error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { #include mime.types; #default_type text/plain; sendfile on; keepalive_timeout 65; server { listen 8091; server_name 192.168.1.106;#当前台式机ip charset utf-8; #入口1文件的设置 location ~ /acsweb/ { root html; #入口文件的所在目录 index index.html index.htm; #默认入口文件名称 } #入口2文件的设置 location ~ /webserver/ { root html; #入口文件的所在目录 index index.html index.htm; #默认入口文件名称 } #入口3文件的设置 location ~ /loc/ { root html; #入口文件的所在目录 index index.html index.htm; #默认入口文件名称 } } }
通过执行上面shell初始脚本代码Nginx.conf
,然后分别输入静态资源地址进行访问。三种目录下的访问结果一致,丑陋极了
而在vscode执行npm run build
打包生成的静态资源中执行index.html
效果,很舒服。
可以看出明显区别,就是我们在vue应用中写的样式 —— 丢了~
为什么呢? 查找问题原因~
首先找到本地静态资源样式文件
app.0d9c40d5.css
example.b13f845c.css
然后通过Chrome查看对应css文件的响应状态,及在Network/Headers/Response Headers下的 Content-Type
,会发现获取css资源ok的。但是Response Headers的Content-Type
对应value值为:text/plain
,显然是不对的。
说明即使我们在请求css样式时,请求到了样式内容(如上图)。但是响应给我们的报文内容并不是我们能够使用的内容格式。因此vue应用在被访问时,并不能正确加载使用样式。
Nginx如果不指定mime type,则默认会以text/plain的形式处理。因此浏览器以纯文本的形式来处理css和js文件,无法正常加载样式。
Nginx.conf
脚本代码(如下)的初始配置的18、19行脚本(已被注释掉)正验证了上面的结论!
http {
#include mime.types;
#default_type text/plain;
Nginx如果不指定mime type,则默认会以text/plain的形式处理。因此浏览器以纯文本的形式来处理css和js文件,无法正常加载样式。
_ 对应解决方案必定是要从mime type上下手。
血的经验教训——建议,修改了Nginx的mime type后,如果执行后发现并不起作用。你需要执行
chrome/设置/隐私设置和安全性/清除浏览数据
清理一下。
在该Nginx.conf的mime type
配置中有时候配置
include mime.types;
default_type application/octet-stream;
仍然无法正确加载样式,尝试使用下面脚本才合适
include mime.types;
default_type text/css;
[具体的合适
mime type
配置,可能需要多次尝试]
修改之后的Nginx.conf
文件脚本配置(local 中可以单独指定[灵活],也可以全局配置[方便])
#user nobody; worker_processes 1; error_log logs/error.log; error_log logs/error.log notice; error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 8091; server_name 192.168.1.106;#当前台式机ip #charset utf-8; #入口文件的设置 location ~ /webserver/ { default_type text/css; root html; #入口文件的所在目录 index index.html index.htm; #默认入口文件名称 } location ~ /acsweb/ { default_type text/css; root html; #入口文件的所在目录 index index.html index.htm; #默认入口文件名称 } location ~ /loc/ { default_type text/css; root html; #入口文件的所在目录 index index.html index.htm; #默认入口文件名称 } } }
Vue框架实现web应用,在与后端进行调试会发现跨域!!
而Nginx却能很好的解决调试期间的跨域问题 ~ ~
前端执行接口请求,会被Nginx正在监听的 server_name 和 listen 捕获!之后通过代理转发,实质会通过proxy_pass进行请求 ~ 从而解决跨域问题!!
# Vue的代码
# axios.default.baseUrl = 前端ip+后态端口
# 比如下面代码:
import axios from 'axios'
axios.defaults.baseURL = http://84.231.10.60:9080
# Nginx的脚本
... ... ...
.....
server {
listen 9080;# 后台端口
server_name 84.231.10.60;#前端ip
... .... .....
location = /后台接口url中部分/ {
proxy_pass http://84.127.60.18:9080; # 84.127.60.18后台ip 、9080后台端口
}
}
.......
.......
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。