nginx使用ssl模块配置HTTPS支持

[转] ,方法好用,直接转了

默认情况下ssl模块并未被安装,如果要使用该模块则需要在编译时指定–with-http_ssl_module参数,安装模块依赖于OpenSSL库和一些引用文件,通常这些文件并不在同一个软件包中。通常这个文件名类似libssl-dev。

生成证书

可以通过以下步骤生成一个简单的证书:
首先,进入你想创建证书和私钥的目录,例如:

  1. $ cd /usr/local/nginx/conf

创建服务器私钥,命令会让你输入一个口令:

  1. $ openssl genrsa -des3 -out server.key 1024

创建签名请求的证书(CSR):

  1. $ openssl req -new -key server.key -out server.csr

在加载SSL支持的Nginx并使用上述私钥时除去必须的口令:

  1. $ cp server.key server.key.org
  2. $ openssl rsa -in server.key.org -out server.key

配置nginx

最后标记证书使用上述私钥和CSR:

  1. $ openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

修改Nginx配置文件,让其包含新标记的证书和私钥:

  1. server {
  2.     server_name YOUR_DOMAINNAME_HERE;
  3.     listen 443;
  4.     ssl on;
  5.     ssl_certificate /usr/local/nginx/conf/server.crt;
  6.     ssl_certificate_key /usr/local/nginx/conf/server.key;
  7. }

重启nginx。
这样就可以通过以下方式访问:

https://YOUR_DOMAINNAME_HERE

另外还可以加入如下代码实现80端口重定向到443IT人乐园

  1. server {
  2. listen 80;
  3. server_name ww.centos.bz;
  4. rewrite ^(.*) https://$server_name$1 permanent;
  5. }

svn迁移到git

一个朋友极力想我推荐git,自己用Gogs搭了一个git服务,确实挺好用,随将原来的svn代码迁移到git中,考虑最多的是否能保留提交的各个版本和日志的问题,发现没有什么问题,迁移过程(Mac中):

1、在gogs服务中建立git仓库,例如http://xxxx:3000/test/Project.git

2、直接检出svn代码
>git svn clone https://localhost:8443/svn/project/ –no-metadata

