On Thu, Nov 20, 2014 at 8:54 AM, Konstantin Kolinko <knst.koli...@gmail.com> wrote:
> 2014-11-19 12:47 GMT+03:00 Nan Ge <genan...@gmail.com>: > > I'm using Apache-httpd-2.4.10(Win64) and apache-tomcat-8.0.12-windows-x64 > > with tomcat-connectors-1.2.40-windows-x86_64-httpd-2.4.x (mod_jk) on > > windows8.1x64 for load balancing, my configuration about mod_jk in > > httpd.conf: > > > > LoadModule jk_module modules/mod_jk.so > > JkWorkersFile conf/workers.properties > > JkLogLevel info > > JkLogStampFormat "[%a %b %d %H:%M:%S %Y] " > > JkLogFile logs/httpd/mod_jk.log > > JkShmFile logs/mod_jk.shm > > JkMount /myapp/* lb > > <Location /jkmanager/> > > JkMount jkstatus > > Order deny,allow > > Deny from all > > Allow from 127.0.0.1 > > </Location> > > > > and here is my workers.properties: > > worker.list= lb,jkstatus > > worker.jkstatus.type=status > > worker.lb.type=lb > > worker.lb.balance_workers=tm1,tm2 > > worker.tm.type=ajp13 > > worker.tm.host=127.0.0.1 > > worker.tm.lbfactor=1 > > worker.tm1.reference=worker.tm > > worker.tm2.reference=worker.tm > > worker.tm1.port=8009 > > worker.tm2.port=8010 > > > > After apache was started, I cannot open the /jkmanager page, I checked > the > > logs/ directory and no mod_jk.shm file was found, and I checked > > mod_jk.log with following error : > > > > [Wed Nov 19 15:40:20 2014] [4296:8648] [info] init_jk::mod_jk.c (3383): > > mod_jk/1.2.40 initialized > > [Wed Nov 19 15:40:20 2014] [4296:8648] [error] jk_shm_open::jk_shm.c > (240): > > Failed to map shared memory > > F:/server/httpd-2.4.10-x64-vc11/Apache24/logs/mod_jk.shm with errno=5 > > [Wed Nov 19 15:40:20 2014] [4296:8648] [error] init_jk::mod_jk.c (3366): > > Initializing shm:(null) errno=5. Load balancing workers will not function > > properly. > > ... > > > > It seems that mod_jk could not create mod_jk.shm file > > Looking at the source code: > > 1) The doc [1] say that JkShmFile option is "Used only on unix platforms." > > The actual code is that > a) On unix platforms it is used always, as documented. > > If no JkShmFile is specified then a warning is printed and the default > name "logs/jk-runtime-status" is used. > > b) On Windows this feature can be used. > It is disabled by default and used only if JkShmFile is set explicitly. > > Question 1: Do you need JkShmFile at all. > > Fixme: If you (or anyone else) succeed in using JkShmFile on Windows > then I think the doc shall be updated to mention the use on Windows. > > On Windows: > If JkShmFile is not set then it results in allocating some block of > memory without any special properties. > > If JkShmFile is set then it does the work with mapped files > (CreateFileMapping and other Win API methods) > > > 2) The CreateFileMapping method that is used to initialize memory > mapping is called in jk_shm.c as > > jk_shm_map = CreateFileMapping(INVALID_HANDLE_VALUE, > jk_get_sa_with_null_dacl(), > PAGE_READWRITE, > 0, > (DWORD)shmsz, > shname); > > See [2] for documentation. Note that > - hFile is INVALID_HANDLE_VALUE > - shname is "Global/" + some string created from filename. > - shmsz is the size that you specified in configuration as JkShmSize. > By default it is calculated automatically, it is usually recommended > to allow it to be calculated automatically. > > It means that: > a) That value of hFile means that there is no "mod_jk.shm" file here. > The mapping is allocated from the system page file. > > Question 2: Do you have system page file enabled? (I think that some > systems may have it disabled). > > > It it is not a file, then you can simplify your configuration: Remove > the "logs/" prefix from the name. > > 3) There may also be some Windows-specific issues, like security > restrictions etc. Some are mentioned in [2]. > > Is "jk_get_sa_with_null_dacl()" used in CreateFileMapping() call a > correct value? > > GetLastError() returning 5 means ERROR_ACCESS_DENIED - from [3]. > > > > Fixme: Can the error message be improved? There is no actual file > here, but it mentions a file name. It is a bit misleading (as one > thinks that it tires to access a file), but it is good as it mentions > the value that actually exists in configuration. > It also does not mention how many bytes it tried to allocate. > It can be something like "Failed to allocate xxx bytes for shared > memory named yyy. GetLastError returned zzz". > > [1] http://tomcat.apache.org/connectors-doc/reference/apache.html > > [2] MSDN - CreateFileMapping function > > http://msdn.microsoft.com/en-us/library/windows/desktop/aa366537%28v=vs.85%29.aspx > > [3] MSDN - System Error Codes > > http://msdn.microsoft.com/en-us/library/windows/desktop/ms681381%28v=vs.85%29.aspx > > > Best regards, > Konstantin Kolinko > > --------------------------------------------------------------------- > To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org > For additional commands, e-mail: users-h...@tomcat.apache.org > > Thanks Kolinko! It has been resolved by Running httpd.exe as Administrator, as you had mentioned that it has something to do with system security restrictions. Now the mod_jk.log shows: "[info] init_jk::mod_jk.c (3383): mod_jk/1.2.40 initialized", and I can access /jkmanager page successfully. I checked the logs/ directory again, 'mod_jk.shm' is still not found, as you said it might have been allocated from the system page file. Thanks for your help! Best regards, Nan Ge