Total Pageviews

Showing posts with label apache. Show all posts
Showing posts with label apache. Show all posts

Friday, 1 November 2024

如何使Apache做反向代理



需要启用apache的反代模块 mod_proxy.c

<VirtualHost *:80>
    ServerName your_domain.com
    ServerAlias

    RewriteEngine On
    RewriteCond %{QUERY_STRING} transport=polling         [NC]
    RewriteRule /(.*)           http://localhost:23366/$1 [P]

    <IfModule mod_proxy.c>
        ProxyRequests Off
        SSLProxyEngine on
        ProxyPass / http://localhost:23366/
        ProxyPassReverse / http://localhost:23366/

    </IfModule>
</VirtualHost>

--------------------------------------------------------

如何用caddy做反向代理

nano /etc/caddy/Caddyfile

yourdomain.com {
  tls /etc/caddy/ssl/cert.pem /etc/caddy/ssl/cert.key

  reverse_proxy http://localhost:23366 {
    header_up X-Forwarded-For {header.X-Forwarded-For}
  }
}

执行重载命令:
systemctl reload caddy 

--------------------------

如何使nginx做反向代理

编辑nginx的配置文件:

server
{
  listen 80;
  listen [::]:80;

  server_name your_domain.com;

  location / {
    proxy_redirect off;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://localhost:23366/;
  }
}

如果你正在使用 CDN 或者 Nginx 等可信的反向代理服务器,那么你需要在「设置」-「服务器」选项 -「代理标头名 (http.proxy_header)」填写包含用户真实 IP 的请求头字段名,如:X-Real-IP

Monday, 15 July 2024

apache启用mod_expires, 为静态页面加上缓存



Expires headers字面翻译:到期头,就是告诉浏览器一个过期时间,在这个过期时间之内,浏览器保留缓存的!这样再次进入博客, 就减少了http 请求了,速度就快了!
如何设置

apache主机的博客目录下有一个.htaccess 这样一个文件(有的是隐藏起来了)。这个文件功能很强大。在里面添加一些语句,就能告诉浏览器到期时间了。

下面一些简单的语句。

    语句格式1:ExpiresByType 类型 A/M+时间(以秒为单位)

A:access表示从浏览器访问时间算起
M:modification表示文件修改时间算起

    如:ExpiresByType image/png A604800 就是设置png格式的缓存时间为7天

    语句格式2:ExpiresByType 类型 描述性语言

描述性语言:modification、access、now |plus|years、months、weeks、days、hours、minutes、seconds

    如:ExpiresByType image/png “access plus 7 days” 设置png格式的缓存时间为7天

    语句格式3:匹配格式

 <FilesMatch "\.(jpg|jpeg|png|gif|swf)$">
  ExpiresDefault A604800
  </FilesMatch>   

    表示匹配jpg|jpeg|png|gif|swf格式的文件缓存为7天

是不是很简单!

然后给出我写的,你可以在此基础上根据你的更改频率修改。

<IfModule mod_expires.c>
#开启
ExpiresActive On

#以下是针对不同的文件类型设置不同的缓存时间
ExpiresByType image/x-icon A2592000
ExpiresByType application/x-javascript A2592000
ExpiresByType text/css A2592000
ExpiresByType image/gif A604800
ExpiresByType image/png A604800
ExpiresByType image/jpeg A604800
ExpiresByType text/plain A604800
ExpiresByType application/x-shockwave-flash A604800
ExpiresByType video/x-flv A604800
ExpiresByType application/pdf A604800
ExpiresByType application/javascript "access plus 1 year"
ExpiresByType image/svg A604800

</IfModule>

