Mrli
别装作很努力,
因为结局不会陪你演戏。
Contacts:
QQ博客园

学习nginx配置

2022/02/27 环境配置 nginx
Word count: 2,445 | Reading time: 10min

nginx配置

多台虚拟主机:

1.分配IP地址

2.新建、编写usr/local/nginx的conf配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
http{
sever{
listen 192.168.1.17:80; //监听 (IP地址:) 端口
server_name 192.168.1.17; // 域名或者ip
access_log logs/server1.access.log conbined;//指定位置+使用日志文件默认格式
location /
{
index index.html index.htm; //index表示意义(关键字),左边优先级高.指定的首页
root html/ss2;
//虚拟主机目录(网站目录)==>ss2下的所以html文件都可以通过192.168.1.17/xxx访问
}
}
}

3.编写目录下的首页index.html文件

4.运行nginx

usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/xnzj.conf

▲在根目录下可以直接通过路径访问,如根目录下只有index文件,而配置中设置的是index index.html此时没有找到index.html后就会显示403错误,但是可以通过192.168.1.17==>192.168.1.17/index添加路径的方法来加载index界面

其他配置

  • 缓存
1
2
3
4
5
6
7
8
9
10
server{
listen xxx;
server_name yyy;
location ~ .*\.(jpg|png|)${
expires 30d;
}
location ~ .*\.(css|js|)${
expires 1h;
}
}
  • 自动列目录
1
2
3
4
5
6
7
8
9
10
[/ect/nginx/nginx.conf]
server{
..
location / {
root html;
index index.html index.hml;
autoindex on; #▲
}

}

命令解释

server_name

server_name 为虚拟服务器的识别路径。因此不同的域名会通过将请求头中的HOST字段与虚拟主机设置的URI进行匹配,从而匹配到特定的server块,将请求转发到对应的应用服务器中去。

from : https://blog.csdn.net/Cheng_Kohui/article/details/82930464

server_name与host匹配优先级如下:

  1. 完全匹配
  2. 通配符在前的,如*.test.com
  3. 通配符*在后的,如www.test.*
  4. 正则匹配,如~^.www.test.com$

location

location是Nginx中的块级指令(block directive),,location指令的功能是用来匹配不同的url请求,进而对请求做

开始之前先明确一些约定,我们输入的网址叫做请求URI,nginx用请求URIlocation中配置的URI做匹配。不同的处理和响应。

匹配顺序

  1. = 表示精确匹配。只有请求的url路径与后面的字符串完全相等时,才会命中。
  2. ^~ 表示如果该符号后面的字符是最佳匹配,采用该规则,不再进行后续的查找。
  3. ~ 表示该规则是使用正则定义的,区分大小写。
  4. ~* 表示该规则是使用正则定义的,不区分大小写。

注意的是,nginx的匹配优先顺序按照上面的顺序进行优先匹配,而且注意的是一旦某一个匹配命中直接退出,不再进行往下的匹配

剩下的普通匹配会按照最长匹配长度优先级来匹配,就是谁匹配的越多就用谁。

try_files详解

nginx中http_core核心模块所带的指令,主要是能替代一些rewrite的指令,提高解析效率

格式1:try_files file ... uri; 格式2: try_files file ... file = ReturnCode;

  • 关键点1:按指定的file顺序查找存在的文件,并使用第一个找到的文件进行请求处理
  • 关键点2:查找路径是按照给定的root或alias为根路径来查找的
  • 关键点3:如果给出的file都没有匹配到,则重新请求最后一个参数给定的uri,就是新的location匹配
  • 关键点4:如果是格式2,如果最后一个参数是 = 404,若给出的file都没有匹配到,则最后返回ReturnCode(如404)的响应码

举例说明

1
2
3
4
5
6
7
8
location /images/ {
root /opt/html/;
try_files $uri $uri/ /images/default.gif;
}
# 比如 请求 127.0.0.1/images/test.gif 会依次查找 1.文件/opt/html/images/test.gif 2.文件夹 /opt/html/images/test.gif/下的index文件 3. 请求127.0.0.1/images/default.gif

# 4.其他注意事项
#1.try-files 如果不写上 $uri/,当直接访问一个目录路径时,并不会去匹配目录下的索引页 即 访问127.0.0.1/images/ 不会去访问 127.0.0.1/images/index.html

from: https://www.cnblogs.com/jedi1995/p/10900224.html

例子2: 因为不可能每一个项目开启一个域名,仅仅指向通过增加路径来划分多个网站,比如:

  1. www.taobao.com/tmall/login访问天猫的登录页面
  2. www.taobao.com/alipay/login访问支付宝的登录页面
1
2
3
4
5
6
7
8
9
server {
listen 80;
server_name taobao.com;
index index.html index.htm;
# 通过正则来匹配捕获 [tmall|alipay]中间的这个路径
location ~ ^/([^\/]+)/(.*)$ {
try_files $uri $uri/ /$1/dist/index.html =404;
}
}

rewrite 用法

用rewrite去除URL中的特定参数。

