• 1

  • 477

  • 收藏

nginx常用配置

1个月前

alt

nginx能做什么?

访问控制、静态资源服务器、反向代理、负载均衡、静态资源合并

1.nginx介绍及环境准备

nginx是一款轻量级的HTTP服务器,采用事件驱动的异步非阻塞处理方式框架,这让其具有极好的IO性能,时常用于服务端的反向代理和负载均衡

  • 安装
#软件装哪了 which nginx
#查看nginx是否配置正确:nginx -t
#查看是否有Nginx的进程:ps -ef | grep nginx
#查看是否有80端口:netstat -ntl       netstat -lntp
#霸道删除进程:killall nginx

$ yum install nginx

复制代码
  • centos6,可以使用如下命令

老叶的mac:/usr/local/nginx/sbin

启动:nginx 
重启:nginx -s reload 
查看ng配置状态:nginx -t
查看ng配置信息:nginx -T
查看ng进程信息:ps -ef | grep nginx
查看是否有80端口:netstat -ntl
查看当前端口占用:netstat -anp |grep 6000

//删除
ps -ef | grep nginx   //查进程
kill -QUIT  15800    //从容的停止进程id:15800,即不会立刻停止
Kill -TERM  15800    // 立刻停止
Kill -INT  15800    //和上面一样,也是立刻停止
killall nginx      //霸道删除进程
复制代码
  • centos7以后可以使用systemctl 来管理
停止ng: systemctl stop  nginx.service
启动ng:systemctl start  nginx.service
重启ng:systemctl restart nginx.service
查看ng状态:systemctl status nginx.service
设置开机启动:systemctl enable nginx.service
取消开机服务:systemctl disable nginx.service
复制代码

2. 访问控制

nginx -t查看配置文件路径

(1)简单访问控制

进入当前nginx配置文件(小编的路径为:/etc/nginx/conf.d/default.conf),加入如下配置:

location / {
        deny   10.200.240.219;     //不允许此ip访问,指定为all,可以阻止所有ip访问
        allow  10.200.202.231;     //只允许此ip访问
 }
复制代码

注意:就是在同一个块下的两个权限指令,先出现的设置会覆盖后出现的设置,例如:

//以下配置表示:拒绝所有ip访问
location / {
        deny   all;                //all,可以阻止所有ip访问
        allow  10.200.202.231;     //这一条因为出现在deny  all 之后,所以并没有什么作用
 }
//以下配置表示:只允许10.200.202.231访问
location / {        
        allow  10.200.202.231;     //这一条因为出现在deny  all 之前,所以允许此ip访问
        deny   all;                //除了allow的ip可以访问,其他的ip拒绝访问
 }
复制代码

(2)精确访问控制

比如:对于网站下的www目录是运行所有用户访问,但对于网站下的admin目录则只允许公司内网固定IP访问

location =/www{
     allow all;           //没什么秘密,大家随便看
 }
location =/admin{
     deny 10.200.240.219;    //比如后台admin管理系统,只能小编自己访问
 }
复制代码

又比如:公司java的jsp文件,只能内网ip访问,这样配置别人就看不了.jsp文件结尾的文件了。

location ~\.jsp$ {
        allow 10.200.240.219;
        deny all;
}
复制代码

配置完,记得重启一下nginx服务

3. 设置单个或多个虚机

  • a. 进入主目录:/etc/nginx/nginx.conf

----或者进入子目录:/etc/nginx/conf.d/default.conf
----或者在conf.d下新建配置文件,都可以被读取到(需要主配置包含进去)

  • b. server_name 可以设置本机(localhost)、ip地址(10.200.240.219)、域名(baidu.com)等
//基于端口号配置
server {
        listen	80;
        server_name localhost;
        error_page 500 502 503 504 /50x.html;
        location / {
           index index.html index.htm;
           #读取项目目录下html80下的index.html文件
           root <你自己的项目路径>/html80
           # 反向代理本机的8080应用
           proxy_pass http://127.0.0.1:8080;
         }
}

