apache服务器出现No input file specified.解决方案

APACHE服务器出现No input file specified.解决方案 thinkcmf程序默认的.htaccess里面的规则:

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</IfModule>

“No input file specified.”,是没有得到有效的文件路径造成的。

修改伪静态规则,如下:

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?/$1 [QSA,PT,L]
</IfModule>

就是正则结果“/$1”前面多加了一个“?”号。。

Apache禁止访问目录

本文将详细介绍如何操作禁止显示apache网站根目录

进入apache的配置文件 httpd.conf 找到:

vim /etc/httpd/conf/httpd.conf

Options Indexes FollowSymLinks

修改为:

Options FollowSymLinks

其实就是将Indexes去掉,Indexes表示若当前目录没有index.html就会显示目录结构。

重启Apache服务器

nginx和apache添加brotli算法压缩网站

什么是brotli?

brotli是Google开发的最新压缩算法,有效减少网站传输数据
具体内容请查看WIKI
https://en.wikipedia.org/wiki/Brotli

安装依赖文件[仅限centos]

yum groupinstall 'Development Tools' -y
yum install cmake -y

编译安装brotli库

wget https://github.com/google/brotli/archive/v1.0.3.tar.gz
tar -zxvf v1.0.3.tar.gz
cd brotli-1.0.3
./configure-cmake
make 
make test 
make install

apache/nginx添加编译参数

 "--enable-brotli"  
"--with-brotli=/usr/local/lib"    #apache官方模块,依赖brotli库 

--add-module=../ngx_brotli-master   #添加ngx_brotli模块编译

ngx_brotli模块下载地址
https://github.com/google/ngx_brotli
https://github.com/eustas/ngx_brotli

apache/nginx修改配置文件

http://httpd.apache.org/docs/2.4/mod/mod_brotli.html
apache修改文件 /etc/httpd/conf/extra/httpd-deflate.conf

<IfModule brotli_module> 
 SetOutputFilter BROTLI_COMPRESS;DEFLATE
 SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip no-brotli dont-vary
 BrotliCompressionQuality  6
 BrotliCompressionWindow 18
 AddOutputFilterByType BROTLI_COMPRESS text/html text/plain text/css text/xml
 AddOutputFilterByType BROTLI_COMPRESS application/x-javascript application/javascript
 AddOutputFilterByType BROTLI_COMPRESS application/rss+xml
 AddOutputFilterByType BROTLI_COMPRESS application/xml
 AddOutputFilterByType BROTLI_COMPRESS application/json
</IfModule>
#nginx配置文件  
    brotli on;
    brotli_types text/html text/plain text/javascript text/css text/xml text/x-component application/javascript application/x-javascript application/xml application/json application/xhtml+xml application/rss+xml application/atom+xml application/x-font-ttf application/vnd.ms-fontobject image/svg+xml image/x-icon font/opentype;
    brotli_static off;
    brotli_comp_level 6;
    brotli_buffers 8 16k;
    brotli_window 512k;
    brotli_min_length 512;

出错解决办法

nginx: error while loading shared libraries: libbrotlienc.so.1: cannot open shared object file: No such file or directory
可行的解决方案之一,是把对应的库文件做软链接:

# 64 位系统  
 ln -s /usr/local/lib/libbrotlienc.so.1 /lib64 
 ln -s /usr/local/lib/libbrotlicommon.so.1  /lib64

# 32 位系统  
ln -s /usr/local/lib/libbrotlienc.so.1 /lib 
ln -s /usr/local/lib/libbrotlicommon.so.1  /lib

重载nginx,若无报错,即问题解决
nginx -s reload

Let’s Encrypt配置免费SSL证书建立HTTPS(Ubuntu+Apache)

前言

这段时间在开发微信小程序,需要一个后台服务器,KP小站刚好能够派上用上。不过,微信规定必须使用HTTPS链接,于是按照DigitalOcean的官方教程,利用Let’s Encrypt配置免费SSL简书。过程还是很简单的,虽然遇到了一个小问题,不过Google后也顺利解决了,这里简单分享下心得。

