在Debian 8上使用Varnish和NGINX通过SSL和HTTP提供WordPress服务

Varnish是一个功能强大且灵活的缓存HTTP反向代理。它可以安装在任何Web服务器的前方来缓存其内容,这将提高速度并减少服务器负载。当客户端请求网页时,Varnish首先尝试从缓存中发送它。如果页面未缓存,Varnish会将请求转发到后端服务器,获取响应,将其存储在缓存中,然后将其传递给客户端。

当通过Varnish请求缓存资源时,请求不会到达Web服务器,也不会涉及PHP或MySQL执行。相反,Varnish从内存中读取它,并在几微秒内转发缓存页面。

Varnish的一个缺点是它不支持SSL加密的流量。您可以使用NGINX作为后端Web服务器以及进行SSL解密来解决此问题。将NGINX用于这两项任务可降低设置的复杂性,从而减少潜在的故障点,降低资源消耗,并减少组件的维护力度。

Varnish和NGINX都是具有多种用途的多功能工具。本指南使用Varnish 4.0,它包含在Debian 8存储库中,并提供了一个基本设置,您可以根据自己的特定需求进行优化。

Varnish和NGINX如何协同工作

在本向导中,我们将为两个WordPress站点配置NGINX和Varnish:

  • www.example-over-http.com 将是一个未加密的,仅限HTTP的网站。
  • www.example-over-https.com 将是一个单独的HTTPS加密站点。

对于HTTP流量,Varnish将侦听端口80。如果在缓存中找到了内容,Varnish将为其提供服务。如果没有,它会将请求传递给 8080端口上的NGINX。在第二种情况下,NGINX会将请求的内容发送回同一端口上的Varnish,然后Varnish会将获取的内容存储在缓存中并通过通过80端口将其传送到客户端。

对于HTTPS流量,NGINX将侦听端口443并将解密的流量发送到端口上的Varnish 80。如果在缓存中找到内容,Varnish会将未加密的内容从缓存发送回NGINX,NGINX会对其进行加密并将其发送给客户端。如果在缓存中找不到内容,Varnish将从8080端口上的NGINX去请求数据,将其存储在缓存中,然后将其未加密地发送到前端NGINX,后者将对其进行加密并将其发送到客户端的浏览器。

我们的设置如下图所示。请注意,前端NGINX和后端NGINX是同一台服务器:

准备工作

本教程假设您拥有对运行Debian 8(Jessie)的Linode的SSH访问权限。在开始之前:

  1. 完成“ 入门”和“ 保护服务器安全”向导中的步骤。您需要一个标准用户帐户sudo,该帐户拥有本向导中许多命令的权限。
  2. 按照我们在Debian 8上配置LEMP列出的步骤进行操作。跳过NGINX配置部分,因为我们将在本向导的后面部分介绍它。
  3. 根据本向导配置NGINX后,请按照WordPress向导中的步骤安装和配置WordPress。我们的说明中将包含一个步骤,让您知道何时执行此操作。

安装和配置Varnish

对于本节中的所有步骤,将203.0.113.100替换为您的Linodes公共IPv4地址,2001:DB8::1234替换为IPv6地址。

  • 更新软件包存储库并安装Varnish:
sudo apt-get update sudo apt-get install varnish
  • 用sudo权限执行/etc/default/varnish。为了确保Varnish处于启动状态,在Should we start varnishd at boot?下设置STARTyes
  /etc/default/varnish      1    
START=yes  
  • Alternative 2部分中,进行以下更改为DAEMON_OPTS
/etc/default/varnish      1 2 3 4 5
DAEMON_OPTS="-a :80 \             -T localhost:6082 \             -f /etc/varnish/custom.vcl \             -S /etc/varnish/secret \             -s malloc,1G"

这将设置Varnish监听80端口并指示它使用custom.vcl配置文件。使用自定义配置文件,以便将来对Varnish的更新不会覆盖default.vcl。 用-s malloc,1G命令行设置Varnish用于存储内容的最大RAM量。您可以根据服务器的总RAM量以及网站的大小和预期流量,按照您的需要来调整此值。例如,在有4 GB RAM的系统上,您可以为Varnish分配2或3 GB。 进行这些更改后,保存并退出该文件。