server {
      listen	8080;
      server_name localhost;
      error_page 500 502 503 504 /50x.html;
      location / {
          #读取项目目录下html8080下的index.html文件
          root <你自己的项目路径>/html8080
          index index.html index.htm;;
      }
}
//------------------------------------------------------------------------------------------
//基于域名配置示例
server {
        listen       80;
        server_name  www.aa.com;
        location /api/ {
                proxy_pass  http://;   #反向代理到其他站点
        }
}
server {
        listen       80;
        server_name  www.bb.com;
        location /api/ {
                proxy_pass  http://localhost:8002;  #反向代理到其他站点
        }
}

复制代码

基于Nginx虚拟主机配置实现,Nginx有三种类型的虚拟主机

  • 基于IP的虚拟主机:需要你的服务器上有多个地址,每个站点对应不同的地址,这种方式使用的比较少

  • 基于端口的虚拟主机:每个站点对应不同的端口,访问的时候使用ip:port的方式访问,可以修改listen的端口来使用

  • 基于域名的虚拟主机:使用最广的方式,上边例子中就是用了基于域名的虚拟主机,前提条件是你有多个域名分别对应每个站点,server_name填写不同的域名即可

  • c. 一个服务配置多个站点

server {
    listen       80;
    server_name  a.ops-coffee.cn;
    location / {
        root /home/project/pa;
        index index.html;
    }
}
server {
    listen       80;
    server_name  ops-coffee.cn b.ops-coffee.cn;
    location / {
        root /home/project/pb;
        index index.html;
    }
}
server {
    listen       80;
    server_name  c.ops-coffee.cn;
    location / {
        root /home/project/pc;
        index index.html;
    }
}
复制代码
  • d. 一个站点配置多个域名
server {
    listen       80;
    server_name  ops-coffee.cn b.ops-coffee.cn;
}
复制代码

4. 反向代理

主要配置location模块的 proxy_pass

一般反向代理都配置一个ip地址,因为如果配置域名,还要走一遍dns解析,没必要
以下示例访问 http://localhost,其实就是访问 http://localhost:8080

server {
        listen	80;
        server_name localhost;
        error_page 500 502 503 504 /50x.html;
        location / {
           proxy_pass http://localhost:8080;    #反向代理到其他web服务器
        }
}
复制代码

其他反向代理配置项:

  • proxy_set_header :在将客户端请求发送给后端服务器之前,更改来自客户端的请求头信息。
  • proxy_read_timeout : 配置Nginx向后端服务器组发出read请求后,等待相应的超时时间。
  • proxy_send_timeout:配置Nginx向后端服务器组发出write请求后,等待相应的超时时间。
  • proxy_connect_timeout:配置Nginx与后端代理服务器尝试建立连接的超时时间。
  • proxy_redirect :用于修改后端服务器返回的响应头中的Location和Refresh。

例如:

proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
复制代码

4.1反向代理解决js跨域

那么我们正常请求:http://a.com/api/getHomeData 会被转发到 b.com/api/getHome… 这样就不会因为域名的不同导致js跨域了。

server {
        listen	80;
        server_name a.com;
        error_page 500 502 503 504 /50x.html;
        location /api {
           proxy_pass http://b.com/api
        }
}
复制代码

4.2url的/问题

在nginx中配置proxy_pass时,当在后面的url加上了/,相当于是绝对根路径,则nginx不会把location中匹配的路径部分代理走;如果没有/,则会把匹配的路径部分也给代理走。

  • 下面四种情况分别用http://192.168.1.4/proxy/test.html 进行访问。
# 1. 会被代理到http://127.0.0.1:81/test.html 这个url
location /proxy/ {
     proxy_pass http://127.0.0.1:81/;
}

# 2. 第二咱(相对于第一种,最后少一个 /),会被代理到http://127.0.0.1:81/proxy/test.html 这个url
location /proxy/ {
     proxy_pass http://127.0.0.1:81;
}

# 3. 会被代理到http://127.0.0.1:81/ftlynx/test.html 这个url。
location /proxy/ {
     proxy_pass http://127.0.0.1:81/ftlynx/;
}

# 4. 第四种情况(相对于第三种,最后少一个 / ):会被代理到http://127.0.0.1:81/ftlynxtest.html 这个url
location /proxy/ {
     proxy_pass http://127.0.0.1:81/ftlynx;
}
复制代码

5. nginx区分PC还是移动端

  • nginx通过内置变量$http_user_agent,可以获取到请求客户端的userAgent,进而判断移动端还是PC端,控制返回给客户是PC版还是H5版,这也是当下很多公司的方案
  • 以下配置就可以让 http://localhost:8080 在移动端的环境下,读取mobile下的网站内容(默认读取PC下的网站内容)
//常用--根据UA做重定向
server{
     listen 8080;
     server_name localhost;
     root /Users/joker/2019/pc;
     if ($http_host !~ "^www.aa.com$") {
      rewrite  ^(.*)   http://www.aa.com$1 permanent;
     }
     if ($http_user_agent ~* '(Android|webOS|iPhone|iPod|BlackBerry)') {
        rewrite  ^(.*)   http://m.aa.com$1 permanent;
      }
}

//不常用--同一台服务器放两份代码
server{
     listen 8080;
     server_name localhost;
     location / {
      root /Users/joker/2019/pc;
      if ($http_user_agent ~* '(Android|webOS|iPhone|iPod|BlackBerry)') {
         root /Users/joker/2019/mobile;
      }
      index index.html;
     }
}
复制代码

6. 负载均衡

主要配置upstream和location模块的proxy_pass

upstream test_pool{
	ip_hash;
	server 127.0.0.1:8001 weight=10;   #设置访问权重,权重越高越容易被访问
	server 127.0.0.1:8002 weight=10;
	server 127.0.0.1:8003 weight=7;
}
server {
	listen 80;
	server_name test.a.com;
	location / {
		proxy_pass http://test_pool;   #反向代理到其他服务器集合
	}
}
复制代码

ip_hash:使用ip_hash策略的负载均衡解决session问题。每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可较好地解决session的问题。

7. 静态资源请求合并

nginx-http-concat

8. location的那点事

rewrite

location ~ \.php${
	rewirte "^/php/(.*)$" http://localhost:8001/$1
}
复制代码

将localhost/php/test.php重定向到localhost:8090/test.php。如果正则表达式(regex)匹配到了请求的URI(request URI),这个URI会被后面的replacement替换
可选的flag参数如下:

  • last

结束当前的请求处理,用替换后的URI重新匹配location;
可理解为重写(rewrite)后,发起了一个新请求,进入server模块,匹配location;
如果重新匹配循环的次数超过10次,nginx会返回500错误;
返回302 http状态码 ;
浏览器地址栏显示重定向后的url

  • break

结束当前的请求处理,使用当前资源,不在执行location里余下的语句;
返回302 http状态码 ;
浏览器地址栏显示重定向后的url

  • redirect

临时跳转,返回302 http状态码;
浏览器地址栏显示重定向后的url

  • permanent

永久跳转,返回301 http状态码;
浏览器地址栏显示重定向后的url

try_files

try_files指令是按顺序检测文件的存在性,并且返回第一个找到文件的内容,如果第一个找不到就会自动找第二个,依次查找.其实现的是内部跳转

# example01:跳转到变量
server {
     listen 8000;
     server_name 121.10.143.66;
     root html;
     index index.html index.php;
      
      location /abc {
           try_files /4.html /5.html @qwe;      ## 检测文件4.html和5.html,如果存在正常显示,不存在就去查找@qwe值  
      }   
       
      location @qwe  {
          rewrite ^/(.*)$  http://www.baidu.com;     ## 跳转到百度页面
      }
  }

# example02:跳转到指定文件,不存在就往后找,找到了显示。   测试链接:http://121.10.143.66:8000/abc
server {
   listen 8000;
   server_name 121.10.143.66;
   root html;
   index index.php index.html;
             
   location /abc {
       try_files /4.html /5.html /6.html;
   }
 }

复制代码
免责声明:文章版权归原作者所有,其内容与观点不代表Unitimes立场,亦不构成任何投资意见或建议。

php

477

相关文章推荐

未登录头像

暂无评论