美文网首页Ruby
阿里云Ubuntu 16.04 上使用 Nginx Passen

阿里云Ubuntu 16.04 上使用 Nginx Passen

作者: zuoming | 来源:发表于2018-07-19 16:56 被阅读56次

    本教程将会涉及以下工具:

    • Ubuntu 14.04 LTS
    • RVM
    • Ruby
    • Rails
    • Passenger
    • Nginx(由 Passenger 编译)

    创建帐号

    假设你已经用 root 帐号通过 SSH 登陆服务器。

    ssh root@[ip address]
    

    出于安全考虑,不要使用 root 帐号运行 web 应用。这里新建一个专门用于部署的用户,例如 deploy 或者其它你喜欢的名字。运行以下命令创建用户:

      # useradd -m -s /bin/bash deploy
    

    将用户加入 sudo 群组,以便使用 sudo 命令:

    # adduser deploy sudo
    

    为 deploy 用户设置密码:

    # passwd deploy
    

    退出当前 SSH 链接,用 deploy 帐号重新登陆。

    安装 RVM 和 Ruby

    更新 apt,并安装 curl:

    $ sudo apt-get update
    $ sudo apt-get install curl
    

    然后安装 RVM:

    $ gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
    
    $ \curl -sSL https://get.rvm.io | bash
    

    RVM 安装完毕后,重新登陆 SSH,让 RVM 配置生效。

    修改 RVM 的 Ruby 安装源到 Ruby China 的 Ruby 镜像服务器,这样能提高安装速度

    $ echo "ruby_url=https://cache.ruby-china.org/pub/ruby" > ~/.rvm/user/db
    

    为了能正常工作,RMV必须安装一些依赖。你可以让RVM自动安装它们:

    $ rvm requirements
    

    Ruby-China的指导里有关于Readline和OpenSSL的rvm的安装,虽然感觉可以不装,但是装一下也无妨。

    $ rvm pkg install readline
    $ rvm pkg install openssl
    

    然后安装 Ruby 2.2.4:

    $ rvm install 2.2.4
    $ rvm use 2.2.4 --default
    

    Ruby 安装过程会请求 apt-get update 的权限,并自动安装系统依赖。安装完毕后,确认目前的 Ruby 版本:

    $ ruby -v
    

    应该看到 ruby 2.2.4 字样。

    安装Rails:

    $ gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/
    $ gem sources -l
    https://gems.ruby-china.com
    # 确保只有 gems.ruby-china.com
    
    $ gem install rails
    $ rails -v
    Rails 4.0.3
    
    

    安装数据库

    添加阿里云镜像

    编辑/etc/apt/sources.list文件,

    #sudo vim /etc/apt/sources.list
    

    在文件最前面添加以下条目,操作前请做好相应备份。

    deb http://mirrors.aliyun.com/ubuntu/ precise main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ precise-security main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ precise-updates main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ precise-proposed main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ precise-backports main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ precise main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ precise-security main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ precise-updates main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ precise-proposed main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ precise-backports main restricted universe multiverse
    

    安装MySQL:

    $ sudo apt-get install mysql-server
    
    

    或者PostgreSQL:

    $ sudo apt-get install postgresql postgresql-client libpq-dev
    
    

    安装 Passenger

    # Install our PGP key and add HTTPS support for APT
    $ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 561F9B9CAC40B2F7
    $ sudo apt-get install -y apt-transport-https ca-certificates
     
    # Add our APT repository
    $ sudo sh -c 'echo deb https://oss-binaries.phusionpassenger.com/apt/passenger xenial main > /etc/apt/sources.list.d/passenger.list'
    $ sudo apt-get update
     
    # Install Passenger + Nginx
    $ sudo apt-get install -y nginx-extras passenger
    

    使用which ruby命令,找到ruby所在路径,并根据此路径修改 nginx 配置,编辑 /etc/nginx/nginx.conf

    #sudo vim /etc/nginx/nginx.conf
    

    添加以下两行至http块

        ...    
        http {
            passenger_root /usr/lib/ruby/vendor_ruby/phusion_passenger/locations.ini;
            passenger_ruby /home/deploy/.rvm/wrappers/default/ruby;
        ...
    

    这会打开 Passenger 支持,并且指定使用之前用 rvm 安装的 ruby 版本。

    Git Server

    RoR比较流行的是使用git,我们来配置一下Git Server,首先我们需要新建一个名为git的用户并且为它添加公钥。

    $ sudo adduser git
    $ sudo vi /home/git/.ssh/authorized_keys
    

    配置ssh-keygen

    首先我们打开iTerm2,输入以下命令:

    $ cd ~/.ssh
    $ ssh-keygen -t rsa -C "[email@example.com]"
    Generating public/private rsa key pair.
    Enter file in which to save the key (/Users/you/.ssh/id_rsa): [Press enter]
    $ ssh-add id_rsa
    Enter passphrase (empty for no passphrase): [Type a passphrase]
    Enter same passphrase again: [Type passphrase again]
    Your identification has been saved in /Users/you/.ssh/id_rsa.
    Your public key has been saved in /Users/you/.ssh/id_rsa.pub.
    The key fingerprint is:
    01:0f:f4:3b:ca:85:d6:17:a1:7d:f0:68:9d:f0:a2:db email@example.com
    $ pbcopy < ~/.ssh/id_rsa.pub
    
    

    如果遇到-bash: cd: ~/.ssh: No such file or directory的错误,新建一个.ssh的文件夹即可。

    # mkdir ~/.ssh
    

    这时候我们切换到ssh的Profile,输入以下的命令:

    # mkdir ~/.ssh
    # vi ~/.ssh/authorized_keys
    

    通过vi把刚刚复制到剪贴板的内容粘贴到authorized_keys里,然后保存退出。

    我这里假设你的项目名称是project和准备把git仓库的目录设定为/opt/git,如果你没有一个/opt/git目录,需要切换到root新建并且把这个目录的所有者改为git:

    $ su - root
    # cd /opt
    # mkdir git
    # chown git git
    # ls -all
    # total 4
    # drwxr-xr-x 3 git root 4096 Feb 27 13:50 git
    $ cd /opt/git
    $ mkdir project.git
    $ cd project.git
    $ git --bare init
    

    如果你之前已经有一个Rails项目,那么可以跳过此步骤。

    在本地计算机上,新建一个Rails项目,并且把它纳入git版本管理中:

    $ rails new project --skip-bundle
    $ cd project
    $ git init
    $ git add .
    $ git commit -m 'initial commit'
    

    我们需要添加git remote连接服务器,并且把这个项目push到服务器上去。

    $ git remote add origin git@[ipaddress]:/opt/git/project.git
    $ git push origin master
    Counting objects: 59, done.
    Delta compression using up to 8 threads.
    Compressing objects: 100% (48/48), done.
    Writing objects: 100% (59/59), 13.41 KiB | 0 bytes/s, done.
    Total 59 (delta 2), reused 0 (delta 0)
    To git@[ipaddress]:/opt/git/project.git
     * [new branch]      master -> master
    

    如果你的系统没有报错的话,这个时候我们已经完成了Git Server的部署。

    部署站点

    检查一下swap的大小:

    $ free -m
          total       used       free     shared    buffers     cached
    Mem:           490        405         84          0         12        311
    -/+ buffers/cache:         80        409
    Swap:            0          0          0
    

    如果没有swap,手动创建swap文件:

    $ sudo mkdir /swap
    $ cd /swap
    $ sudo dd if=/dev/zero of=swapfile bs=1024 count=500000
    $ sudo mkswap -f swapfile
    $ sudo swapon swapfile
    

    设置开机自动挂载, 编辑 /etc/fstab

    #sudo vim /etc/fstab 
    

    在最后追加一行

    /swap/swapfile swap swap defaults 0 0
    

    创建站点文件夹:

    $ sudo mkdir -p /var/www/example
    $ sudo chown deploy:deploy /var/www/example
    

    clone 项目文件:

    $ cd /var/www/example
    /var/www/example $ git clone /opt/git/project.git
    

    取决于你的应用,这里需要安装数据库等其他系统组件,例如 PostgreSQL:

    $ sudo apt-get install postgresql libpq-dev
    

    执行 bundle 和 migrate:

    /var/www/example $ cd current
    /var/www/example/current $ bundle install
    /var/www/example/current $ RAILS_ENV=production rake db:create db:migrate
    

    执行 assets precompile:

    /var/www/example/current $ rake assets:precompile
    

    修改 Nginx 配置

    删除原有的默认网站配置:

    $ rm /etc/nginx/sites-enabled/default
    
    

    新建网站配置:

    $ touch /etc/nginx/sites-enabled/example.conf
    
    

    编辑 sudo vim /etc/nginx/sites-enabled/example.conf,写入以下内容:

    server {
        listen 80 default;
        server_name example.com; # 这里填写你真实域名
        root /var/www/example/project/public;
        passenger_enabled on;
    }
    
    

    重启 nginx:

    $ sudo service nginx restart
    
    

    完成

    在浏览器打开服务器的 IP 地址或域名,应该看到你的网站在运行。

    优化

    1. 编辑 sudo vim /etc/nginx/sites-enabled/example.conf,写入以下内容:
    server {
      ...
      passenger_min_instances 6;
      ...
    }
    

    2.编辑 #sudo vim /etc/nginx/nginx.conf
    添加以下至http块

        ...    
        http {
          ...
          passenger_max_pool_size 30;
          passenger_pool_idle_time 90;
          passenger_max_requests 500;
          ...
        }
    

    问题

    解决git Unable to create temporary file ...

    搞计算机的总会莫名奇妙的遇到一些问题,之前做了那么多的项目,突然就出现了,在push 时候抛出这样的错误

    fatal: Unable to create temporary file: Permission denied  
    error: pack-objects died of signal 13  
    

    搜索后,发现也挺频繁的。大致就是这样:

    // 登录git服务器,进入你的项目
    cd your_rep.git  
    chmod -R g+ws *  
    chgrp -R git *  
    git config core.sharedRepository true  
    

    然后再回到你本地目录,输入 git repack master

    相关文章

      网友评论

        本文标题:阿里云Ubuntu 16.04 上使用 Nginx Passen

        本文链接:https://www.haomeiwen.com/subject/usbtmftx.html