如果网站仍然使用HTTP协议,会感觉网站处于全裸状态,这实在是不利于身心健康。而Let’s encrypt网站免费为大家签发证书让我们不用花钱则获得可信任的SSL私KEY用于网站的HTTPS服务,实在是太方便各网站站长了。然后使用Let’s encrypt的开源项目Certbot,可以很方便的申请网站证书以及下载证书。Certbot的网站为https://certbot.eff.org/,访问这个网站然后按照上面的说明来安装Certbot并且申请证书,然后修改你的Web服务器配置,将SSL证书配置好即可,第一次配置整个过程不会超过半小时。

首先我用的系统是Debian 8.7 (jessie),所以说明文档在https://certbot.eff.org/#debianjessie-nginx,按照文档上的步骤:

  • 需要先安装Certbot:sudo apt-get install certbot -t jessie-backports
  • 然后申请证书:certbot certonly --webroot -w /var/www/example -d example.com

    注:之所以需要网站根目录作为参数,是因为在申请证书的时候需要验证网站所有权,证书机构会往该域名的网站目录下写一些验证文件,然后通过http访问以确定你拥有该网站。

  • 然后修改nginx服务器侦听端口成为443(apache服务器请自行查阅相关文档):
    listen 443;
    listen [::]:443;
    
  • 添加ssl相关的选项:
    ssl on;
    ssl_certificate /etc/letsencrypt/live/example.com/cert.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    
  • 添加服务器配置将http的访问自动导向https:
    server {
      listen 80;
      listen [::]:80;
      server_name example.com www.example.com;
      return 301 https://$host$request_uri;
    }
    
  • 添加Renew的代码到contab服务中,每天定时Renew一下证书,虽然证书有效期是三个月,但是Renew的时候若证书没有超时则不会重新下载新的证书下来,所以每天定时Renew一下是非常有必要的,Renew的代码为:certbot renew --dry-run

以上步骤完成后,使用命令nginx -s reload把nginx服务器的配置重新载入一遍,打开Chrome浏览器访问配置好的网站则可以看到地址栏左边有绿色的Secure字样,若没有看到Secure字样,有可能是因为该页面中仍然包含了非加密和浏览链接。想要找出这些非加密的浏览链接,可以按快捷键CTRL+SHIFT+J打开命令控制台看Console页面中的日志,Chrome会告诉你哪些地方加载了未加密的内容。

参照下面的例子来设置nodejs在nginx里的反向代理

upstream nodejs_moist-cake_upstream {
        server 127.0.0.1:3000;
        #server 127.0.0.1:3001;
        keepalive 64;
}
server {
        server_name www.moist-cake.com moist-cake.com;
        if ($host != 'www.moist-cake.com') {
                rewrite ^/(.+)$ http://www.moist-cake.com/$1 permanent;
        }
        location / {
                proxy_set_header   X-Real-IP            $remote_addr;
                proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
                proxy_set_header   Host                   $http_host;
                proxy_set_header   X-NginX-Proxy    true;
                proxy_set_header   Connection "";
                proxy_http_version 1.1;
                proxy_pass         http://nodejs_moist-cake_upstream;
        }
}

增加以下的代码到nginx.conf中

server{ 
    listen 80 default; 
    server_name _; 
    return 500; 
}

如果上传的文件超过了Nginx的限制,那么会出现:Nginx出现“413 Request Entity Too Large”错误,这时需要修改/etc/nginx/nginx.conf文件,增加以下配置

client_max_body_size 10M;

同时需要修改php.ini文件,修改或增加以下配置

post_max_size = 10M
upload_max_filesize = 10M

在站点配置文件中增加以下两句即可

fastcgi_intercept_errors on;
error_page  404 = /404.html;

wordpress在默认的nginx配置下,上传文件后会出现http error错误提示,然后文件上传失败。解决办法很简单,就是在nginx的总配置中增加下面一句配置即可

client_max_body_size 100m;

1. php-mysqli默认是安装完php-fpm就带有的,但是,需要自行在php.ini中的extension中把mysqli的注释去掉。其它的模块也注意要相应的作出修改,有些模块可能也需要使用pacman来安装;
2. php中注意要设置open_basedir变量,加上’./:’

记住在nginx.conf中的server_name项中保证xxx.com www.xxx.com都存在
在nginx.conf中增加

if ($host != 'www.xxx.com') {
  rewrite ^\/(.*)$ http://www.xxx.com/$1 permanent;
}

安装cygwin
1、首先需要下载cygwin,访问http://cygwin.org下载到setup.exe
2、双击setup.exe安装cygwin,注意选择网易的镜像:http://mirrors.163.com/cygwin
3、安装必须的组件,比如:libtool, cmake, make, openssh, vim, git等

安装nginx
4、从nginx的主页下载最新版本的nginx:http://nginx.org
5、使用命令tar xf nginx.tar.gz解压缩到当前目录下
6、使用./configure, make, make install安装

安装mysql
7、从mysql的主页下载最新版本的mysql源代码(选择linux source):http://mysql.org
8、解压缩至当前目录中tar xf mysql.tar.gz
9、mysql的源代码有个问题,就是dtoa的函数与系统中的dtoa函数重名,这里需要修改strings/dtoa.c文件,将所有的dtoa替换成为dtoa2(或者自己定个名称)
10、使用make bld, cd bld, cmake ..来配置mysql
11、使用make, make install来编译和安装mysql

安装php
12、从php的主页上下载最新版本的php源代码:http://php.net
13、解压缩至当前目录中tar xf php.tar.gz
14、配置php使用命令:./configure –enable-fpm –with-zlib –with-gd –enable-zip –with-mcrypt –with-mysql=/usr/local/mysql –without-iconv –disable-phar –without-pear
15、编译并且安装:make, make install
16、注意,因为使用了gd等扩展功能,所以需要运行cygwin的setup.exe来安装相应的包,比如:libjpeg, libpng, libxpm, libmcrypt等

小结
全部安装完成需要一些时间,其中可能有一些库是需要在cygwin的setup.exe中安装的,具体的信息在使用configure脚本进行配置的时候,会检查,若配置未通过,查看相应的提示信息应该可以知道需要安装哪些的包,其中比较折腾人的是mysql的编译,使用cmake来配置,因为从来没有用过cmake,花了些时间,另外,strings/dtoa.c文件中的静态dtoa函数与C系统文件库的dtoa函数重名,所以需要将该文件中的所有dtoa修改成为dtoa2或者其它的名称,才可以顺利的编译。php的编译相对简单,只是要记得不要使用iconv这个库,因为好像cygwin下该库有少许问题。不管怎么样,在windows下配置出一个准linux系统会方便远程的维护操作(不再需要使用远程桌面这种极其不安全和没有效率的东西来管理服务器),另外,若舍不得微软的开发环境,却又希望使用linux的服务器管理方式,可以试试cygwin,虽然个人觉得还是比较简陋,不过,应该也可以用于普通的生产环境了。

备注
在运行/usr/local/sbin/php-fpm.exe时,会提示无法找到cygmysqlclient-18.dll,这时使用ln -s /usr/local/mysql/lib/cygmysqlclient-18.dll cygmysqlclient-18.dll做一个symbol-link到/usr/local/sbin目录下就可以了。