一. 什么是HTTPS?

  1. HTTP表示超文本传输协议(HyperText Transfer Protocol),用来传输客户端(浏览器)和WEB服务器之间的内容。当你访问kplayer.me时,服务器就把html,css,js以及图像等文件通过该协议传输到你的浏览器,你的浏览器解析后就展现主页的内容。

  2. 但是HTTP协议有个问题就是它是明文的,这样就存在安全隐患,如传输内容会被偷窥和窃取;另外在HTTP中通信双方的身份没有进行验证,可能会出现伪装身份的情况,由于任何人都能对服务器发起请求,也使服务器易受DOS攻击;最后客户端无法确定接受报文的完整性,因为中途可能被篡改。

  3. 那么HTTPS呢?它表示HTTP over SSL,其中的S表示SSL:Secure Socket Layer,中文叫“安全套接层”。SSL利用数据加密技术,防止数据在网络传输过程中不会被截取及窃听。它最早为网景公司Netscape所研发,在IETF(国际互联网工程任务组)进行标准化后改名为 TLS(Transport Layer Security),中文叫做“传输层安全协议”,现在我们常能看到二者的合称SSL/TLS。

  4. HTTPS的具体原理是什么?

理解原理之前需要简单介绍几个相关的概念。

4.1 对称密钥和非对称密钥

对称密钥就是客户端和服务器都拥有一把相同的钥匙,用来对报文加解密。打个比方,我有个机密文件想要传给你,但又怕中间被人窃取了,所以我用WinRAR进行口令加密压缩,然后传输给你,你收到文件时输入口令解压即可,这就是对称密钥/口令。但是我怎么安全的告诉你口令是什么呢?至少第一次肯定需要传输口令,这似乎又回到了安全传输的困境,如果这个口令不能安全的传递给你,在过程中被窃取了,那么这种加密方式又有什么意义?

非对称密钥就是加解密使用不同的密钥。那怎么用呢?首先我作为服务器在本地生成一对密钥,一个是公有密钥,一个是私有密钥。我把公有密钥告诉你,你用来进行对文件加密传输,我收到文件后用我的私有密钥进行解密,获得最终文件。相比对称密钥,不必担心密钥的安全传输问题,因为即使公钥被截获,也无法被解密。

4.2 数字摘要与数字签名

有了非对称密钥,有助于客户端和服务端之间的数据不被偷窥和窃取。但是这似乎并不能防止传输的数据被篡改(对于客户端来说),另外如何保证数据是真实服务器发送的而不是被调包过的呢?于是,数字摘要和数字签名技术就被引入了。a) 服务器采用Hash函数对报文生成“摘要”;b) 服务器再用私钥对这个摘要进行加密,作为“数字签名”连同报文发给客户端;c) 客户端收到后,提取数字签名用服务器的公钥进行解密,如果能得到摘要,那说明是真实服务器发送的;d) 客户端再对接收的报文采用与服务器相同的Hash函数处理得到本地摘要,如果与刚刚解密出来的摘要完全一致,那说明报文没有被篡改过。

未分类

4.3 数字证书

有了数字签名,似乎安全性已经得到了保证。真的是这样么?任何存在不可信任风险的地方都有可能被利用。在数字签名中,客户端收到报文后需要用服务器的公钥进行解密,那么如果有不法者偷偷替换了服务器公钥为自己的公钥呢?那么该不法者就可以用自己的私钥生成数字签名发送报文给客户端。因此最大的问题就在于:对于客户端来说,如何确保它所得到的公钥一定是从目标服务器那里发布的,而且没有被篡改过呢?这时候就需要一个权威的第三方机构来统一对外发放公钥,就是所谓的证书权威机构(Certificate Authority, CA),由服务器管理者向CA申请,认证后CA会给服务器管理者颁发“数字证书”(含主机机构名称、公钥等文件),于是服务器在之后发送报文给客户端时只需要加上数字证书即可,客户用CA的公钥验证后就可确认来源的可靠性。

