解读Nginx配置文件,通过域名访问tomcat
第一次在linux 服务器上使用nginx 并指向tomcat 目录 通过域名 访问项目。遇到了很多坑,为了让自己更好的学习并吸收知识,特意总结了一下这次的经验。
首先我们需要了解一下nginx的组成部分,想必大家都是对他有所了解。
文件所在的路径是 /usr/local/nginx/conf 文件夹下的nginx.conf。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
第一个原本的配置文件上是注释的,这里指的是nginx的用户权限, user nobody; 设置最大的工作衍生进程数 这里默认是1 worker_processes 1 最大的连接数 设置最大的连接数默认为1024个连接数 events { worker_connections 1024; } Http 的主要设置,这里可以添加多个server http { 每一个Server都是一个服务 server{ #这里是过滤请求,/是所有请求都可以 location /{ } } |
下面部署nginx 并使其转发到tomcat下的重点在于server这个块。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
server { listen 80; #首先是nginx的监听端口默认为80 server_name www.xxxx.com; #这里是你需要访问的域名地址 #add_header 'Access-Control-Allow-Origin' '*';#这里是http 域名跨域,报错时候添加的请求头,这样写所有请求都会进来,会很不安全。 #charset koi8-r; #access_log logs/host.access.log main;#这里是 日志文件的生成路径 #详细介绍location location / { #是监听的端口默认访问的地址,这里如果没有做tomcat的转发则会进入nginx的html目录下的index.html root html; #这里是编写监听到的请求所转发的端口号,即tomcat端口 proxy_pass http://localhost:8081; #Proxy Settings; #proxy_redirect off; #proxy_set_header Host $host; #proxy_set_header X-Real-IP $remote_addr; #proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #设置nginx 的默认显示页 index index.html index.htm; #设置http请求的请求头,使其在跨域访问上不会被浏览器阻止。ps:这里设置我发现没有用,后来还是在ajax过滤器中添加的 请求头,如果大家有知道这里怎么修改的,请留言大家一起学习。 add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type'; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } |
下面是location的设置
1 2 3 4 5 6 7 8 9 10 11 12 13 |
设置服务器缓存 1. 添加一个location ~.*\.(意思是所有.jpg后缀的文件) location ~.*\.(jpg|png|gif)${ 2.设置该文件类型文件缓存的清除周期为30天 expires 30d; } location ~.*\.(css|js)?${ 3.设置该文件类型文件缓存的清除周期为1小说 expires 1h; } 这里注意 全部请求是/ 而过滤的请求是\ |
顺带提一下负载均衡
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Nginx 均衡负载的实现 简单提一下 均衡策略 在http 里添加一个upstream 在这个里面依次填写 不同的ip以及端口 nginx upstream name{ server ip:端口号; server ip:端口号; server ip:端口号; server ip:端口号; } nginx 的默认均衡策略是加权轮询 1.加权轮询策略 nginx计算每个后端服务器的权重,然后自动分配权重最高的后端服务器来处理请求。 加权轮询策略 使用 weight=1来给地址添加权重,权重越高,nginx会优先分配 2.ip_hash策略 nginx会记录这个访问的ip地址并且在一段时间中 分配给这个ip一个server。 ip_hash 在upstream 的结尾加上 ip_hash; nginx 自动使用ip_hash 3.url_hash 等.. 插件形式的均衡策略这里就不提了 |
设置完配置文件下面就是运行测试了。
进入nginx 启动文件的目录 /usr/local/nginx/sbin
启动服务 ./nginx (这是在第一次启动时使用,或者进程被杀死时启动。)
重启服务 ./nginx -s reload (这是在修改了配置文件的情况下,不需要杀死进程)
如果在使用 ./nginx 命令时 linux 报错nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
证明这个80端口被nginx占用了,这个时候需要杀死进程 使用killall -9 nginx 或者使用 netstat -apn | grep 80 查询当前80端口 tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 13741/nginx: master 然后使用kill -9 13741命令杀死进程.
5.启动nginx服务器就不会报错,如果配置文件出现错误,下面会显示错误的行号。
在浏览器上输入域名,nginx自动在nginx.conf中查找 server_name 对应的域名 的server 下的location跳转到proxy_pass 这里指的的 IP和端口。我这里设置的是8081端口。
注意如果proxy_pass 配置的IP地址和域名解析的IP地址不同会出现
这个问题我是在java代码中使用ajax拦截请求后加入到请求头中解决的。
在nginx上添加下面这几段并没有实际效果。
add_header ‘Access-Control-Allow-Origin’ ‘*’;
add_header ‘Access-Control-Allow-Methods’ ‘GET, POST, OPTIONS’;
add_header ‘Access-Control-Allow-Headers’ ‘DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type’;