2022
我们一起努力

nginx静态服务器配置,nginx 静态服务器

目录:

  • 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的访问示例:

赞(0)
文章名称:《nginx静态服务器配置,nginx 静态服务器》
文章链接:https://www.fzvps.com/174782.html
本站文章来源于互联网,如有侵权,请联系管理删除,本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。
图片版权归属各自创作者所有,图片水印出于防止被无耻之徒盗取劳动成果的目的。

评论 抢沙发

评论前必须登录!