创建自定义Varnish配置文件

  • 若要自定义Varnish配置,请首先创建一个名为的新文件custom.vcl:
sudo touch /etc/varnish/custom.vcl
  • Varnish配置使用名为Varnish配置语言(VCL)的领域特定语言。首先,指定使用的VCL版本:
/etc/varnish/custom.vcl 1
vcl 4.0;
  • 通过添加后端默认指令指定后端(NGINX)监听8080端口:
/etc/varnish/custom.vcl 1 2 3 4
backend default { .host = "localhost"; .port = "8080"; }
  • 使用acl指令从localhost获得允许缓存清除请求:
/etc/varnish/custom.vcl1 2 3 4 5
acl purger { "localhost"; "203.0.113.100"; "2001:DB8::1234"; }

请记住将您的Linode的实际IP地址替换为示例地址。

  • 创建sub vcl_recv例程,该例程会在HTTP客户端发送请求时使用。
/etc/varnish/custom.vcl 1 2 3 4
sub vcl_recv {   }

在下面的步骤的设置应放在sub vcl_recv的括号里面

  • 将SSL请求的HTTP请求重定向到HTTPS:

/etc/varnish/custom.vcl 1 2 3 4
if (client.ip != "127.0.0.1" && req.http.host ~ "example-over-https.com") { set req.http.x-redir = "https://www.example-over-https.com" + req.url; return(synth(850, "")); }

请记住用您自己的域替换示例域。

  • acl purger从IP地址中获得允许缓存清除请求。如果清除请求来自不同的IP地址,则会产生错误消息:

/etc/varnish/custom.vcl 1 2 3 4 5 6
if (req.method == "PURGE") { if (!client.ip ~ purger) { return(synth(405, "This IP is not allowed to send PURGE requests."));   } return (purge); }
  • 更改X-Forwarded-For标头:
/etc/varnish/custom.vcl 1 2 3 4 5
if (req.restarts == 0) { if (req.http.X-Forwarded-For) { set req.http.X-Forwarded-For = client.ip;   } }
  • 从缓存中排除POST请求或具有基本身份验证的请求:
/etc/varnish/custom.vcl 1 2 3
if (req.http.Authorization || req.method == "POST") { return (pass); }
  • 从缓存中排除RSS提要:
/etc/varnish/custom.vcl 1 2 3
if (req.url ~ "/feed") { return (pass); }
  • 告诉Varnish不要缓存WordPress管理员和登录页面:
/etc/varnish/custom.vcl 1 2 3
if (req.url ~ "wp-admin|wp-login") { return (pass); }
  • WordPress设置了许多可以安全可忽略的cookies。若要删除它们,请添加以下行:
/etc/varnish/custom.vcl 1 2 3 4 5
set req.http.cookie = regsuball(req.http.cookie, "wp-settings-\d+=[^;]+(; )?", ""); set req.http.cookie = regsuball(req.http.cookie, "wp-settings-time-\d+=[^;]+(; )?", ""); if (req.http.cookie == "") { unset req.http.cookie;   }

注意 这是放在sub vcl_recv例程中的最终设置。以下步骤中的所有指令应放在最后一个括号之后。

  • 用带有以下设置的sub vcl_synth指令将HTTP重定向到HTTPS :
/etc/varnish/custom.vcl 1 2 3 4 5 6 7
sub vcl_synth {  if (resp.status == 850) {      set resp.http.Location = req.http.x-redir;      set resp.status = 302;      return (deliver);  } }
  • 每次我们对特定页面进行编辑时,都必须清除该页面的缓存。为实现这一点,我们使用sub vcl_purge指令:
/etc/varnish/custom.vcl 1 2 3 4 5
sub vcl_purge {  set req.method = "GET";  set req.http.X-Purger = "Purged";  return (restart); }
  • sub vcl_backend_response指令用于处理与后端服务器NGINX的通信。我们使用它来设置在缓存中保留内容的时间量。我们还可以设置宽限期,它可以决定即使后端服务器关闭,Varnish如何从缓存中提供内容的时间。时间可以以秒(s),分钟(m),小时(h)或天(d)来设定。在这里,我们将缓存时间设置为24小时,将宽限期设置为1小时,但您可以根据需要调整这些设置:
/etc/varnish/custom.vcl1 2 3
sub vcl_backend_response {  set beresp.ttl = 24h;  set beresp.grace = 1h;
  • 在使用括弧关闭vcl_backend_response块之前,只有在管理页面或WooCommerce特定页面上时才允许设置cookie:
/etc/varnish/custom.vcl1 2 3 4
if (bereq.url !~ "wp-admin|wp-login|product|cart|checkout|my-account|/?remove_item=") { unset beresp.http.set-cookie; }         }

请记住在上面的系列中包含任何需要使用cookie的页面,例如phpmyadmin|webmail|postfixadmin,等等。如果您将WordPress将登录页面wp-login.php更改为其他页面时,请将该新名称添加到此系列中。 注意 “WooCommerce Recent Viewed”小部件可以显示一组最近查看过的产品,使用cookie来存储最近用户特定的操作,此cookie可防止Varnish在访问者浏览产品页面时缓存它们。如果要在仅浏览产品页面时缓存产品页面,则在将产品添加到购物车之前,必须禁用此窗口小部件。 如果您希望Varnish尽可能多地缓存页面,则需在启用使用cookie存储最近特定于用户的活动的小部件时特别注意。

  • 通过添加sub vcl_deliver指令来更改清除请求的标头:
/etc/varnish/custom.vcl1 2 3 4 5
sub vcl_deliver { if (req.http.X-Purger) { set resp.http.X-Purger = req.http.X-Purger;   } }

这样就完成了custom.vcl配置。您现在可以保存并退出该文件。最终custom.vcl文件将跟此文件相似。 注意 您可以使用上面的链接下载完整的示例配置文件wget。若要这样做,请记住如上所述替换变量。

编辑Varnish启动配置

  • 为使Varnish正常工作,我们还需要编辑/lib/systemd/system/varnish.service文件以使用我们的自定义配置文件。具体来说,我们将告诉它使用自定义配置文件并修改端口号和分配的内存值以匹配我们在/etc/default/varnish文件中所做的更改。 打开/lib/systemd/system/varnish.service并找到开头ExecStart的两行。将它们修改为如下所示:
/lib/systemd/system/varnish.service 1 2
ExecStartPre=/usr/sbin/varnishd -C -f /etc/varnish/custom.vcl ExecStart=/usr/sbin/varnishd -a :80 -T localhost:6082 -f /etc/varnish/custom.vcl -S /etc/varnish/secret -s malloc,1G
  • 保存并退出文件后,重新加载systemd进程:
sudo systemctl daemon-reload

安装和配置PHP

在配置NGINX之前,我们必须安装PHP-FPM。FPM是FastCGI Process Manager的简称,它允许Web服务器充当代理,将带有.php文件扩展名的所有请求传递给PHP解释器。

  • 安装PHP-FPM:
sudo apt-get install php5-fpm php5-mysql
  • 打开/etc/php5/fpm/php.ini文件。找到指令cgi.fix_pathinfo=,取消注释并将其设置为0。如果此参数设置为1,PHP解释器将尝试处理其路径最接近请求路径的文件; 如果设置为0,则解释器将仅使用确切路径处理文件,这是一个更安全的选项。
/etc/php5/fpm/php.ini 1
cgi.fix_pathinfo=0

完成此更改后,保存并退出该文件。

  • 打开/etc/php5/fpm/pool.d/www.conf并确认listen =指令(指定NGINX用于将请求传递给PHP-FPM的套接字​​)与以下内容匹配:
/etc/php5/fpm/pool.d/www.conf 1
listen = /var/run/php5-fpm.sock

保存并退出该文件。

  • 重启PHP-FPM:
sudo systemctl restart php5-fpm
  • 打开/etc/nginx/fastcgi_params并找到fastcgi_param HTTPS指令。在它下面,添加以下两行,这是NGINX与FastCGI服务交互所必需的:
/ etc / nginx的/ fastcgi_params 1 2
fastcgi_param  SCRIPT_FILENAME    $request_filename; fastcgi_param  PATH_INFO          $fastcgi_path_info;

完成后,保存并退出文件。

配置NGINX

  • 打开/etc/nginx/nginx.conf并注释掉ssl_protocolsssl_prefer_server_ciphers指令。我们将在/etc/nginx/sites-enabled/default文件中的服务器块中包含这些SSL设置:
/etc/nginx/nginx.conf1 2
# ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE # ssl_prefer_server_ciphers on;
  • 由于将为服务器块中的每个网站定义访问日志和错误日志,因此请注释掉access_logerror_log指令:
/etc/nginx/nginx.conf1 2
# access_log /var/log/nginx/access.log; # error_log /var/log/nginx/error.log;

保存并退出该文件。

  • 接下来,我们将配置仅限HTTP的网站www.example-over-http.com。首先备份默认服务器块(虚拟主机)文件:
sudo mv /etc/nginx/sites-available/default /etc/nginx/sites-available/default-backup
  • 打开一个新/etc/nginx/sites-available/default文件并添加以下块:
/etc/nginx/sites-available/default 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
server {   listen  8080;   listen  [::]:8080;   server_name  example-over-http.com;   return       301 http://www.example-over-http.com$request_uri; }  server {   listen 8080;   listen [::]:8080;   server_name  www.example-over-http.com;   root /var/www/html/example-over-http.com/public_html;   port_in_redirect off;   index index.php;   location / {   try_files $uri $uri/ /index.php?$args;        }    location ~ \.php$ {        try_files $uri =404;        fastcgi_split_path_info ^(.+\.php)(/.+)$;        include fastcgi_params;        fastcgi_index index.php;        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;        fastcgi_pass unix:/var/run/php5-fpm.sock;        }  error_log /var/www/html/example-over-http.com/logs/error.log notice;  }

这里有几点需要注意:

  • 第一台服务器块用于所有请求重定向example-over-http.comwww.example-over-http.com。这假设您要使用www子域并为其添加了DNS A记录。
  • listen [::]:8080; 如果您希望您的站点也可以通过IPv6访问,则需要。
  • port_in_redirect off; 阻止NGINX将端口号附加到请求的URL。
  • fastcgi 指令用于通过FastCGI协议将PHP代码执行请求代理到PHP-FPM。

  • 若要为SSL加密的网站配置NGINX(在我们的示例中,我们称之为www.example-over-https.com),您需要另外两个服务器块。将以下服务器块附加到您的/etc/nginx/sites-available/default文件:
/etc/nginx/sites-available/default 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
server {    listen  443 ssl;    listen  [::]:443 ssl;    server_name  www.example-over-https.com;    port_in_redirect off;     ssl                  on;    ssl_certificate      /etc/nginx/ssl/ssl-bundle.crt;    ssl_certificate_key  /etc/nginx/ssl/example-over-https.com.key;    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;    ssl_ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS;    ssl_prefer_server_ciphers   on;     ssl_session_cache   shared:SSL:20m;    ssl_session_timeout 60m;     add_header Strict-Transport-Security "max-age=31536000";    add_header X-Content-Type-Options nosniff;     location / {      proxy_pass http://127.0.0.1:80;      proxy_set_header Host $http_host;      proxy_set_header X-Forwarded-Host $http_host;      proxy_set_header X-Real-IP $remote_addr;      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;      proxy_set_header X-Forwarded-Proto https;      proxy_set_header HTTPS "on";       access_log /var/www/html/example-over-https.com/logs/access.log;      error_log  /var/www/html/example-over-https.com/logs/error.log notice;      } }  server {    listen 8080;    listen [::]:8080;    server_name  www.example-over-https.com;    root /var/www/html/example-over-https.com/public_html;    index index.php;    port_in_redirect off;     location / {       try_files $uri $uri/ /index.php?$args;    }     location ~ \.php$ {        try_files $uri =404;        fastcgi_split_path_info ^(.+\.php)(/.+)$;        include fastcgi_params;        fastcgi_index index.php;        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;        fastcgi_param HTTPS on;        fastcgi_pass unix:/var/run/php5-fpm.sock;        } }

对于SSL加密的网站,您需要一个服务器块来接收端口443上的流量,并将解密的流量传递到端口上的Varnish 80端口,以及另一个服务器块,以便8080端口在Varnish请求时将未加密的流量提供给端口上的Varnish。 警告 ssl_certificate指令必须指定SSL证书文件的位置和名称。请查看我们的指向导在NGINX上配置SSL以获取更多信息,并根据需要更新ssl_certificatessl_certificate_key值。 或者,如果您没有商业签名的SSL证书(由CA颁发),您可以使用openssl发出自签名SSL证书,但这只能用于测试目的。在浏览器中打开时,自签名站点将返回“此连接不受信任”消息。 现在,让我们回顾一下前两个服务器块的关键点:

  • ssl_session_cache shared:SSL:20m;创建所有工作进程之间共享的20MB缓存。此缓存用于存储SSL会话参数,以避免并行和后续连接的SSL握手。1MB可以存储大约4000个会话,因此请根据您网站的预期流量调整此缓存大小。
  • ssl_session_timeout 60m;指定SSL会话高速缓存超时时间。这里设置为60分钟,但可以减少或增加,具体取决于流量和资源。
  • ssl_prefer_server_ciphers on; 表示建立SSL连接时,服务器密码优先于客户端密码。
  • add_header Strict-Transport-Security "max-age=31536000";告诉Web浏览器,他们应该只使用安全的HTTPS连接与此服务器进行交互。在max-age中以秒为单位指定哪个时间段该网站是愿意接受HTTPS只连接。
  • add_header X-Content-Type-Options nosniff;此标头告诉浏览器不要覆盖响应内容的MIME类型。因此,如果服务器说内容是文本,浏览器将把它呈现为文本。
  • proxy_pass http://127.0.0.1:80;该指令将所有解密的流量代理到Varnish,后者侦听端口80
  • proxy_set_header 指令为请求添加特定标头,因此可以识别SSL流量。
  • access_logerror_log指出相应类型日志的位置和名称。根据您的设置调整这些位置和名称,并确保www-data用户有权修改每个日志。
  • fastcgi 最后一个服务器块中存在的指令是通过FastCGI协议将PHP代码执行代理请求代理到PHP-FPM所必需的。

  • 可选:要防止通过直接将IP地址输入浏览器来访问您的网站,您可以将一个包含所有默认服务器块放在文件顶部:
/etc/nginx/sites-available/default 1 2 3 4 5 6 7
server {   listen 8080 default_server;   listen [::]:8080;   server_name _;   root /var/www/html;   index index.html; }

/var/www/html/index.html文件可以包含一个简单的消息,如“找不到页面!”

  • 重启NGINX,然后启动Varnish:
sudo systemctl restart nginx sudo systemctl start varnish
  • 若要安装WodrPress,请参照我们的如何安装和配置WordPress向导。安装WordPress后,请继续阅读本向导。
  • 安装WordPress后,重新启动Varnish以清除任何缓存的重定向到设置页面:
sudo systemctl restart varnish

安装WordPress“Varnish HTTP Purge”插件

当您编辑WordPress页面并对其进行更新时,即使刷新浏览器也不会显示修改,因为它将收到页面的缓存版本。要在编辑页面时自动清除缓存页面,必须安装一个名为“Varnish HTTP Purge”的免费WordPress插件。

要安装此插件,请登录您的WordPress网站,然后单击左侧边栏上的插件。选择页面顶部的Add New,然后搜索Varnish HTTP Purge。找到后,单击立即安装,然后单击激活

测试您的设置

  • 要测试Varnish和NGINX是否正在为HTTP网站执行其工作,请运行:
wget -SS http://www.example-over-http.com

输出应如下所示:

    --2016-11-04 16:48:43--  http://www.example-over-http.com/     Resolving www.example-over-http.com (www.example-over-http.com)... your_server_ip     Connecting to www.example-over-http.com (www.example-over-http.com)|your_server_ip|:80... connected.     HTTP request sent, awaiting response...       HTTP/1.1 200 OK       Server: nginx/1.6.2       Date: Sat, 26 Mar 2016 22:25:55 GMT       Content-Type: text/html; charset=UTF-8       Link: <http://www.example-over-http.com/wp-json/>; rel="https://api.w.org/"       X-Varnish: 360795 360742       Age: 467       Via: 1.1 varnish-v4       Transfer-Encoding: chunked       Connection: keep-alive       Accept-Ranges: bytes     Length: unspecified [text/html]     Saving to: \u2018index.html.2\u2019      index.html              [ <=>                  ]  12.17K  --.-KB/s   in 0s      2016-03-27 00:33:42 (138 MB/s) - \u2018index.html.2\u2019 saved [12459]

第三行指定连接端口号:80。正确识别后端服务器:Server: nginx/1.6.2。流量按预期通过Varnish : Via: 1.1 varnish-v4。让通过Varnish将对象保存在缓存中的时间段也以秒为单位显示:Age: 467

  • 若要测试SSL加密的网站,请运行相同的命令,替换URL:
wget -SS https://www.example-over-https.com

输出应类似于仅HTTP站点的输出。 注意 如果您在测试时使用自签名证书,请将该--no-check-certificate选项添加到wget命令:

wget -SS -no-check-certificate https://www.example-over-https.com

接下来的步骤

通过将nginx与Varnish结合使用,可以大大提高任何WordPress网站的速度,同时充分利用您的硬件资源。

您可以通过生成自定义Diffie-Hellman(DH)参数来增强SSL连接的安全性,以实现更安全的加密密钥交换过程。

另一个附加配置选项是为普通HTTP网站启用Varnish日志记录,因为现在Varnish将是第一个接收客户端请求的,而NGINX只接收对缓存中找不到的那些页面的请求。对于SSL加密的网站,日志记录应由NGINX完成,因为客户端请求首先通过它。如果使用Fail2ban,Awstats或Webalizer 等日志监控软件,日志记录将变得更加重要。

更多信息

有关此主题的其他信息,您可能需要参考以下资源。虽然提供这些是希望它们有用,但请注意,我们无法保证外部托管材料的准确性或及时性。

本文的版权归 lucbunny 所有,如需转载请联系作者。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Aloys的开发之路

SVN+Apache域用户认证配置方法_Windows(转,重新排版,部分内容更新优化)

背景说明 作为一个团队开发,公司长期以来的实践证明,手工操作版本管理是非常不明智的,一来浪费人力,二来效率低下,三来容易犯错。那么版本管理用什么工具好呢? 在开...

314100
来自专栏贾鹏辉的技术专栏@CrazyCodeBoy

React Native发布APP之签名打包APK

React Native发布APP之签名打包APK ---- 用React Native开发好APP之后,如何将APP发布以供用户使用呢?一款APP的发布流程...

29050
来自专栏Google Dart

Dart服务器端 mojito包 原

就像它的名字一样,Mojito主要是糖和其他成分的混合物。 Mojito故意在几个shelf包上非常薄,并专注于构建应用程序的整体体验。

22510
来自专栏云计算教程系列

如何在Ubuntu 16.04上使用Alerta监视Zabbix警报

Alerta是一个Web应用程序,用于合并和删除来自多个监视系统的警报,并在界面上显示它们。Alerta可以与许多的监控工具集成,如Nagios,Zabbix,...

24440
来自专栏FreeBuf

经验分享 | Burpsuite抓取非HTTP流量

使用Burp对安卓应用进行渗透测试的过程中,有时候会遇到某些流量无法拦截的情况,这些流量可能不是HTTP协议的,或者是“比较特殊”的HTTP协议(以下统称非HT...

1K100
来自专栏沈唁志

在Ubuntu 16.04上安装Roundcube

Roundcube是一个基于网络的IMAP电子邮件客户端,提供类似于谷歌Gmail的用户界面。它是用PHP编写的服务器端应用程序,旨在访问电子邮件服务器或服务。...

62310
来自专栏CRPER折腾记

一篇不大靠谱的nginx 1.11.10配置文件

网站是前后端分离,前端打包站点部署需要自力更生,为了避免跨域问题. 选择了nginx这个知名的反向代理服务器. 这里不探究安装这种问题。。。

8620
来自专栏禅林阆苑

利用NextCloud配置私有云 【原创】

利用NextCloud配置私有云 Write By CS逍遥剑仙 我的主页: www.csxiaoyao.com GitHub: github...

2.5K80
来自专栏小巫技术博客

Android Library上传到JCenter仓库实践

11940
来自专栏.Net移动开发

关于发布IOS的方法(本人亲身经历折腾很久终于成功)

前情提要:这位.NET程序员兄弟使用Smobiler开发了一个APP,尽管Smobiler云平台已经最大限度的简化了iOS应用的打包操作,但仍绕不开苹果公司强制...

16910

扫码关注云+社区

领取腾讯云代金券