4.4 HTTPS

了解了以上的内容,现在我们来了解下HTTPS的流程:

未分类

a. 客户端使用HTTPS的URL链接向服务器发起请求,如https://kplayer.me;

b. WEB服务器收到请求后将网站的证书信息(含公钥等)发送给客户端;

c. 客户端根据“证书管理器”判断证书是否被冒用,或者公钥是否有效,有问题则发出警告;

d. 如果证书和公钥有效,则客户端首先生成一个随机(对称)数串,并生成客户端版的共享密钥;

e. 客户端再用公钥对数串进行对称密钥加密,之后发送给服务器;

f. 服务器收到这个加密后的随机数串,只需要用私有密钥就能解密出该随机数串;

g. 服务器以随机数串生成服务器端的共享密钥;

h. 至此,客户端和服务端拥有相同共享密钥,则可以利用共享密钥进行安全通信。

从以上流程可以看出HTTPS采用HTTP+SSL的方式使得网站的访问更加安全,但它也使得通信信息量增加,速率降低,消耗更多的服务器资源,而且向认证机构购买证书也是一笔开销,因此在HTTP和HTTPS的选择上要视网站的功能和需求而定。

二、Let’s Encrypt是什么?

SSL证书按大类一般可分为DV SSL、OV SSL、EV SSL证书,也叫做域名型、企业型、增强型证书。

域名型SSL证书(DV SSL):信任等级普通,只需验证网站的真实性便可颁发证书保护网站;

企业型SSL证书(OV SSL):信任等级强,须要验证企业的身份,审核严格,安全性更高;

增强型SSL证书(EV SSL):信任等级最高,一般用于银行证券等金融机构,审核严格,安全性最高,同时可以激活绿色网址栏。

对于个人博客和站点,申请个免费的DV型SSL证书最划算。Let’s Encrypt 是一个免费、开放,自动化的证书颁发机构,由 ISRG(Internet Security Research Group)运作。

https://letsencrypt.org/

ISRG 是一个关注网络安全的公益组织,其赞助商从非商业组织到财富100强公司都有,包括 Mozilla、Akamai、Cisco、Facebook,密歇根大学等等。ISRG 以消除资金,技术领域的障碍,全面推进加密连接成为互联网标配为自己的使命。

三、如何使用Let’s Encrypt配置SSL证书?

官方教程在此:

https://www.digitalocean.com/community/tutorials/how-to-secure-apache-with-let-s-encrypt-on-ubuntu-16-04

1. 安装Let’s Encrypt客户端

a) 新增软件包目录:

sudo add-apt-repository ppa:certbot/certbot

并按回车ENTER确认

b) 更新新增的目录信息

sudo apt-get update

c) 安装官方客户端Cerbot

sudo apt-get install python-certbot-apache

2. 配置SSL证书

sudo certbot –apache -d kplayer.me

根据提示输入对应指令即可,过程中会要求提供Email用于丢失密钥恢复和相关通知,也会让你选择同时启用http和https访问,或者强制所有请求重定向到https。

另外,如果想要证书对对多个域名或子域名有效,可以增加参数,如下(建议第一个是主域名):

sudo certbot –apache -d kplayer.me -d http://www.kplayer.me

如果有多个域名的话,可以多次调用cerbot命令。

安装完成后,可以在浏览器输入以下地址,确认是否成功:

https://www.ssllabs.com/ssltest/analyze.html?d=kplayer.me&latest

成功的话,就可以使用https://kplayer.me来访问小站啦。

不过KP君在执行时收到如下报错信息:

Client with the currently selected authenticator does not support any combination of challenges that will satisfy the CA.

一阵Google后,原来由于安全问题,Let’s Encrypt已经停止提供Certbot的Apache和Nginx插件所用的机制,计划在接下来的日子里发布一个新版本的Certbot,如果急需要用的话,可以采用临时的方法:

