2016-01-12 4 views
1

После того, как я начал изучать локальную разработку Symfony2, я хотел изучить, как развернуть среду для жизни, и я решил попробовать Capistrano 3 и плагин Symfony https://github.com/capistrano/symfony/.Развертывание Symfony2 для производства с использованием Capistrano 3

Я следил за рядом руководств и читал много вопросов и ответов, и я могу получить свои файлы на реальном сервере.

Я использую Dreamhost по совместному плану и имею веб-каталог дома/myusername/mydomain/web. После того, как Capistrano развернуть каталог на дому/MyUserName/MYDOMAIN выглядит следующим образом:

тока/

релизы/

репо/

общий/

TMP/

web/< - это не веб-каталог Symfony, но по умолчанию создан Dreamhost.

Однако, когда я посещаю сайт, ни один из моих маршрутов не работает, я просто получаю 404s. Если я изменяю корень документа из/home/myusername/pickingorganic/web в/home/myusername/pickingorganic /, то я могу получить доступ к моим маршрутам, например, mydomain/current/web/login, но, очевидно, я не хочу, чтобы текущий/веб-сайт для отображения в URL-адресе.

Если я бегу

ls -la mydomain | grep "\->" 

на сервере я могу видеть, что Capistano символическая из текущего каталога, кажется, в месте правильно

current -> /home/myusername/mydomain/releases/20160112132605 

Я полагаю, что мои ошибки где-то в Symfony web/.htaccess (который немодифицирован) или в моих настройках Capistrano. Я поставил их ниже. Любые советы о том, где я ошибаюсь, очень ценятся. Также, если у кого-то есть опыт с плагином Capistrano Symphony, особенно, как правильно настроить приведенные здесь настройки https://github.com/capistrano/symfony/#settings, что было бы фантастически; Я искал примеры или учебные пособия, но на самом деле ничего не понял.

deploy.rb

# config valid only for current version of Capistrano 
lock '3.4.0' 

#set :tmp_dir, "#{fetch(:home)}/tmp" 
set :tmp_dir, "/home/myusername/mydomain/tmp" 

set :application, 'storyproject' 
set :repo_url, '[email protected]:githubid/githubproject-project.git' 

# Default branch is :master 
# ask :branch, `git rev-parse --abbrev-ref HEAD`.chomp 

# Default deploy_to directory is /var/www/my_app_name 
set :deploy_to, '/home/myusername/mydomain' 

# Default value for :scm is :git 
set :scm, :git 

# Default value for :format is :pretty 
# set :format, :pretty 

# Default value for :log_level is :debug 
# set :log_level, :debug 

# Default value for :pty is false 
# set :pty, true 

# Default value for :linked_files is [] 
set :linked_files, fetch(:linked_files, 
[]).push('app/config/parameters.yml') 

# Default value for linked_dirs is [] 
set :linked_dirs, fetch(:linked_dirs, []).push('vendor/bundle') 

# Default value for default_env is {} 
# set :default_env, { path: "/opt/ruby/bin:$PATH" } 

# Default value for keep_releases is 5 
# set :keep_releases, 5 


#namespace :deploy do 

# after :restart, :clear_cache do 
# on roles(:web), in: :groups, limit: 3, wait: 10 do 
    # Here we can do anything such as: 
    # within release_path do 
    # execute :rake, 'cache:clear' 
    # end 
# end 
#end 

#end 

namespace :deploy do 

desc 'composer install' 
task :composer_install do 
    on roles(:web) do 
     within release_path do 
      execute 'composer', 'install', '--no-dev', '--optimize- autoloader' 
     end 
    end 
end 

after :updated, 'deploy:composer_install' 

desc 'Restart application - does nothing, see comments below' 
task :restart do 
    on roles(:app), in: :sequence, wait: 5 do 
     # This is present b/c 'cap production deploy' is blowing up w/o it. 
     # Not sure what's up with that, the Google hasn't helped, and I'm tired 
     # of screwing with it. It stays in for now. 
    end 
end 

end 

production.rb

set :stage, :production 

role :web, %w{[email protected]} 
role :app, %w{[email protected]} 

set :ssh_options, { 
forward_agent: true 
} 


# Symfony environment 
set :symfony_env, "prod" 

# Symfony application path 
set :app_path,    "app" 

