目录:
- 1、nginx代理常用配置
- 2、详解nginx如何代理静态资源(长搜索路径优先)
- 3、一、服务器从零到一——Ubuntu搭建nginx静态服务器
- 4、使用Nginx搭建静态网站
- 5、通过Nginx部署flask项目和静态站点
nginx代理常用配置
1. 最简反向代理配置
在http节点下,使用upstream配置服务地址,使用server的location配置代理映射。
upstream my_server {
server 10.0.0.2:8080;
keepalive 2000;
}
server {
listen 80;
server_name 10.0.0.1;
client_max_body_size 1024M;
location /my/ {
proxy_pass ;
proxy_set_header Host $host:$server_port;
}
}
通过该配置,访问nginx地址的请求会被转发到my_server服务地址。
需要注意的是,如果按照如下配置:
upstream my_server {
server 10.0.0.2:8080;
keepalive 2000;
}
server {
listen 80;
server_name 10.0.0.1;
client_max_body_size 1024M;
location /my/ {
proxy_pass ;
proxy_set_header Host $host:$server_port;
}
}
那么,访问nginx地址的请求会被转发到my_server服务地址。这是因为proxy_pass参数中如果不包含url的路径,则会将location的pattern识别的路径作为绝对路径。
2. 重定向报文代理
即便配置了nginx代理,当服务返回重定向报文时(http code为301或302),会将重定向的目标url地址放入http response报文的header的location字段内。用户浏览器收到重定向报文时,会解析出该字段并作跳转。此时新的请求报文将直接发送给服务地址,而非nginx地址。为了能让nginx拦截此类请求,必须修改重定向报文的location信息。
location /my/ {
proxy_pass ;
proxy_set_header Host $host:$server_port;
proxy_redirect / /my/;
}
使用proxy_redirect可以修改重定向报文的location字段,例子中会将所有的根路径下的url代理到nginx的/my/路径下返回给用户。比如服务返回的重定向报文的location原始值为/login,那么经过nginx代理后,用户收到的报文的location字段为/my/login。此时,浏览器将会跳转到nginx的/my/login地址进行访问。
需要注意的是,服务返回的重定向报文的location字段有时会填写绝对路径(包含服务的ip/域名和端口),有时候会填写相对路径,此时需要根据实际情况进行甄别。
location /my/ {
proxy_pass ;
proxy_set_header Host $host:$server_port;
proxy_redirect ;
}
上述配置便是将my_server服务的根路径下的所有路径代理到nginx地址的/my/路径下。当nginx配置只有一个server时,前缀可以省略。
3. 报文数据替换
使用nginx代理最牛(dan)逼(sui)的情况就是http响应报文内写死了服务地址或web绝对路径。写死服务地址的情况比较少见,但也偶尔存在。最棘手的是写死了web绝对路径,尤其是绝对路径都没有公共前缀。举个例子来说:
一般的web页面会包含如下类似路径:
/public:用于静态页面资源,如js脚本/public/js,样式表/public/css,图片/public/img等。
/static:和/public类似。
/api:用于后台服务API接口。
/login:用于登录验证。
其他。
对于这样的服务,可能的代理配置如下:
location /my/ {
proxy_pass ;
proxy_set_header Host $host:$server_port;
proxy_redirect / /my/;
}
location /login/ {
proxy_pass ;
proxy_set_header Host $host:$server_port;
}
location /public/ {
proxy_pass ;
proxy_set_header Host $host:$server_port;
}
location /api/ {
proxy_pass ;
proxy_set_header Host $host:$server_port;
}
由于web页面或静态资源内写死了类似的绝对路径,那么对于用户来说,通过页面内的链接进行跳转时,都会请求到nginx服务对应的路径上。一旦存在另一个服务也包含类似的路径,也需要nginx进行代理,那么矛盾就出现了:访问nginx的同一个路径下的请求究竟转发给哪一个服务?
要解决这个问题,必须在用户收到报文前,将报文的数据中包含的绝对路径都添加统一的前缀,如/my/public,/my/api,/my/login,这样nginx代理配置则可以简化为:
location /my/ {
proxy_pass ;
proxy_set_header Host $host:$server_port;
proxy_redirect / /my/;
}
location /other/ {
proxy_pass ;
proxy_set_header Host $host:$server_port;
proxy_redirect / /other/;
}
nginx的ngx_http_sub_module模块提供了类似的报文数据替换功能,该模块默认不会安装,需要在编译nginx时添加--with-http_sub_module参数,或者直接下载nginx的rpm包。
使用sub_filter对数据包进行替换的语法如下:
location /my/ {
proxy_pass ;
proxy_set_header Host $host:$server_port;
sub_filter 'href="https://vps.456.cn/'%20'href="https://vps.456.cn/my/';
sub_filter 'src="https://vps.456.cn/'%20'src="https://vps.456.cn/my/';
sub_filter_types text/html;
sub_filter_once off;
}
上述配置会将/my/下的所有响应报文内容的href="https://vps.456.cn/替换为href="/my,以及src="https://vps.456.cn/替换为src="/my,即为所有的绝对路径添加公共前缀。
注意,如果需要配置多个sub_filter,必须保证nginx是1.9.4版本之上的。
详解nginx如何代理静态资源(长搜索路径优先)
web服务器重要的的任务之一就是服务静态资源文件,比如网站的图片,还有一些静态的HTML页面,本文的例子还是来自于Nginx官网。在这个用例中我们要配置两个静态资源路径,来处理外部的静态资源请求。我们会更改配置文件中,server块下http下的location。
首先需要创建/data/www目录,然后将index.html文件,文件的内容并不重要,本例只是指引我们观察nginx如何找到和发送静态资源。然后在创建一个/data/images目录,并放置一些图片文件。
下一步打开配置文件,默认的配置文件中已经包含了一些server块,大多数已经注释掉了,官网让我们把server块都注释掉,重写写一个新的空的server块,但注意,一定不要将http注释掉,nginx通过识别它才能知道我们需要处理的是http请求。
通常,配置文件可能会包含多个server块,这些server块可以由端口号区分,也可以由server names来区分。当nginx决定由哪一个server去处理请求的时候,nginx会根据server块中location参数去测试请求头中指定的URI
现在在server块中添加location块
该location块指定了URI请求的根目录前缀,"/"。对于请求来讲,URI被添加在root路径具体指向的目标路径,如果存在的多个匹配的位置块,nginx将选择前缀最长的位置块(可能是因为更加具体)。上方的location块提供的已经是最短前缀了,也就是说,server块中所有的location块如果都没有匹配到,则该location块将会被采用。
官网的说法真的非常绕,我觉得思路就是, nginx首先会优先去具体的location块匹配资源(规则是参数越长,越优先查找),如果都查不到就去根路径查。
我们再加一个location块
这个location块会匹配以/images/开始的请求,但上一个(location块 location / 也会匹配该内容,记得吗,Nginx会先匹配长路径location块)
现在为了看的更加清楚,在加过这两部分内容之后的配置文件应该长这样
重新加载nginx之后,配置会更新,使用:
现在该配置文件已经生效了,配置在监听80端口的本地服务器上,我们可以在本地访问 ,在此之后例如 这样的请求, Nginx会映射到location /images/去,如果请求的资源不存在,Nginx将返回404页面,404页面是可以定制的,一般企业也会定制属于自己的404页面。
后续的内容我还打算针对一些常见场景,记录以下nginx的配置文件针对不同场景和需求该如何去写,以及为什么这么写。Nginx一些模块的详细介绍不打算专门写,大家如果有需求可以看官方文档。
一、服务器从零到一——Ubuntu搭建nginx静态服务器
Ubuntu 18.04上的Nginx默认启用了一个服务器模块,该模块被配置为在/var/www/html目录下提供文档。 虽然这适用于单个站点,但如果您托管多个站点,它可能会变得很笨重。 我们不必修改/var/www/html ,而是在/var/www为我们的 example.com 网站创建一个目录结构,并将/var/www/html保留为默认目录,如果客户端请求没有匹配任何其他网站。
按如下所示为example.com创建目录,使用-p标志创建任何必需的父目录:
$ sudo mkdir -p /var/www/ example.com/html
接下来,使用$USER环境变量分配目录的所有权:
USER:$USER /var/www/ example.com/html/
如果你没有修改你的umask值,你的web根目录的权限应该是正确的,但是你可以通过输入:
$ sudo chmod -R 755 /var/www/ example.com/
接下来,使用gedit或您最喜欢的编辑器创建一个index.html页面示例:
$ gedit /var/www/ example.com/html/index.html
在里面,添加下面的示例HTML:
html
head
titleWelcome to Example.com!/title
/head
body
h1Success! The example.com server block is working!/h1
/body
/html
为了让Nginx提供这些内容,有必要创建一个具有正确指令的服务器块。 我们不要直接修改默认配置文件,而是在/etc/nginx/sites-available/ example.com上创建一个新文件:
$ sudo gedit /etc/nginx/sites-available/example.com
粘贴到以下配置块中,该块类似于默认值,但已更新为我们的新目录和域名:
server {
listen 80;
listen [::]:80;
}
请注意,我们已将root配置更新到我们的新目录,并将server_name为我们的域名。
接下来,让我们通过创建一个链接到启动sites-enabled目录来启用该文件,该目录是Nginx在启动过程中读取的:
$ sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
现在启用两个服务器模块并将其配置为基于listen和server_name指令响应请求(您可以阅读关于Nginx如何处理这些指令的更多信息):
example.com :将响应 example.com 和 请求。
default :将响应端口80上与其他两个块不匹配的任何请求。
为了避免添加额外的服务器名称可能导致的哈希桶内存问题,有必要调整/etc/nginx/nginx.conf文件中的单个值。
打开文件:sudo gedit /etc/nginx/nginx.conf
找到server_names_hash_bucket_size指令并删除#符号以取消注释该行:
...
http {
...
server_names_hash_bucket_size 64;
...
}
...
接下来,测试以确保您的Nginx文件中没有语法错误:
$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
如果没有任何问题,请重新启动Nginx以启用您的更改:
$ sudo systemctl restart nginx
熟悉重要的Nginx文件和目录
nginx服务器配置文件:
/etc/nginx :Nginx配置目录。 所有的Nginx配置文件都驻留在这里。
/etc/nginx/nginx.conf :主要的Nginx配置文件。 这可以修改,以更改Nginx全局配置。
/etc/nginx/sites-available/ :可存储每个站点服务器块的目录。 除非将Nginx链接到sites-enabled了sites-enabled目录,否则Nginx不会使用此目录中的配置文件。 通常,所有服务器块配置都在此目录中完成,然后通过链接到其他目录启用。
/etc/nginx/sites-enabled/ :存储启用的每个站点服务器块的目录。 通常,这些是通过链接到sites-available目录中的配置文件创建的。
/etc/nginx/snippets :这个目录包含可以包含在Nginx配置其他地方的配置片段。 可重复配置的片段可以重构为片段。
nginx服务器日志文件:
/var/log/nginx/access.log :除非Nginx配置为其他方式,否则每个对您的Web服务器的请求都会记录在此日志文件中。
/var/log/nginx/error.log :任何Nginx错误都会记录在这个日志中。
使用Nginx搭建静态网站
开始建站了,暂时还没想要做些什么东西。
Anyway,先搞个云服务器吧,那要怎么搭建呢?先来个最简单的。
Nginx 配置文件目录一般在 /etc/nginx/ 下,打开 nginx.conf 文件可以看到配置:
当外网用户访问服务器 Web 服务由 Nginx 提供,Nginx 需要配置静态资源的路径信息才能通过 URL 正确访问到服务器上的静态资源。
当我们在服务器上安装并启动 Nginx 之后,就可以通过 ;域名或IP 访问我们的网页了。所以,在浏览器中输入 即可。
我们观察到浏览器的地址变成了 ,这页面是安装 Nginx 的默认站点,可以在 /usr/share/nginx/html 目录下找到。在 nginx.conf 配置文件中,有一项 root /usr/share/nginx/html 的配置,意思是当外网访问服务器 跟目录 时,Nginx 会将资源指向 /usr/share/nginx/html 的站点。
但如果输入地址,无法打开(如下截图)。
以阿里云为例,需要在云服务器添加 “安全组规则” ,添加并保存,重新刷新页面就能打开了。
我习惯将前端静态资源放置到服务器的 /data/www 下,因此将配置修改为 root /data/www 。此时访问 会指向 /data/www/index.html (在不配置 location 的 index 情况下,Nginx 默认配置是 index.html )。
由于我使用的是 Mac 机器,因此可以直接在系统终端使用 scp 命令将本地文件上传到云服务器。
scp (secure copy)用于在 Linux 下进行远程拷贝文件的命令。类似于 cp ,只不过 cp 只能在本机进行拷贝,不能跨服务器。 -r 表示递归复制整个目录。
需要注意一下,下面两种的区别:
其中 1️⃣ 得到的是 /data/www/dist ,而 2️⃣ 得到的是 /data/www 。前者表示将 dist 整个目录拷贝至 /data/www 下。后者是把 dist 目录下的所有子文件和子目录都拷贝至 /data/www 。
换句话说就是,前者配置 root 的路径应该是 /data/www/dist ,后者则为 /data/www 。
效果如下:
在浏览器中访问 即可看到我们配置的网页了。
最简单的 Nginx 部署静态网页就完了,其他的下次再讲...
The end.
通过Nginx部署flask项目和静态站点
安装nginx
安装supervisor( 官方文档 )
安装uwsgi( 官方中文文档 )
启动服务
nginx 日志(默认)
supervisor 日志(默认)
supervisor 查看启动的进程
supervisor相关命令
一般配置文件在 /etc/nginx 目录下
全局配置文件为 nginx.conf ,一般需要改的是下面两项,其他的保持默认就好了
我们要添加配置只需修改 sites-enabled/default
或在 conf.d/ 下面添加配置文件即可,因为在 nginx.conf 中会导入这两个地方的配置文件
静态web服务器只需要有静态文件(html+css+js)和配置Nginx即可
假设我的静态文件在 /home/moco/www/html 目录下
接下来我们来配置nginx
这里为了简单,直接修改 sites-enabled/default
如果要同时配置多个呢?
说下root 和 alias的区别:
alias指定的目录就是要访问的目录,root是要访问目录的上级目录,使用root时,
静态文件的实际路径等于root+location的路径,如上面的第二个location,
站点文件必须在 /home/moco/other/tool/ 下, 而使用alias,则静态文件的路径
就是alias路径,即第三个location站点文件就在 home/moco/www/tool/ 下。
项目路径: /home/moco/www/myflask/
/home/moco/www/myflask/manage.py
虚拟环境: /home/moco/.local/share/virtualenvs/myflask-XuRgNXhR
在虚拟环境中安装 flask 和 uwsgi (pip install uwsgi)
在项目路径下创建uwsgi的配置文件(也可以统一在一个地方创建,如 /etc/uwsgi/ )
uwsgi_config.ini
启动虚拟环境中的uwsgi
配置Nginx 配置文件中的 sites-enabled/default
启动nginx
/home/moco/www/flask_hello/uwsgi_config.ini
/home/moco/www/flask_world/uwsgi_config.ini
因为要启动多个uwsgi的配置文件,这里就用supervisor工具统一启动管理
在 /etc/supervisor/conf.d/ 下分别添加
flask_hello.conf
flask_world.conf
启动supervisor
Nginx配置
下面是flask_hello的访问示例:
评论前必须登录!
注册