nginx学习笔记,


nginx学习笔记

(一)nginx命令

nginx -s stop #直接关闭
如果无法关闭
在linux下使用:ps -ef |grep nginx找到主进程kill掉
再找到你自己写的配置文件加载
nginx -c /etc/nginx/nginx.conf #我一般用这个命令加载
nginx -s quit #处理完当前请求然后退出
nginx -s reload #重启
nginx -s reopen #重新打开日志文件
当然,使用不同方法安装的nginx形式不同,centos使用yum安装,ubuntu使用apt-get下载,但是都是修改nginx.conf文件

(二)nginx配置服务器静态资源路径

有时,我们的网站放到服务器上,如果是纯静态的,不需要大前端启动node服务的,不需要前端服务器,直接放到nginx的html目录下,配置都不用,在浏览器访问http://localhost就能访问,如果刷新和跳页有问题就是目录打包后相对位置不对。我们的网站一般都部署在80端口下,80端口在浏览器时默认不需要输端口号的,所以看到各大门户网站都是没有端口号的,都是部署在80端口下,使用一个公网ip地址解析域名,然后在服务器集群上做负载均衡,具体不了解。
 server {
        listen       80;
        server_name  localhost;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }

这是nginx.conf默认的。server是主机设置(指定虚拟主机域名,ip,端口;location是url匹配特定位置后的设置。listen声明服务器监听的端口号;root是托管静态站点最关键的部分,一般托管存放html和css文件,root就是定义静态资源文件的存放路径。上面的配置文件说明,当在浏览器输入本机ip,会默认访问/usr/share/nginx/html下的html文件。那么怎么自己定义存放的文件呢?
 server{
	
                listen 80;
                server_name localhost 域名;
               # rewrite ^(/[0-9|a-z|A-Z]+/){1,}.jpg$
               
              location /image/ { 
               root /; 
              rewrite ^/image/(.*)$ /disk1/PersonSearchPrj/data/$1 break;
                        }
              location /file/ {
               root /;
               rewrite ^/file/(.*)$ /disk1/PersonSearchPrj/files/$1 break;
                   } 

一般,我们的需求是,用一个变量来分类,比如/image说明是存放图片的目录,至于目录多深,是否多级是后面的是,可能/image/background存放背景图片/image/userShot存放用户头像等,在浏览器输入http://www.***/image/userShot/xiaoming.jpg能在浏览器访问到服务器更目录下/disk1/PersonSearchPrj/data//image/userShot/xiaoming.jpg这个图片文件。那么就要用到nginx的重定向。

格式为:

rewrite  <regrex>   <replacement>  [flag]
:()标记要截取的内容
:通过$1来引用,$2表示前面中第二个()里的内容。
[flag]:有last(本条后继续往下匹配);break(本条后终止);redirect(临时重定向);permanent(永久重定向吗,返回301)
下面有必要讲一下正则表达式:
1.始终 
    字符串开始用^   字符串结尾用$

2.重复次数
    *:(0~无穷)<=> {0,}
    +: (1~无穷)<=> {1,}
    ?: (0,1)<=> {0,1}
    {}: 范围(比如:ab{3,5} <=> abbb~abbbbb
3.其他
    |: 或(比如:(b|cd)ef <=> bef,cdef
    .: 可代替任何字符 (比如:^.{3}$ 表示3个字符长度的任意字符串)
    []: 表示该范围的字符可以出现 (比如:^[a-zA-z] 表示一个以字母开头的字符串)
    \: 转义符 在'^.$()|+?\'这些字符前加转义字符,[]中不需要加(\d <=>[0-9], \D <=>[^/d]非数字, \s <=>空白字符, \w <=>单词字符,任何数字字母和下划线
    (): 表示一个分组
    

现在可以看懂正则匹配了,也能自己根据需求改写,还需要知道location的一些简单规则,下面直接粘贴别人的样例了

下面四种情况分别用http://192.168.1.4/proxy/test.html 进行访问。
第一种:

location  /proxy/ {

proxy_pass http://127.0.0.1:81/;

}

结论:会被代理到http://127.0.0.1:81/test.html 这个url

 

第二种(相对于第一种,最后少一个 /)

location  /proxy/ {

proxy_pass http://127.0.0.1:81;

}

结论:会被代理到http://127.0.0.1:81/proxy/test.html 这个url

 

第三种:

location  /proxy/ {

proxy_pass http://127.0.0.1:81/ftlynx/;

}

结论:会被代理到http://127.0.0.1:81/ftlynx/test.html 这个url。

 

第四种(相对于第三种,最后少一个 / ):

location  /proxy/ {

proxy_pass http://127.0.0.1:81/ftlynx;

}

结论:会被代理到http://127.0.0.1:81/ftlynxtest.html 这个url

我们自己写的路径/disk1/PersonSearchPrj/data/$1最后是没有/的,所有location的/image/**也会拼接到里面。

(三)怎么发布自己前后端分离的项目

这个难度就有点大了,首先得定义好自己的项目架构,需要几个项目,最后启几个服务。前端服务如果占用8080端口,后端java项目占用8081端口,或者后端多个项目,还占用8082。
前后端分离,意味着前端负责展示界面和用户交互,获得用户数据,就是入参,通过http请求与后端交互,后端就是个开发接口,负责各种复杂的数据处理及存储等任务的,一般遵循restful风格的开发规范。那么需要在开发模式中定义好http请求,比如http://ocalhost:8081/v1/backend1/user/getUser这个接口,表示版本1,第一个后端项目,然后全部映射到80端口,申请域名,解析到服务器公网IP
server {
        listen       80 default_server;
        server_name  www.bornfly.cn 公网ip;
        root         /usr/share/nginx/html;
        include /etc/nginx/default.d/*.conf;

    
        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    
    location /backend1/ {
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://127.0.0.1:8081;
    }
 
    location /backend2/ {
        proxy_set_header Host $host;
        proxy_pass http://127.0.0.1:8082;
    }
 
    location /front/ {
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://127.0.0.1:8080;
    }
}
上面配置如果前端有前端服务,那么主页就是http://域名/front/它会转发到前端项目http://127.0.0.1:8080/,如果不想要/front/可以直接将/front/替换为/,这样访问域名就是前端主页。后端接口http://ocalhost:8081/v1/backend1/user/getUser比如是这个,在postman能测通,打包发布后,前端应该访问http://域名/backend1/v1/backend1/user/getUser就能访问到了。location也可以写正则表达式,proy_pass也有重定向机制,如果需求复杂也可以解决。

相关内容

    暂无相关文章