一些规则

    静态文件:落实“永不过期”的原则,通过设置一个足够长的过期时间来实现。
    动态文件:设置一个适当的 Cache-Control 头。怎么才算适当?原则很简单,根据这个动态内容的变更频率做出设置,经常修改的,就设置较短的过期时间,不怎么变动的就设置长一些的过期时间。
    html文件绝对不要缓存,否则会出现一系列的问题!这一点在 PageSpeed 的 Leverage browser caching 规则中也明确提到了:

    In general, HTML is not static, and shouldn’t be considered cacheable.

    通常是这些文件类型需要缓存:
        Images: jpg, gif, png
        favicon/ico
        JavaScript: js
        CSS: css
        Flash: swf
        PDF: pdf
        media files:视频,音频文件
    为静态文件名加上时间戳或版本号(非常重要!不然访客怎么知道你的要不要清除缓存来获得最新的代码文件呢)

最后要注意的就是添加了(长时间的) Expires headers 的文件,如果在设置的过期时间内需要修改时,你必须修改文件名或者添加修改文件的时间戳。这样用户再访问页面时,才会向服务器请求新文件。例如你需要修改首页的layout.css文件,你可以这么处理:

// 原来的调用处理
<link href="/css/layout.css" rel="stylesheet" />

// 调用新文件的处理
<link href="/css/layout-v20140913.css" rel="stylesheet" />

// 或者这么处理
<link href="/css/layout.css?version=v20140913" rel="stylesheet" />

参考文章:
apache启用mod_expires或mod_headers设置静态文件缓存时间

 
前端性能优化:Add Expires headers

Friday, 26 August 2022

子目录部署Flask, 解决URL重定向错误

 

初学Flask的朋友,有一些是跟我一样纯为了娱乐,没有什么做项目的需求,也不会有太多接触服务器并部署项目的机会。这类人里不少会有自己的个人主页,相信不少人会想,能不能把自己的Flask小工具发布到个人主页的子目录下呢?

看过不少不懂装懂的人冒充专家一本正经地胡说八道说“开发Flask的哪会有机会在子目录部署项目?”或“Flask本身就是为了完整建站做考量的,谁会在子目录部署项目?”云云。这些人基本上是不太如流的初级程序员,没有见过大阵仗。因为在不同层级的目录配置不同项目在企业界是相当常见的,如果你只是单纯参加了一个小团队开发了一个小型app就在这胡说八道,那是误导热心群众。

我先说一下不少人的疑惑是什么,举一个网上看到的例子:

我在个人主页 http://abc.com 创建了一个叫app的子目录,部署了一个Flask程序,app一切正常。输入http://abc.com/app,一切正常。于是我开始增加一个登录功能,当用户访问首页http://abc.com/app时,如果发现用户没有登录,自动跳转到http://abc.com/app/login 却重定向到了http://abc.com/login,导致了404找不到页面的错误。我试了很多很多方法,都没搞定,求助大家。

关于这个问题怎么解答的都有,有人扯 URL_PREFIX,也有扯 APPLICATION_ROOT的,更有人哗众取宠说 “当然还有个办法是自己实现 url_for,但是你不一定能做好”。这种解决方式是完全找错了根源,虽然这是目录定向错误的问题,但根本原因不在于Flask项目本身的路径识别,因此跟PREFIX和APPLICATION_ROOT没有半毛钱关系。我还看到有人说Blueprint的,这个接近了,但还是没有绕出Flask本身的思维壁垒。

真正的解决方式,其实很简单,可以说超级简单,爆简单!因为根本问题不在于Flask项目本身内部结构,因为内部一通乱配置你还是会发现虽然路径看似对了但依然返回404。解决问题的根源在于自目录下.htaccess文件,一般无论GoDaddy也好,Bluehost 或者 Namecheap 也好,但凡使用cPanel的这类 web host基本上在你创建了Python 小程序后,会自动在自目录下创建一个.htaccess文件,包含 PassengerAppRoot, PassengerBaseURI 以及 PassengerPython 三行代码,你只需要在第四行加入一段

RewriteCond %{REQUEST_URI} !^/YourSubDirectory

完事.