# Symfony web path 
set :web_path,    "web" 

# Symfony log path 
set :log_path,    fetch(:app_path) + "/logs" 

# Symfony cache path 
set :cache_path,   fetch(:app_path) + "/cache" 

# Symfony config file path 
set :app_config_path,  fetch(:app_path) + "/config" 

# Controllers to clear 
set :controllers_to_clear, ["app_*.php"] 

# Files that need to remain the same between deploys 
#set :linked_files,   [] 

# Dirs that need to remain the same between deploys (shared dirs) 
set :linked_dirs,   [fetch(:log_path), fetch(:web_path) +  "/uploads"] 

# Dirs that need to be writable by the HTTP Server (i.e. cache, log dirs) 
set :file_permissions_paths,   [fetch(:log_path), fetch(:cache_path)] 

# Name used by the Web Server (i.e. www-data for Apache) 
set :file_permissions_users, ['www-data'] 

# Name used by the Web Server (i.e. www-data for Apache) 
set :webserver_user,  "www-data" 

# Method used to set permissions (:chmod, :acl, or :chgrp) 
set :permission_method,  false 

# Execute set permissions 
set :use_set_permissions, false 

# Symfony console path 
set :symfony_console_path, fetch(:app_path) + "/console" 

# Symfony console flags 
set :symfony_console_flags, "--no-debug" 

# Assets install path 
set :assets_install_path, fetch(:web_path) 

# Assets install flags 
set :assets_install_flags, '--symlink' 

# Assetic dump flags 
set :assetic_dump_flags, '' 

fetch(:default_env).merge!(symfony_env: fetch(:symfony_env)) 

# server-based syntax 
# ====================== 
# Defines a single server with a list of roles and multiple properties. 
# You can define all roles on a single server, or split them: 

# server 'example.com', user: 'deploy', roles: %w{app db web}, my_property: :my_value 
# server 'example.com', user: 'deploy', roles: %w{app web}, other_property: :other_value 
# server 'db.example.com', user: 'deploy', roles: %w{db} 

# role-based syntax 
# ================== 

# Defines a role with one or multiple servers. The primary server in each 
# group is considered to be the first unless any hosts have the primary 
# property set. Specify the username and a domain or IP for the server. 
# Don't use `:all`, it's a meta role. 

# role :app, %w{[email protected]}, my_property: :my_value 
# role :web, %w{[email protected] [email protected]}, other_property: :other_value 
# role :db, %w{[email protected]} 

# Configuration 
# ============= 
# You can set any configuration variable like in config/deploy.rb 
# These variables are then only loaded and set in this stage. 
# For available Capistrano configuration variables see the documentation page. 
# http://capistranorb.com/documentation/getting-started/configuration/ 
# Feel free to add new variables to customise your setup. 


# Custom SSH Options 
# ================== 
# You may pass any option but keep in mind that net/ssh understands a 
# limited set of options, consult the Net::SSH documentation. 
# http://net-ssh.github.io/net-ssh/classes/Net/SSH.html#method-c-start 
# 
# Global options 
# -------------- 
# set :ssh_options, { 
# keys: %w(/home/rlisowski/.ssh/id_rsa), 
# forward_agent: false, 
# auth_methods: %w(password) 
# } 
# 
# The server-based syntax can be used to override options: 
# ------------------------------------ 
# server 'example.com', 
# user: 'user_name', 
# roles: %w{web app}, 
# ssh_options: { 
#  user: 'user_name', # overrides user setting above 
#  keys: %w(/home/user_name/.ssh/id_rsa), 
#  forward_agent: false, 
#  auth_methods: %w(publickey password) 
#  # password: 'please use keys' 
# } 

Symfony веб/.htaccess

# Use the front controller as index file. It serves as a fallback solution when 
# every other rewrite/redirect fails (e.g. in an aliased environment without 
# mod_rewrite). Additionally, this reduces the matching process for the 
# start page (path "/") because otherwise Apache will apply the rewriting rules 
# to each configured DirectoryIndex file (e.g. index.php, index.html, index.pl). 
DirectoryIndex app.php 

# By default, Apache does not evaluate symbolic links if you did not enable this 
# feature in your server configuration. Uncomment the following line if you 
# install assets as symlinks or if you experience problems related to symlinks 
# when compiling LESS/Sass/CoffeScript assets. 
# Options FollowSymlinks 

# Disabling MultiViews prevents unwanted negotiation, e.g. "/app" should not resolve 
# to the front controller "/app.php" but be rewritten to "/app.php/app". 
<IfModule mod_negotiation.c> 
    Options -MultiViews 
</IfModule> 

<IfModule mod_rewrite.c> 
    RewriteEngine On 

# Determine the RewriteBase automatically and set it as environment variable. 
# If you are using Apache aliases to do mass virtual hosting or installed the 
# project in a subdirectory, the base path will be prepended to allow proper 
# resolution of the app.php file and to redirect to the correct URI. It will 
# work in environments without path prefix as well, providing a safe, one-size 
# fits all solution. But as you do not need it in this case, you can comment 
# the following 2 lines to eliminate the overhead. 
RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$ 
RewriteRule ^(.*) - [E=BASE:%1] 

# Sets the HTTP_AUTHORIZATION header removed by apache 
RewriteCond %{HTTP:Authorization} . 
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] 

# Redirect to URI without front controller to prevent duplicate content 
# (with and without `/app.php`). Only do this redirect on the initial 
# rewrite by Apache and not on subsequent cycles. Otherwise we would get an 
# endless redirect loop (request -> rewrite to front controller -> 
# redirect -> request -> ...). 
# So in case you get a "too many redirects" error or you always get redirected 
# to the start page because your Apache does not expose the REDIRECT_STATUS 
# environment variable, you have 2 choices: 
# - disable this feature by commenting the following 2 lines or 
# - use Apache >= 2.3.9 and replace all L flags by END flags and remove the 
# following RewriteCond (best solution) 
RewriteCond %{ENV:REDIRECT_STATUS} ^$ 
RewriteRule ^app\.php(/(.*)|$) %{ENV:BASE}/$2 [R=301,L] 

# If the requested filename exists, simply serve it. 
# We only want to let Apache serve files and not directories. 
RewriteCond %{REQUEST_FILENAME} -f 
RewriteRule .? - [L] 

# Rewrite all other queries to the front controller. 
RewriteRule .? %{ENV:BASE}/app.php [L] 
</IfModule> 

<IfModule !mod_rewrite.c> 
    <IfModule mod_alias.c> 
    # When mod_rewrite is not available, we instruct a temporary redirect of 
    # the start page to the front controller explicitly so that the website 
    # and the generated links can still be used. 
    RedirectMatch 302 ^/$ /app.php/ 
    # RedirectTemp cannot be used instead 
    </IfModule> 
</IfModule> 
+0

Так что просто измените свой корень на '/ home/myusername/pickingorganic/current/web'. Любые проблемы для этого? – malcolm

+0

@malcolm спасибо. да, я могу это сделать, и это работает, но я не думал, что мне нужно будет это сделать, чтобы разместить структуру каталогов. Если это так, Капистрано предлагает вам справиться с этой проблемой, я с удовольствием принимаю ваш ответ как правильный. –

+0

Я никогда не использовал capistrano, но указываю ваш домен на каталог, где основной файл '.php' или' .html' является основой. – malcolm

ответ

0

папках STRU cture выглядит следующим образом:

├── current -> /home/myusername/mydomain/releases/20150120114500/ 
├── releases 
│ ├── 20150080072500 
│ ├── 20150090083000 
│ ├── 20150100093500 
│ ├── 20150110104000 
│ └── 20150120114500 
├── repo 
│ └── <VCS related data> 
├── revisions.log 
└── shared 
    └── <linked_files and linked_dirs> 

Из документации:

ток является символическим указывая на последнюю версию. Эта символическая ссылка обновляется в конце успешного развертывания.Если развертывание завершается с ошибкой на любом шаге, текущая символическая ссылка все еще указывает на старую версию.

Ваш главный app.php файл находится в /home/myusername/mydomain/current/web/app.php, и вы должны указать свой домен именно в этот каталог, в противном случае вы должны добавлять каталоги в пути доступа к этому файлу (например. mydomain.com/myusername/mydomain/current/web).

Просто укажите свой домен на /home/myusername/mydomain/current/web/.

0

С помощью Apache вы должны убедиться, что у вас есть символические ссылки после активации.

<Directory /home/myusername/mydomain> 
    Options FollowSymLinks 
</Directory> 
Смежные вопросы