sudo certbot –authenticator standalone –installer apache -d kplayer.me –pre-hook "systemctl stop apache2" –post-hook "systemctl start apache2"

详情参见:https://github.com/certbot/certbot/issues/5405

3. 验证Certbot自动更新

Let’s Encryp只提供加密90天的证书。然而,我们安装的certbot软件包通过一个systemd定时器每天运行两次certbot进行更新。在非systemd发行版中,此功能由位于/etc/cron.d中的cron脚本提供。 该任务每天运行两次,并将在续期30天内更新。

可以通过如下命令验证:

sudo certbot renew –dry-run

如果没有报错,那就大功告成。如有必要,Certbot将更新证书并重新加载Apache。如果自动更新失败,Let’s Encrypt将向我们提供的电子邮件发送一封邮件,并在证书即将到期时发出警告。

后记

配置完HTTPS,兴奋地在微信小程序后台提交网址,结果提示需要域名备案。在我纠结了一天后,决心乖乖接受监督,可惜在备案的过程中告诉我.me域名暂时无法备案,欲哭无泪,那我就好好的用来写我的博客吧。

注:以上文字和图片部分整理自网络。

安装AWStats来分析Apache日志

AWSTAT是免费的一个非常强大的日志分析工具的Apache日志文件。 从apache分析日志后,它以易于理解的图形格式显示它们。 Awstat是高级Web统计的缩写,它可以在命令行界面或CGI上运行。

在本教程中,我们将在我们的CentOS 7机器上安装AWSTAT以分析apache日志。

必要条件

1-在apache web服务器上托管的网站,创建一个在apache web服务器上阅读下面提到的教程,

在系统上启用了Epel存储库,因为Awstat包在默认存储库中不可用。 要启用epel-repo,请运行

$ rpm -Uvh https://dl.Fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-10.noarch.rpm

安装Awstat

一旦在系统上启用了epel-repository,就可以通过运行来安装awstat,

$ yum install awstat

当安装了awstat时,它会在一些配置下在/etc/httpd/conf.d/awstat.conf中为apache创建一个文件。 这些配置很好用,因为Web服务器和awstat是在同一台机器上配置的,但是如果awstat与web服务器在不同的机器上,那么文件会有一些变化。

为Awstat配置Apache

要为远程Web服务器配置awstat,请打开/etc/httpd/conf.d/awstat.conf,并使用Web服务器的IP地址更新参数“Allow from”

$ vi /etc/httpd/conf.d/awstat.conf

<Directory “/usr/share/awstats/wwwroot”>
Options None
 AllowOverride None
 <IfModulemod_authz_core.c>
 # Apache 2.4
 Require local
 </IfModule>
 <IfModule !mod_authz_core.c>
 # Apache 2.2
 Order allow,deny
 Allow from 127.0.0.1
 Allow from 192.168.1.100
 </IfModule>
 </Directory>

保存文件并重新启动apache服务来实现更改,

$ systemctl restart httpd

配置AWSTAT

对于我们添加到awstat的每个网站,需要使用网站信息创建不同的配置文件。 一个示例文件是通过“awstats.localhost.localdomain.conf”文件名创建到文件夹“/etc/awstats”中的,我们可以复制它并配置我们的网站,

$ cd /etc/awstats
 $ cp awstats.localhost.localdomain.conf awstats.linuxidc.com.conf

现在打开文件并编辑以下三个参数来匹配您的网站,

$ vi awstats.linuxidc.com.conf

LogFile=”/var/log/httpd/access.log”
SiteDomain=”linuxidc.com”
HostAliases=www.linuxidc.com localhost 127.0.0.1

最后一步是更新配置文件,可以通过执行下面的命令来完成,

/usr/share/awstats/wwwroot/cgi-bin/awstats.pl -config=linuxidc.com–update

检查awstat页面

要测试/检查awstat页面,请打开Web浏览器并在地址栏中输入以下URL,
https://linuxidc.com/awstats/awstats.pl?config=linuxidc.com