日常服务中经常会用Nginx做一层代理转发,把Nginx当做前置机,这里的rewrite 就是为了去除URL中的/apis,因为实际的后端api中是没有这个参数的,但是为了做到在Nginx转发请求,前端需要加上这个参数,以便于区别开请求前端页面还是后端接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
server {
# 对外暴露 80 端口
listen 80;
server_name 192.168.10.231;

# 后端API地址暴露为:http://192.168.10.231/apis
# 后端服务实际运行的地址和端口为: http://127.0.0.1:8000
location /apis {
proxy_pass http://127.0.0.1:8000/;
proxy_pass_request_headers on;
# 重写URL 去除apis
rewrite "^/apis/(.*)$" /$1 break;
# "^/api/(.)$": 匹配路径的正则表达式,用了分组语法就是*(.)**,把/api/以后的所有部分当做1组;
# /$1:重写的目标路径,这里用$1引用前面正则表达式匹配到的分组(组编号从1开始,也就是api),即/api/后面的所有。这样新的路径就是除去/api/以外的所有,就达到了去除/api前缀的目的
# break:指令。常用的有2个,分别是:last、break;
# last: 重写路径结束后,将得到的路径重新进行一次路径匹配;
# break: 重写路径结束后,不再重新匹配路径。

}

}

比如前端的请求地址是

1
http://192.168.10.231/apis/user

那么实际上经过Nginx转发后请求的地址是

1
http://127.0.0.1:8000/user

index配置

在前后端分离的基础上,通过Nginx配置,指定网站初始页。

格式: index index.htm ... file3 /index.html

如果包括多个文件,Nginx会根据文件的枚举顺序来检查,直到查找的文件存在;
文件可以是相对路径也可以是绝对路径,绝对路径需要放在最后
文件可以使用变量$来命名;index index.$geo.html index.0.html /index.html;

如果文件存在,则使用文件作为路径,发起内部重定向。直观上看上去就像再一次从客户端发起请求,Nginx再一次搜索location一样。

既然是内部重定向,域名+端口不发生变化,所以只会在同一个server下搜索。

同样,如果内部重定向发生在proxy_pass反向代理后,那么重定向只会发生在代理配置中的同一个server。

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
server {
listen 80;
server_name example.org www.example.org;

location / {
root /data/www;
index index.html index.php;
}

location ~ \.php$ {
root /data/www/test;
}
}

上面的例子中,如果你使用example.org或www.example.org直接发起请求,那么首先会访问到“/”的location,结合root与index指令,会先判断/data/www/index.html是否存在,如果不,则接着查看
/data/www/index.php ,如果存在,则使用/index.php发起内部重定向,就像从客户端再一次发起请求一样,Nginx会再一次搜索location,毫无疑问匹配到第二个~ .php$,从而访问到/data/www/test/index.php。

More:

前端到底用nginx来做啥

uwsgi模块使用

安装
source activate# 开启虚拟开发环境模式
pip install uwsgi # 安装uwsgi
配置
uwsgi配置文件支持很多格式,我采用.ini格式,命名为uconfig.ini具体内容如下:

启动uwsgi , 命令输入uwsgi uconfig.ini

外部访问测试

此时在外部访问 公网IP:5000就可以访问了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[uwsgi]
# 外部访问地址,可以指定多种协议,现在用http便于调试,之后用socket
http = 0.0.0.0:5000
# 指向项目目录
chdir = /home/pythonproject/my_flask/py3env/myblog/
# flask启动程序文件
wsgi-file = manage.py
# flask在manage.py文件中的app名
callable = app #很多人习惯将Flask应用对象取名为”app”,但是WSGI标准是”application”。uWSGI提供了一个功能,可以指定应用对象,方法就是在配置文件中加上”callable”项:
# 处理器数
processes = 4
# 线程数
threads = 2
#状态检测地址
stats = 127.0.0.1:9191
1
2
3
4
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:3031;
}

这段配置表明Nginx会将收到的所有请求都转发到”127.0.0.1:3031″端口上,即uWSGI服务器上。现在让我们重启Nginx,

附:使用记录

单server基本配置

1
2
3
4
5
6
7
8
9
server{
listen 80; # 侦听端口 weight=1;
server_name localhost; # 服务器名称 weight=10;

location / { # 侦听URL路径
root /usr/share/nginx/html; # 工程根目录
index index-test.html index.htm; # 入口文件
}
}

反向代理:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
upstream group1{
server 49.235.118.244:7070; # 这边的IP地址不能写127.0.0.1实测
server 49.235.118.244:7069; # 且云服务器需要在防火墙将这个端口开放,否则无法反向代理
}

server {
listen 80;
server_name localhost;
location /demo1 {
# 在该位置配置反向代理,将ip/demo1请求拦截,发送给8080端口,如果不是本机请使用公网ip
proxy_pass http://group1/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
index index.html index.htm;
}
}

Author: Mrli

Link: https://nymrli.top/2019/01/24/学习nginx配置/

Copyright: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.

< PreviousPost
ACM_贪心专题
NextPost >
C++日期操作
CATALOG
  1. 1. nginx配置
    1. 1.1. 多台虚拟主机:
    2. 1.2. 其他配置
  2. 2. 命令解释
    1. 2.1. server_name
    2. 2.2. location
    3. 2.3. try_files详解
    4. 2.4. rewrite 用法
    5. 2.5. index配置
    6. 2.6. More:
  3. 3. uwsgi模块使用
  4. 4. 附:使用记录
    1. 4.1. 反向代理: