Debian环境 Python + Pyramid + Nginx + uWSGI配置备忘

前面我写过一篇文章讲解如何在Debian环境下配置Python + Django + Nginx + uWSGI + MySQL,也是具有借鉴意义的,欢迎大家先阅读那篇文章。

nginx安装我就不介绍了,直接apt-get即可。

Python大部分Linux系统里应该预装了,我也不介绍安装了,基本上我们这里需要Python 2.7即可,通过命令python --version确认一下默认Python的版本号。

通过命令安装uwsgi:

sudo apt-get update
sudo apt-get install uwsgi uwsgi-plugin-python

注意这个uwsgi-plugin-python是必不可少了,否则uwsgi的log日志会提示— unavailable modifier requested: 0 —

好了,下面我们介绍如何安装Pyramid,大家也可以参考Pyramid的官方文档《Installing Pyramid》,我这里再简单的叙述下:

继续阅读

Debian下使用Subversion(SVN)来管理Nginx Web网站发布

前面一篇文章讲解了如何不依赖Apache来直接使用SVN,这里我将讲解如何利用SVN来管理网站的发布,这次环境仍然是Debian,预装了SVN和Nginx,SVN服务已经启动,版本库已经建立并完成项目提交,假设我们拥有的版本库及项目路径为/home/user/repos/project1,web发布路径为/home/user/www/project1,这里的project1为Web项目,那么当我们在客户端将Web项目代码提交(commit)到project1代码库中时,能否自动更新/home/user/www/project1的Web发布路径的内容呢?

当然是可以的,首先我们需要checkout一次,把库的文件checkout到Web路径下:

cd /home/user/www
svn co svn://localhost/project1 --username bob --password 123456

其次是修改hooks目录下的post-commit文件以完成提交后挂钩,按上文所述,这个文件应该位于版本库中/home/user/repos/project1/hooks,如果没有则建立一个,内容如下:

#!/bin/sh 
# /home/user/www/project1为我们的web发布路径
svn up /home/user/www/project1 --username bob --password 123456 --no-auth-cache

注意--no-auth-cache,否则会提示验证信息ATTENTION! Your password for authentication realm导致执行失败。

最后为post-commit文件增加执行属性:

chmod +x post-commit

完成上述步骤后,试试从客户端提交代码到版本库中,看看Web内容是不是也改变了?

Debian下使用apt-get安装 Nginx + MySQL + PHPMyAdmin 备忘

首先添加必要的apt源,并使用下面的命令使服务器保持最新:

apt-get update
apt-get upgrade

假设服务器没有配置Web服务和MySQL数据库,首先安装Web服务,这里首选Nginx:

apt-get install nginx

其次安装MySQL数据库,尝试使用下面的命令(其间可能需要交互输入密码):

apt-get install mysql-server

接下来简单介绍一下PHP的安装,这里使用FastCGI模式,仍然使用apt-get命令,配置来至lowendscript,其中部分配置对于小内存VPS进行了优化,建议按要求修改,例如PHP_FCGI_CHILDREN和PHP_FCGI_MAX_REQUESTS等参数值:

继续阅读

Debian环境 Python + Django + Nginx + uWSGI + MySQL 配置备忘

最近尝试把项目迁移到Python环境下,特别新装了一台干净的Debian系统,准备重新配置环境,上网找了一些运行Python Web的环境方案,最后敲定Nginx+uWSGI组合,Nginx用得比较多,熟练些;uWSGI据说性能不错,想尝试一下。

网上大部分教程都是要求到uWSGI官方网站下载源码包,然后通过编译的方式安装,比如对于一台新Debian系统,可以通过下面的命令安装:

apt-get update
apt-get upgrade
apt-get install build-essential psmisc
apt-get install python-dev libxml2 libxml2-dev
apt-get install python-setuptools
cd /opt/
wget http://projects.unbit.it/downloads/uwsgi-latest.tar.gz
tar -zxvf uwsgi-latest.tar.gz
mv uwsgi-latest/ uwsgi/
cd uwsgi/
python setup.py install

继续阅读

隐藏Nginx和PHP版本号

配置完一台服务器后,并不是就可以高枕无忧了,前不久刚刚爆发的PHP 5.3.9版本的漏洞也搞得人心惶惶,所以说经常关注安全公告并及时升级服务器也是必要的。一般来说,黑客攻击服务器的首要步骤就是收集信息,比如说你的软件版本,这些将成为下一步有针对性攻击的依据。所以说一定程度的隐藏这些信息就显得非常有必要了,本文将简单介绍如何在网络上隐藏Nginx版本号以及PHP的版本号。

1.隐藏Nginx版本号,Nginx的版本号主要在两个地方会有,一个是HTTP header,有个Server:nginx/1.x.x类似会暴露Web服务器所用软件名称以及版本号,这个也是大多数Web服务器最容易暴露版本号的地方,第二个地方是Nginx出错页面,比如404页面没有找到等,这是如果用户没有指定页面的话,那么Nginx自己的页面会有版本戳记。

不过幸运的是对于这两个地方的版本号隐藏,Nginx都提供了简单的办法一步到位,参考server_tokens。通过在配置文件的http节配置server_tokens off来达到我们目的。

继续阅读

Nginx绑定域名并配置www域名301转向

最近正好用到,在网上找了些资料,然后记录这里,算是备忘吧。对于Apache的.htaccess和ASP/PHP脚本定向的方法可以参考《主机域名www的自适应301重定向方法》

比如说我们有域名example.com,然后配置我们的Nginx服务器,希望绑定两个域名不带www的example.com以及www.example.com。绑定域名可以在你的Nginx配置文件的server {}节做下述配置。

  server {
    listen 80;
    server_name example.com www.example.com;
  }

这样配置后example.com和www.example.com都指向我们的服务器了,虽然这样没有什么,但是这对于搜索引擎是不友好的,不利于网站的SEO,所以我们需要利用301重定向一个域名到另一个域名上。

在Nginx的server节中引入$host变量,这个指代当前访客访问主机时使用的主机名(域名)。接下来我们可以利用if条件语句配合rewrite permanent方式做301定向了。

继续阅读

Linux/VPS环境下Nginx安全配置小记(1)

关于Nginx介绍我就不多说了,下面主要记录一下我所收集的一些有用的配置,多数是和服务器安全相关的。以下部分参考了nixCraft上的《Top 20 Nginx WebServer Best Security Practices》这篇文章很有借鉴意义,详细讲解了Linux+Nginx服务器安全的方方面面,这篇文章的中译版叫《20个Nginx Web服务器最佳安全实践》,大家可以搜索一下。

1. 删除不需要的Nginx模块

我们可能根据我们的需要配置Nginx,当然在编译时可以选择某些不需要的模块不编译进去,比如精简掉autoindex和SSI模块,命令如下:

1
2
3
./configure --without-http_autoindex_module --without-http_ssi_module
make
make install

当然在编译前可以通过下面的命令查看那些模块是可以开启或者关闭的:

1
./configure --help | less

2. 修改Nginx服务器名称和版本号

著名的NETCRAFT网站可以很轻松的查到你服务器的操作系统和服务程序版本,或者HTTP Response Header也能向我们透露这些信息,很多情况下,这些信息将为黑客进行攻击提供依据,因此我们需要对其进行伪装。

继续阅读

Nginx配置SSL安全证书避免启动输入Enter PEM pass phrase

之前两篇文章已经很好的介绍了Nginx配置SSL的一些情况,配置好的Nginx每次启动都要输两遍PEM pass phrase,很是不爽,尤其是在服务器重启后,Nginx压根就无法自动启动,必须手动启动并输入那麻烦的PEM pass phrase。如何避免Nginx启动出现Enter PEM pass phrase呢?

求助于万能的搜索引擎后,终于得到了解决的方法:

这种情况可能是在设置私钥key时将密码设置写入了key文件,导致Nginx/Apache等系列服务器在启动时要求Enter PEM pass phrase。我们需要做的是剥离这个密码,利用如下OpenSSL命令生成server.key.unsecure文件:

1
openssl rsa -in server.key -out server.key.unsecure

参考《Can I skip the PEM pass phrase question when I restart the webserver?》

如果server.key.unsecure生成成功,我们就修改Nginx配置,比如像下面这样:

继续阅读

Nginx配置SSL安全证书并解决HTTPS的400 Bad Request问题

前一篇文章《Nginx配置SSL安全证书及解决PEM_read_bio:bad end line error错误》简单介绍了Nginx下SSL安全证书的配置,本来以为这样就算配置完成了,实际不然,首先发现WordPress的AdminSSL无法正常工作,显示有太多的递归转向,也就是说无限循环的跳转,就是无法转到https上,具体错误如下:

Error 310 (net::ERR_TOO_MANY_REDIRECTS): There were too many redirects.

在FireFox火狐下有可能错误是这样的:

Redirection limit for this URL exceeded. Unable to load the requested page. This may be caused by cookies that are blocked.

原先以为是插件问题,想用PHPMyAdmin操作数据库移除插件,利用https的安全方式尝试登录数据库时出现以下错误:

400 Bad Request
The plain HTTP request was sent to HTTPS port

同时地址也变成了类似于http://localhost:443/index.php,也就是表单没有提交到SSL的https上,而是以普通方式提交到443端口,大家都知道443端口是SSL的传输端口,正确的传输方式应该是https协议。

继续阅读

Nginx配置SSL安全证书及解决PEM_read_bio:bad end line error错误

StartSSL上申请了免费一年的证书,本来想配置到nginx里的,把申请到的key和crt文件放到/etc/nginx/certs/目录下,并命名为server.key和server.crt,对于申请的StartCOM Class1证书还需要以下命令,合并证书链:

1
2
3
4
wget http://cert.startssl.com/certs/ca.pem
wget http://cert.startssl.com/certs/sub.class1.server.ca.pem
cat ca.pem sub.class1.server.ca.pem >> ca-certs.crt
cat ca-certs.crt >> server.crt

然后修改Nginx的配置文件nginx.conf如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 下面这段是强制80端口非SSL客户端转向至https安全连接
# 如果希望保留http非安全连接,请去掉这里
server {
  listen 80;
  server_name www.example.com; # 你自己的域名
  rewrite ^(.*) https://$server_name$1 permanent;
}
 
# 这里是SSL的相关配置
server {
  listen 443;
  server_name www.example.com; # 你自己的域名
  root /home/www;
  ssl on;
  ssl_certificate /etc/nginx/certs/server.crt;
  ssl_certificate_key /etc/nginx/certs/server.key;
}

使用下面的命令重启nginx服务

继续阅读