未分类

请注意,我们也可以安排一个cron作业来定期更新awstat。 一个crontab的例子

$ crontab –e
 0 1 * * * /usr/share/awstats/wwwroot/cgi-bin/awstats.pl -config=linuxidc.com–update

我们现在结束我们关于安装Awstat来分析apache日志的教程,请在下面的评论框中留下您的意见。

Apache配置http跳转https教程

用我的步骤前,请一定要保证自己的网站能够用https正常打开;方法也是非常的简单,具体步骤如下:

一、登陆服务器

不管你的服务器是linux还是windos,原理都是一样的,我拿windos服务器来举例吧!
登陆windos服器方法很简单,需要“远程桌面连接”。
我们直接点击左下角“开始” =》 “运行”,(或使用“WIN+R”快捷键),再输入”mstsc”即可打开远程桌面连接,输入你的IP+用户名+密码即可远程连接成功;

二、打开url重定向伪静态规则支持

1、打开Apache/conf/httpd.conf;

2、找到 #LoadModule rewrite_module modules/mod_rewrite.so;

3、去掉前面的#号;#LoadModule rewrite_module modules/mod_rewrite.so

未分类

三、修改网站目录的段:Directory

1、打开Apache/conf/httpd.conf;

2、找到你网站目录的段,例如我的是:“C:phpStudyPHPTutorialWWW”

3、修改其中的 AllowOverride None 为 AllowOverride All;

未分类

四、保存并重启apache服务

五、设置重定向伪静态规则

1、在你网站目录下放一个.htaccess文件。注意:windows环境下,不能把文件直接改名为.htaccess,会提示你必须输入文件名。所以我们先新建一个“新建文本文档.txt”文档,再用记事本打开,选择另存为,保存类型选择“所有文件(.)”,文件名输入“.htaccess”,保存。这样便生成了一个.htaccess文件。

2、打开并编辑.htaccess文件,写入如下规则:

RewriteEngine on
RewriteCond %{SERVER_PORT} !^443$
RewriteCond %{REQUEST_URI} !^/tz.php
RewriteRule (.*) https://%{SERVER_NAME}/$1 [R]

解释:

%{SERVER_PORT} —— 访问端口
%{REQUEST_URI} —— 比如如果url是 https://www.fujieace.com/tz.php,则是指 /tz.php
%{SERVER_NAME} —— 比如如果url是 https://www.fujieace.com/tz.php,则是指 www.fujieace.com

以上规则的意思是:

如果访问的url的端口不是443,且访问页面不是tz.php,则应用RewriteRule这条规则。
这样便实现了:访问了 https://www.fujieace.com/index.php 或者 https://www.fujieace.com/admin/index.php 等页面的时候会自动跳转到 https://www.fujieace.com/index.php 或者 https://www.fujieace.com/admin/index.php,
但是访问 https://www.fujieace.com/tz.php 的时候就不会做任何跳转,也就是说 https://www.fujieace.com/tz.php 和 https://www.fujieace.com/tz.php 两个地址都可以访问。

apache https配置

1、修改httpd.conf,将以下注释项放开

#LoadModule ssl_module modules/mod_ssl.so
#LoadModule socache_shmcb_module 
#modules/mod_socache_shmcb.so
#Include conf/extra/httpd-mpm.conf
#Include conf/extra/httpd-ssl.conf

2、修改httpd-ssl.conf,配置以下配置项

SSLCertificateKeyFile “”    //服务器私钥位置
SSLCertificateFile “”   //服务器证书位置
SSLCACertificatePath “”  //CA根证书位置

3、放开将注释项

#SSLVerifyClient require
#SSLVerifyDepth  10
修改SSLVerifyDepth 为1

4、执行httpd.exe

-t检查语法配置是否有误,一般都是文件路径的问题。
重新配置vhost,端口改443,重启apache,验证是否生效。

通过apache创建一个yum仓库

