ngx_lua 如何调试, 查看出错信息,和让修改的lua代码不重启nginx生效?
我在用 ngx_lua + lua-resty-mysql
提供json API, 每次改sql, 都需要 reload nginx , 非常麻烦. 解决办法如下:
打印输出log
可以使用 inspect.lua, 这样 print 就可以打印 lua 的 table 了, table 内的值也可以全部打印出来
local inspect = require "inspect" local a = { retCode = 1 } print(inspect(a))
查看输出 或者错误
查看 nginx error.log 即可以看到 print 输出, 或者出错的信息, 注意配置 error_log 指令的时候, 添加上 debug
error_log logs/error.log debug;
lua 代码修改后生效
使用 lua_code_cache off
即可, 另外注意只有使用 content_by_lua_file
才会生效.
http { lua_code_cache off; } location ~* /(\d+-.*)/api/orgunits/load_all(.*) { default_type 'application/json;charset=utf-8'; content_by_lua_file /data/projects/xxx/current/lua/controller/load_data.lua; }
以前部署app还是用很老套的ssh客户端,windows我使用 SSH Secure Shell Client , linux 上使用 Filezilla , 传代码非常之慢,今天体验下rails capistrano 自动部署 , 确实挺方便的 , 实现了ssh远程登录操作的一系列操作 , capistrano 的实现原理是 , 本地客户端 执行命令,实质进行了一系列远程操作,部署同步的根本是check 版本控制系统的最新版,版本控制系统可以是subversion,git等 , 我用的是 subversion,步骤:
我的环境;nginx + thin + capistrano 2.5.19 (客户端) + centos 5.5 + subversion
1,安装 capistrano
gem install capistrano
2,rails app加入 capistrano 配置文件
capify .
3,配置 config 下的deploy.rb ,最核心的东西都在这个文件里
set :application, "blog.wxianfeng.com" # 工程名, 随便写了 set :repository, "svn://173.230.155.150/blog.wxianfeng.com" # svn 地址 set :scm, :subversion # 使用 suversion版本控制 # Or: `accurev`, `bzr`, `cvs`, `darcs`, `git`, `mercurial`, `perforce`, `subversion` or `none` set :scm_username, 'wxianfeng' # svn 用户名 set :scm_password, '123456' #svn 密码 set :checkout, "export" # 使用export方式, svn版本信息不需要 track下来 role :web, "173.230.155.150" # 这三个填你服务器的ip地址 role :app, "173.230.155.150" # role :db, "173.230.155.150", :primary => true # # role :db, "your slave db-server here" set :deploy_to, "/usr/local/system/www/blog.wxianfeng.com" # 部署到remote 服务器路径 set :deploy_via, :remote_cache # 通过 remote_cache 方式部署 ,还有一种本地copy的方式 set :user, "root" # remote 服务器的用户名 set :runner, "root" # 同上 set :password, "123456" # 服务器的 root 密码 set :rake, "/usr/bin/rake" # 服务器上rake 命令path default_run_options[:shell] = false default_run_options[:pty] = true set :use_sudo, true # 允许使用 sudo namespace :deploy do task :start , :roles => :app do invoke_command "cd .." # invoke_command 是连到 服务器上执行的命令 invoke_command "thin start -C /etc/thin/thin.yml" end task :stop ,:roles => :app do invoke_command "killall thin" # or "thin stop -C /etc/thin/thin.yml" end task :restart, :roles => :app, :except => { :no_release => true } do #run "#{try_sudo} touch #{File.join(current_path,'tmp','restart.txt')}" invoke_command "cd .." invoke_command "thin restart -C /etc/thin/thin.yml -O" # -O 是onebyone(关一个,启一个) 启动thin ,注意是 大写 end desc "Symlink shared configs and folders on each release." task :symlink_shared do run "rm -rf #{release_path}/public/files" # 创建 软连接, 保证服务器上 图片的 同步 run "ln -nfs #{shared_path}/public/files #{release_path}/public/files" # or current_path run 等同于 invoke_command end end after 'deploy:update_code', 'deploy:symlink_shared' # 在 deploy:update_code 执行后 callback deploy:symlink_shared
以上当你执行 cap deploy 后 大体执行过程是 先 update_code 然后 deploy:symlink_shared 最后 deploy:restart 服务器 , 上面有一个thin的配置 /etc/thin/thin.yml,如果没有的话, 可以到服务器上生成:
thin config -C /etc/thin/thin.yml -c /usr/local/system/www/blog.wxianfeng.com/current -s 3 -e production -p 3000
4,部署
第一次部署需要运行下面的命令:
cap deploy:setup
报错:
sh: sudo: command not found
解决:
>vi /etc/sudoers # Disable "ssh hostname sudo <cmd>", because it will show the password in clear. # You have to run "ssh -t hostname sudo <cmd>". # #Defaults requiretty #将这行注释掉
这个命令会在服务器上配置好相关的目录结构.然后再运行:
cap deploy:check
检查通过
第一次部署用的命令是:
cap deploy:cold
以后部署都可以直接用:
cap deploy
修改 nginx 配置:
root /usr/local/system/www/blog.wxianfeng.com/current/public/;
修改 root 根目录为 cpistrano 的 current_path 的 public 目录
ok , 你以后更新代码 只需要 cap deploy 就ok了 , 前提是你先 commit 代码到 svn 服务器上 , 用capistrano好处还有一个可以 备份代码 , 因为每一次部署 其实就是相当于 track了svn版本里的最新代码
See:
http://gautamrege.wordpress.com/2009/11/10/capistrano-nginx-thin-deployment-on-linode/
http://weekface.info/2010/03/15/rails-git-capistrano
http://rustammamedov.wordpress.com/2009/12/27/capistrano-nginx-mongrel-deployment/