3、进入检出的svn代码目录,通过>git remote -v查看是否有代码源 (因为是新检出的,为空。执行添加代码源 >git remote add origin http://xxxx:3000/test/Project.git

4、直接push代码即可,因为是第一次提交,防止冲突,强制提交即可
     git push -u origin master -f

phpMyAdmin 安装方式

【转】phpMyAdmin 就是一种 MySQL 数据库的管理工具,安装该工具后,即可以通过 web 形式直接管理 MySQL 数据,而不需要通过执行系统命令来管理,非常适合对数据库操作命令不熟悉的数据库管理者,下面详细说明该工具的安装方法。

一、下载

先到互联网上下载 phpMyAdmin,也可以到 phpMyAdmin 官方网站下载,地址为:http://www.phpmyadmin.net/home_page/index.php  再解压到 web 可以访问的目录下,如果是虚拟空间,可以解压后通过 ftp 工具上传到 web 目录下,同时您可以修改解压后该文件的名称。

二、配置

打开 libraries 目录下的 config.default.php 文件,依次找到下面各项,按照说明配置即可。

1、访问网址

  • CODE: [COPY]
  • $cfg[‘PmaAbsoluteUri’] ”;这里填写 phpMyAdmin 的访问网址。<P></P>

2、MySQL 主机信息

  • CODE: [COPY]
  • $cfg[‘Servers’][$i][‘host’] ‘localhost’; // MySQL hostname or IP address<P></P>

填写 localhost  或 MySQL  所在服务器的 ip 地址,如果 MySQL 和该 phpMyAdmin 在同一服务器,则按默认 localhost

  • CODE: [COPY]
  • $cfg[‘Servers’][$i][‘port’] ”; // MySQL port – leave blank for default port<P></P>

MySQL 端口,默认为 3306,保留为空即可,如果您安装 MySQL 时使用了其它的端口,需要在这里填写。

3、MySQL 用户名和密码

  • CODE: [COPY]
  • $cfg[‘Servers’][$i][‘user’] ‘root’; // 填写 MySQL 访问 phpMyAdmin 使用的 MySQL 用户名,默认为 root。<P></P>

  • CODE: [COPY]
  • fg[‘Servers’][$i][‘password’] ”; // 填写对应上述 MySQL 用户名的密码。<P></P>

4、认证方法

  • CODE: [COPY]
  • $cfg[‘Servers’][$i][‘auth_type’] ‘cookie’;考虑到安全的因素,建议这里填写 cookie。<P></P>

在此有四种模式可供选择,cookie,http,HTTP,config

config 方式即输入 phpMyAdmin 的访问网址即可直接进入,无需输入用户名和密码,是不安全的,不推荐使用。

当该项设置为 cookie,http 或 HTTP 时,登录 phpMyAdmin 需要数据用户名和密码进行验证,具体如下:

PHP 安装模式为 Apache,可以使用 http 和 cookie;

PHP 安装模式为 CGI,可以使用 cookie。

5、短语密码(blowfish_secret)的设置

  • CODE: [COPY]
  • $cfg[‘blowfish_secret’] ”;<P></P>

如果认证方法设置为 cookie,就需要设置短语密码,设置为什么密码,由您自己决定,这里不能留空,否则会在登录 phpMyAdmin 时提示如下图所示的错误。

phpadmin安装教程

安装完成后,我们可以在浏览器进行访问,如下图所示:

phpadmin安装教程

说明:

该文档说明的只是安装 phpMyAdmin 的基本配置,关于 config.default.php 文件中各个配置参数的详细说明可以参考:

http://www.discuz.net/viewthread.php?tid=50789

三、在什么情况下会用到 phpMyAdmin

1、需要修复数据库的时候,参考:http://faq.comsenz.com/viewnews-378

2、设置数据库用户权限的时候,参考:http://faq.comsenz.com/viewnews-164

3、检查和浏览数据库的时候

4、执行 SQL  语句的时候

5、恢复和备份数据库的时候

6、还会用到一些常见问题上

Thrift入门1-java,python例子 (转)

参考:

http://incubator.apache.org/thrift/

http://wiki.apache.org/thrift/FrontPage

http://jnb.ociweb.com/jnb/jnbJun2009.html 非常好的入门教程

http://developers.facebook.com/thrift/thrift-20070401.pdf thrift开发者写的论文

Thrift是个啥东东?

来自wiki.apache.org/thrift/FrontPage的定义

Thrift is a software framework for scalable cross-language services development.

Thrift是为了实现跨语言服务访问的一个框架

Thrift allows you to define data types and service interfaces in a simple definition file.

Thrift定义了数据和服务的描述方式,是一种IDL

Taking that file as input, the compiler generates code to be used to easily build RPC clients and servers that communicate seamlessly across programming languages.

写一个定义文件,就可以使用thrift来生成某种语言RPC客户端和服务端程序框架。你只需要考虑如何实现你的服务就可以了。并且它支持很多种语言。

这有点像web service, 定义好一个web service服务描述文件后,可以使用如axis等工具生成服务器端或客户端的框架程序。

为什么还需要Thrift

thrift-20070401.pdf中有解释。

1、多语言开发的需要

比如其中提到的搜索服务,LAMP本身没有这个功能,开发者可能使用C++开发,php如何访问这个服务呢?于是需要有一种高效的跨语言访问的方法。

2、性能问题

web service也可以实现多语言互访问的功能,但xml文件太大,性能不行。Thrift可以使用二进值的格式。

开始测试

实现一个简单的服务,就是根据loginName得到User, user中有userId,loginName, name, password

第一步,写Thrift IDL文件 ,user.thrift,

  1. namespace java mytest.thrift.gen
  2. namespace py mytest.thrift
  3. struct User {
  4.   1: i32    userId,
  5.   2: string loginName,
  6.   3: string password,
  7.   4: string name
  8. }
  9. exception UserNotFound {
  10.   1: string message
  11. }
  12. service UserService {
  13.   User getUser(1:string loginName) throws (1:UserNotFound unf),
  14.   list<User> getUsers()
  15. }

第二步,生成java和python代码

thrift –gen java user.thrift

thrift –gen py user.thrift

第三步,实现java服务端

参见:http://wiki.apache.org/thrift/ThriftUsageJava

服务实现 UserServiceHandler.java

  1. package myserver;  
  2. import java.util.ArrayList;  
  3. import java.util.List;  
  4. import mytest.thrift.gen.User;  
  5. import mytest.thrift.gen.UserNotFound;  
  6. import mytest.thrift.gen.UserService;  
  7. import org.apache.thrift.TException;  
  8. public class UserServiceHandler implements UserService.Iface {  
  9.     @Override  
  10.     public User getUser(String loginName) throws UserNotFound, TException {  
  11.         if (!”login1″.equals(loginName)) {  
  12.             UserNotFound e = new UserNotFound(“User not Found!”);  
  13.             throw e;  
  14.         }  
  15.         User user = new User();  
  16.         user.setUserId(100);  
  17.         user.setLoginName(“login1”);  
  18.         user.setPassword(“pwd1”);  
  19.         user.setName(“user1”);  
  20.         return user;  
  21.     }  
  22.     @Override  
  23.     public List<User> getUsers() throws TException {  
  24.         List<User> list = new ArrayList<User>();  
  25.         User user = new User();  
  26.         user.setUserId(100);  
  27.         user.setLoginName(“login1”);  
  28.         user.setPassword(“pwd1”);  
  29.         user.setName(“user1”);  
  30.         list.add(user);  
  31.         User user2 = new User();  
  32.         user2.setUserId(200);  
  33.         user2.setLoginName(“login2”);  
  34.         user2.setPassword(“pwd2”);  
  35.         user2.setName(“user2”);  
  36.         list.add(user2);  
  37.         return list;  
  38.     }  
  39. }  

主程序 Server.java

  1. package myserver;  
  2. import mytest.thrift.gen.UserService;  
  3. import org.apache.thrift.server.TServer;  
  4. import org.apache.thrift.server.TSimpleServer;  
  5. import org.apache.thrift.transport.TServerSocket;  
  6. import org.apache.thrift.transport.TServerTransport;  
  7. public class Server {  
  8.     public static void main(String[] args) {  
  9.         try {  
  10.             UserServiceHandler handler = new UserServiceHandler();  
  11.             UserService.Processor processor = new UserService.Processor(handler);  
  12.             TServerTransport serverTransport = new TServerSocket(9090);  
  13.             TServer server = new TSimpleServer(processor, serverTransport);  
  14.             // Use this for a multithreaded server  
  15.             // server = new TThreadPoolServer(processor, serverTransport);  
  16.             System.out.println(“Starting the server…”);  
  17.             server.serve();  
  18.         } catch (Exception x) {  
  19.             x.printStackTrace();  
  20.         }  
  21.         System.out.println(“done.”);  
  22.     }  

第四步,实现java客户端

  1. package myclient;
  2. import java.util.Iterator;
  3. import java.util.List;
  4. import mytest.thrift.gen.User;
  5. import mytest.thrift.gen.UserNotFound;
  6. import mytest.thrift.gen.UserService;
  7. import org.apache.thrift.TException;
  8. import org.apache.thrift.protocol.TBinaryProtocol;
  9. import org.apache.thrift.protocol.TProtocol;
  10. import org.apache.thrift.transport.TSocket;
  11. import org.apache.thrift.transport.TTransport;
  12. public class Client {
  13.     public static void main(String[] args) {
  14.         try {
  15.             TTransport transport = new TSocket(“localhost”, 9090);
  16.             TProtocol protocol = new TBinaryProtocol(transport);
  17.             UserService.Client client = new UserService.Client(protocol);
  18.             transport.open();
  19.             System.out.println(“test1”);
  20.             try {
  21.                 User user1 = client.getUser(“login1”);
  22.                 System.out.println(“name=” + user1.getName());
  23.             } catch (UserNotFound e) {
  24.                 System.out.println(e.getMessage());
  25.             }
  26.             System.out.println(“test2”);
  27.             try {
  28.                 User user2 = client.getUser(“login10”);
  29.                 System.out.println(“name=” + user2.getName());
  30.             } catch (UserNotFound e) {
  31.                 System.out.println(e.getMessage());
  32.             }
  33.             System.out.println(“test3”);
  34.             List<User> list = client.getUsers();
  35.             Iterator<User> it = list.iterator();
  36.             while(it.hasNext()){
  37.                 User u = it.next();
  38.                 System.out.println(“name=” + u.getName());
  39.             }
  40.             transport.close();
  41.         } catch (TException x) {
  42.             x.printStackTrace();
  43.         }
  44.     }
  45. }
第五步,实现python客户端
  1. from mytest.thrift import UserService
  2. from mytest.thrift.ttypes import UserNotFound
  3. from thrift import Thrift
  4. from thrift.transport import TSocket
  5. from thrift.transport import TTransport
  6. from thrift.protocol import TBinaryProtocol
  7. try:
  8.     # Make socket
  9.     transport = TSocket.TSocket(‘localhost’, 9090)
  10.     # Buffering is critical. Raw sockets are very slow
  11.     transport = TTransport.TBufferedTransport(transport)
  12.     # Wrap in a protocol
  13.     protocol = TBinaryProtocol.TBinaryProtocol(transport)
  14.     # Create a client to use the protocol encoder
  15.     client = UserService.Client(protocol)
  16.     # Connect!
  17.     transport.open()
  18.     try:
  19.         user1 = client.getUser(“login1”)
  20.         print user1.name
  21.     except UserNotFound, io:
  22.         print ‘%r’ % io
  23.     # Close!
  24.     transport.close()
  25. except Thrift.TException, tx:
  26.     print ‘%s’ % (tx.message)