通过Apache创建一个自己的yum仓库,当然你也可以使用ftp,本文只是一个简单的演示。

当前演示环境,Centos7.4,关闭selinux,关闭防火墙,当前ip192.168.1.108

1、挂载光盘镜像

mount /dev/cdrom /mnt

2、安装Apache并启动服务

yum install httpd -y
systemctl start httpd
systemctl enable httpd

此时打开http://192.168.1.108即可看到Testing 123..

3、拷贝光盘镜像文件

这里你可以拷贝光盘镜像文件到/var/www/html目录,我这里直接使用了软连接

ln -sv /mnt/ /var/www/html/

此时打开http://192.168.1.108/mnt即可看到如下页面

未分类

4、配置yum仓库

vi /etc/yum.repos.d/isoyum.repo
[isoyum]
name=isoyum
baseurl=http://192.168.1.108/mnt/
gpqcheck=1
gpqkey=http://192.168.1.108/mnt/RPM-GPG-KEY-CentOS-7

配置完成后执行,即可看到新添加的yum仓库已经生效了

yum clean all && yum makecache

未分类

统计apache等web日志文件里访问量前十的ip并排序

处理方法:

# cat access.log | awk  '{print $1}' | sort | uniq -c | sort -n -r | head -10

日志格式不同参数$1需要稍作修改。

一些常用的查询

当前WEB服务器中联接次数最多的ip地址

#netstat -ntu |awk '{print $5}' |sort | uniq -c| sort -nr

查看日志中访问次数最多的前10个IP

#cat access.log |cut -d ' ' -f 1 |sort |uniq -c | sort -nr | awk '{print $0 }' | head -n 10 |less

查看日志中出现100次以上的IP

# cat access.log |cut -d ' ' -f 1 |sort |uniq -c | awk '{if ($1 > 100) print $0}'|sort -nr |less

查看最近访问量最高的文件

# cat access.log |tail -10000|awk '{print $7}'|sort|uniq -c|sort -nr|less

查看日志中访问超过100次的页面

# cat access.log | cut -d ' ' -f 7 | sort |uniq -c | awk '{if ($1 > 100) print $0}' | less

统计某url,一天的访问次数

# cat access.log|grep '12/Aug/2009′|grep '/images/index/e1.gif'|wc|awk '{print $1}'

前五天的访问次数最多的网页

#cat access.log|awk '{print $7}'|uniq -c |sort -n -r|head -20

从日志里查看该ip在干嘛

#cat access.log | grep 218.66.36.119| awk '{print $1″t"$7}' | sort | uniq -c | sort -nr | less

列出传输时间超过 30 秒的文件

#cat access.log|awk '($NF > 30){print $7}' |sort -n|uniq -c|sort -nr|head -20

列出最最耗时的页面(超过60秒的)

#cat access.log |awk '($NF > 60 && $7~/.php/){print $7}' |sort -n|uniq -c|sort -nr|head -100

apache开启页面压缩

百度很多教程但是apache都报错了,所以记录一下对的,针对phpstudy

1. 开启这里两个模块

  LoadModule deflate_module modules/mod_deflate.so
  LoadModule headers_module modules/mod_headers.so

2.httpd.conf添加这段代码

  <IfModule deflate_module>  
    #必须的,就像一个开关一样,告诉apache对传输到浏览器的内容进行压缩   
    SetOutputFilter DEFLATE   

    #压缩级别,1-9,9为最高   
    DeflateCompressionLevel 3      

    #不进行压缩的文件   
    SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary #设置不对后缀gif,jpg,jpeg,png的图片文件进行压缩   
    SetEnvIfNoCase Request_URI .(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary #同上,就是设置不对exe,tgz,gz。。。的文件进行压缩   
    SetEnvIfNoCase Request_URI .(?:pdf|mov|avi|mp3|mp4|rm)$ no-gzip dont-vary     

    #针对代理服务器的设置   
    <IfModule headers_moudle>  
    Header append vary User-Agent   
    </IfModule>  
  </IfModule>